543 lines
21 KiB
Markdown
543 lines
21 KiB
Markdown
---
|
|
name: particle-system-get
|
|
description: Inspect a `UnityEngine.ParticleSystem` component on a GameObject — runtime state (playing/paused/emitting/stopped, particle count, time) plus opt-in serialized data for any of the ~24 particle modules (Main, Emission, Shape, Velocity, Noise, Collision, Trails, Renderer, etc.). Pair with 'particle-system-modify' to write changes back.
|
|
metadata:
|
|
generated-by: mcp-plugin-dotnet
|
|
---
|
|
|
|
# ParticleSystem / Get
|
|
|
|
Inspect a `UnityEngine.ParticleSystem` component on a GameObject. Returns runtime state (`isPlaying`, `isPaused`, `isEmitting`, `isStopped`, `particleCount`, `time`) plus opt-in serialized data for any of the particle modules. Use 'particle-system-modify' afterwards to write changes back.
|
|
|
|
## Inputs
|
|
|
|
- `gameObjectRef` — the GameObject hosting the `ParticleSystem` component (required).
|
|
- `componentRef` — optional. Resolves a specific `ParticleSystem` when the GameObject has more than one; otherwise the first `ParticleSystem` found is used.
|
|
- `includeMain`, `includeEmission`, `includeShape`, `includeVelocityOverLifetime`, `includeLimitVelocityOverLifetime`, `includeInheritVelocity`, `includeLifetimeByEmitterSpeed`, `includeForceOverLifetime`, `includeColorOverLifetime`, `includeColorBySpeed`, `includeSizeOverLifetime`, `includeSizeBySpeed`, `includeRotationOverLifetime`, `includeRotationBySpeed`, `includeExternalForces`, `includeNoise`, `includeCollision`, `includeTrigger`, `includeSubEmitters`, `includeTextureSheetAnimation`, `includeLights`, `includeTrails`, `includeCustomData`, `includeRenderer` — per-module toggles. `includeMain` defaults to `true`; everything else defaults to `false`.
|
|
- `includeAll` — when `true`, overrides every per-module flag and emits all modules.
|
|
- `deepSerialization` — when `true`, recurses through nested objects via ReflectorNet; otherwise only top-level members are serialized (cheaper, smaller payload).
|
|
|
|
## Behavior
|
|
|
|
Only the modules whose include-flags resolve to `true` are serialized — this keeps responses small when you only need one or two modules. `includeRenderer` reads the sibling `UnityEngine.ParticleSystemRenderer` component on the same GameObject and is skipped silently when no renderer is present. The whole call runs on the Unity main thread.
|
|
|
|
## How to Call
|
|
|
|
```bash
|
|
unity-mcp-cli run-tool particle-system-get --input '{
|
|
"gameObjectRef": "string_value",
|
|
"componentRef": "string_value",
|
|
"includeMain": false,
|
|
"includeEmission": false,
|
|
"includeShape": false,
|
|
"includeVelocityOverLifetime": false,
|
|
"includeLimitVelocityOverLifetime": false,
|
|
"includeInheritVelocity": false,
|
|
"includeLifetimeByEmitterSpeed": false,
|
|
"includeForceOverLifetime": false,
|
|
"includeColorOverLifetime": false,
|
|
"includeColorBySpeed": false,
|
|
"includeSizeOverLifetime": false,
|
|
"includeSizeBySpeed": false,
|
|
"includeRotationOverLifetime": false,
|
|
"includeRotationBySpeed": false,
|
|
"includeExternalForces": false,
|
|
"includeNoise": false,
|
|
"includeCollision": false,
|
|
"includeTrigger": false,
|
|
"includeSubEmitters": false,
|
|
"includeTextureSheetAnimation": false,
|
|
"includeLights": false,
|
|
"includeTrails": false,
|
|
"includeCustomData": false,
|
|
"includeRenderer": false,
|
|
"includeAll": false,
|
|
"deepSerialization": false
|
|
}'
|
|
```
|
|
|
|
> For complex input (multi-line strings, code), save the JSON to a file and use:
|
|
> ```bash
|
|
> unity-mcp-cli run-tool particle-system-get --input-file args.json
|
|
> ```
|
|
>
|
|
> Or pipe via stdin (recommended):
|
|
> ```bash
|
|
> unity-mcp-cli run-tool particle-system-get --input-file - <<'EOF'
|
|
> {"param": "value"}
|
|
> EOF
|
|
> ```
|
|
|
|
|
|
### Troubleshooting
|
|
|
|
If `unity-mcp-cli` is not found, either install it globally (`npm install -g unity-mcp-cli`) or use `npx unity-mcp-cli` instead.
|
|
Read the /unity-initial-setup skill for detailed installation instructions.
|
|
|
|
## Input
|
|
|
|
| Name | Type | Required | Description |
|
|
|------|------|----------|-------------|
|
|
| `gameObjectRef` | `any` | Yes | Reference to the GameObject containing the ParticleSystem component. |
|
|
| `componentRef` | `any` | No | Optional reference to a specific ParticleSystem component if the GameObject has multiple. If not provided, uses the first ParticleSystem found. |
|
|
| `includeMain` | `boolean` | No | Include Main module data (duration, looping, prewarm, startDelay, startLifetime, startSpeed, startSize, startRotation, startColor, gravityModifier, simulationSpace, scalingMode, playOnAwake, maxParticles, etc.). |
|
|
| `includeEmission` | `boolean` | No | Include Emission module data (rateOverTime, rateOverDistance, bursts). |
|
|
| `includeShape` | `boolean` | No | Include Shape module data (shapeType, radius, angle, arc, position, rotation, scale, mesh, texture, etc.). |
|
|
| `includeVelocityOverLifetime` | `boolean` | No | Include Velocity over Lifetime module data (x, y, z, space, orbital, radial, speedModifier). |
|
|
| `includeLimitVelocityOverLifetime` | `boolean` | No | Include Limit Velocity over Lifetime module data (limit, dampen, separateAxes, drag). |
|
|
| `includeInheritVelocity` | `boolean` | No | Include Inherit Velocity module data (mode, curve). |
|
|
| `includeLifetimeByEmitterSpeed` | `boolean` | No | Include Lifetime by Emitter Speed module data (curve, range). |
|
|
| `includeForceOverLifetime` | `boolean` | No | Include Force over Lifetime module data (x, y, z, space, randomized). |
|
|
| `includeColorOverLifetime` | `boolean` | No | Include Color over Lifetime module data (color gradient). |
|
|
| `includeColorBySpeed` | `boolean` | No | Include Color by Speed module data (color, range). |
|
|
| `includeSizeOverLifetime` | `boolean` | No | Include Size over Lifetime module data (size curve, separateAxes). |
|
|
| `includeSizeBySpeed` | `boolean` | No | Include Size by Speed module data (size, range). |
|
|
| `includeRotationOverLifetime` | `boolean` | No | Include Rotation over Lifetime module data (angular velocity, separateAxes). |
|
|
| `includeRotationBySpeed` | `boolean` | No | Include Rotation by Speed module data (angular velocity, range). |
|
|
| `includeExternalForces` | `boolean` | No | Include External Forces module data (multiplier, influenceFilter). |
|
|
| `includeNoise` | `boolean` | No | Include Noise module data (strength, frequency, scrollSpeed, damping, octaves, quality, remap). |
|
|
| `includeCollision` | `boolean` | No | Include Collision module data (type, mode, planes, dampen, bounce, lifetimeLoss). |
|
|
| `includeTrigger` | `boolean` | No | Include Trigger module data (inside, outside, enter, exit actions). |
|
|
| `includeSubEmitters` | `boolean` | No | Include Sub Emitters module data (birth, collision, death, trigger, manual emitters). |
|
|
| `includeTextureSheetAnimation` | `boolean` | No | Include Texture Sheet Animation module data (mode, tiles, animation, frameOverTime). |
|
|
| `includeLights` | `boolean` | No | Include Lights module data (ratio, light, color, range, intensity). |
|
|
| `includeTrails` | `boolean` | No | Include Trails module data (mode, ratio, lifetime, width, color). |
|
|
| `includeCustomData` | `boolean` | No | Include Custom Data module data (modes, vectors, colors). |
|
|
| `includeRenderer` | `boolean` | No | Include Renderer module data (renderMode, material, sortMode, alignment, shadows). |
|
|
| `includeAll` | `boolean` | No | Include ALL modules data. Overrides individual flags. |
|
|
| `deepSerialization` | `boolean` | No | Performs deep serialization including all nested objects. Otherwise, only serializes top-level members. |
|
|
|
|
### Input JSON Schema
|
|
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"gameObjectRef": {
|
|
"$ref": "#/$defs/AIGD.GameObjectRef"
|
|
},
|
|
"componentRef": {
|
|
"$ref": "#/$defs/AIGD.ComponentRef"
|
|
},
|
|
"includeMain": {
|
|
"type": "boolean"
|
|
},
|
|
"includeEmission": {
|
|
"type": "boolean"
|
|
},
|
|
"includeShape": {
|
|
"type": "boolean"
|
|
},
|
|
"includeVelocityOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeLimitVelocityOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeInheritVelocity": {
|
|
"type": "boolean"
|
|
},
|
|
"includeLifetimeByEmitterSpeed": {
|
|
"type": "boolean"
|
|
},
|
|
"includeForceOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeColorOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeColorBySpeed": {
|
|
"type": "boolean"
|
|
},
|
|
"includeSizeOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeSizeBySpeed": {
|
|
"type": "boolean"
|
|
},
|
|
"includeRotationOverLifetime": {
|
|
"type": "boolean"
|
|
},
|
|
"includeRotationBySpeed": {
|
|
"type": "boolean"
|
|
},
|
|
"includeExternalForces": {
|
|
"type": "boolean"
|
|
},
|
|
"includeNoise": {
|
|
"type": "boolean"
|
|
},
|
|
"includeCollision": {
|
|
"type": "boolean"
|
|
},
|
|
"includeTrigger": {
|
|
"type": "boolean"
|
|
},
|
|
"includeSubEmitters": {
|
|
"type": "boolean"
|
|
},
|
|
"includeTextureSheetAnimation": {
|
|
"type": "boolean"
|
|
},
|
|
"includeLights": {
|
|
"type": "boolean"
|
|
},
|
|
"includeTrails": {
|
|
"type": "boolean"
|
|
},
|
|
"includeCustomData": {
|
|
"type": "boolean"
|
|
},
|
|
"includeRenderer": {
|
|
"type": "boolean"
|
|
},
|
|
"includeAll": {
|
|
"type": "boolean"
|
|
},
|
|
"deepSerialization": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"$defs": {
|
|
"UnityEngine.EntityId": {
|
|
"type": "string",
|
|
"pattern": "^[0-9]+$"
|
|
},
|
|
"System.Type": {
|
|
"type": "string"
|
|
},
|
|
"AIGD.GameObjectRef": {
|
|
"type": "object",
|
|
"properties": {
|
|
"instanceID": {
|
|
"$ref": "#/$defs/UnityEngine.EntityId",
|
|
"description": "instanceID of the UnityEngine.Object. If it is '0' and 'path', 'name', 'assetPath' and 'assetGuid' is not provided, empty or null, then it will be used as 'null'. Priority: 1 (Recommended)"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Path of a GameObject in the hierarchy Sample 'character/hand/finger/particle'. Priority: 2."
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of a GameObject in hierarchy. Priority: 3."
|
|
},
|
|
"assetType": {
|
|
"$ref": "#/$defs/System.Type",
|
|
"description": "Type of the asset."
|
|
},
|
|
"assetPath": {
|
|
"type": "string",
|
|
"description": "Path to the asset within the project. Starts with 'Assets/'"
|
|
},
|
|
"assetGuid": {
|
|
"type": "string",
|
|
"description": "Unique identifier for the asset."
|
|
}
|
|
},
|
|
"required": [
|
|
"instanceID"
|
|
],
|
|
"description": "Find GameObject in opened Prefab or in the active Scene."
|
|
},
|
|
"AIGD.ComponentRef": {
|
|
"type": "object",
|
|
"properties": {
|
|
"index": {
|
|
"type": "integer",
|
|
"description": "Component 'index' attached to a gameObject. The first index is '0' and that is usually Transform or RectTransform. Priority: 2. Default value is -1."
|
|
},
|
|
"typeName": {
|
|
"type": "string",
|
|
"description": "Component type full name. Sample 'UnityEngine.Transform'. If the gameObject has two components of the same type, the output component is unpredictable. Priority: 3. Default value is null."
|
|
},
|
|
"instanceID": {
|
|
"$ref": "#/$defs/UnityEngine.EntityId",
|
|
"description": "instanceID of the UnityEngine.Object. If this is '0', then it will be used as 'null'."
|
|
}
|
|
},
|
|
"required": [
|
|
"index",
|
|
"instanceID"
|
|
],
|
|
"description": "Component reference. Used to find a Component at GameObject."
|
|
}
|
|
},
|
|
"required": [
|
|
"gameObjectRef"
|
|
]
|
|
}
|
|
```
|
|
|
|
## Output
|
|
|
|
### Output JSON Schema
|
|
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"result": {
|
|
"$ref": "#/$defs/com.IvanMurzak.Unity.MCP.ParticleSystem.Editor.GetParticleSystemResponse",
|
|
"description": "Response containing ParticleSystem data with requested modules."
|
|
}
|
|
},
|
|
"$defs": {
|
|
"AIGD.GameObjectRef": {
|
|
"type": "object",
|
|
"properties": {
|
|
"instanceID": {
|
|
"$ref": "#/$defs/UnityEngine.EntityId",
|
|
"description": "instanceID of the UnityEngine.Object. If it is '0' and 'path', 'name', 'assetPath' and 'assetGuid' is not provided, empty or null, then it will be used as 'null'. Priority: 1 (Recommended)"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Path of a GameObject in the hierarchy Sample 'character/hand/finger/particle'. Priority: 2."
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of a GameObject in hierarchy. Priority: 3."
|
|
},
|
|
"assetType": {
|
|
"$ref": "#/$defs/System.Type",
|
|
"description": "Type of the asset."
|
|
},
|
|
"assetPath": {
|
|
"type": "string",
|
|
"description": "Path to the asset within the project. Starts with 'Assets/'"
|
|
},
|
|
"assetGuid": {
|
|
"type": "string",
|
|
"description": "Unique identifier for the asset."
|
|
}
|
|
},
|
|
"required": [
|
|
"instanceID"
|
|
],
|
|
"description": "Find GameObject in opened Prefab or in the active Scene."
|
|
},
|
|
"UnityEngine.EntityId": {
|
|
"type": "string",
|
|
"pattern": "^[0-9]+$"
|
|
},
|
|
"System.Type": {
|
|
"type": "string"
|
|
},
|
|
"AIGD.ComponentRef": {
|
|
"type": "object",
|
|
"properties": {
|
|
"index": {
|
|
"type": "integer",
|
|
"description": "Component 'index' attached to a gameObject. The first index is '0' and that is usually Transform or RectTransform. Priority: 2. Default value is -1."
|
|
},
|
|
"typeName": {
|
|
"type": "string",
|
|
"description": "Component type full name. Sample 'UnityEngine.Transform'. If the gameObject has two components of the same type, the output component is unpredictable. Priority: 3. Default value is null."
|
|
},
|
|
"instanceID": {
|
|
"$ref": "#/$defs/UnityEngine.EntityId",
|
|
"description": "instanceID of the UnityEngine.Object. If this is '0', then it will be used as 'null'."
|
|
}
|
|
},
|
|
"required": [
|
|
"index",
|
|
"instanceID"
|
|
],
|
|
"description": "Component reference. Used to find a Component at GameObject."
|
|
},
|
|
"com.IvanMurzak.ReflectorNet.Model.SerializedMember": {
|
|
"type": "object",
|
|
"properties": {
|
|
"typeName": {
|
|
"type": "string",
|
|
"description": "Full type name. Eg: 'System.String', 'System.Int32', 'UnityEngine.Vector3', etc."
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Object name."
|
|
},
|
|
"value": {
|
|
"description": "Value of the object, serialized as a non stringified JSON element. Can be null if the value is not set. Can be default value if the value is an empty object or array json."
|
|
},
|
|
"fields": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Nested field value."
|
|
},
|
|
"description": "Fields of the object, serialized as a list of 'SerializedMember'."
|
|
},
|
|
"props": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Nested property value."
|
|
},
|
|
"description": "Properties of the object, serialized as a list of 'SerializedMember'."
|
|
}
|
|
},
|
|
"required": [
|
|
"typeName"
|
|
],
|
|
"additionalProperties": false
|
|
},
|
|
"com.IvanMurzak.ReflectorNet.Model.SerializedMemberList": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember"
|
|
}
|
|
},
|
|
"com.IvanMurzak.Unity.MCP.ParticleSystem.Editor.GetParticleSystemResponse": {
|
|
"type": "object",
|
|
"properties": {
|
|
"gameObjectRef": {
|
|
"$ref": "#/$defs/AIGD.GameObjectRef",
|
|
"description": "Reference to the GameObject containing the ParticleSystem component."
|
|
},
|
|
"componentRef": {
|
|
"$ref": "#/$defs/AIGD.ComponentRef",
|
|
"description": "Reference to the ParticleSystem component."
|
|
},
|
|
"componentIndex": {
|
|
"type": "integer",
|
|
"description": "Index of the ParticleSystem component in the GameObject's component list."
|
|
},
|
|
"isPlaying": {
|
|
"type": "boolean",
|
|
"description": "Whether the ParticleSystem is currently playing."
|
|
},
|
|
"isPaused": {
|
|
"type": "boolean",
|
|
"description": "Whether the ParticleSystem is currently paused."
|
|
},
|
|
"isEmitting": {
|
|
"type": "boolean",
|
|
"description": "Whether the ParticleSystem is currently emitting."
|
|
},
|
|
"isStopped": {
|
|
"type": "boolean",
|
|
"description": "Whether the ParticleSystem is currently stopped."
|
|
},
|
|
"particleCount": {
|
|
"type": "integer",
|
|
"description": "Current particle count."
|
|
},
|
|
"time": {
|
|
"type": "number",
|
|
"description": "Current simulation time."
|
|
},
|
|
"main": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Main module data."
|
|
},
|
|
"emission": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Emission module data."
|
|
},
|
|
"shape": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Shape module data."
|
|
},
|
|
"velocityOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Velocity over Lifetime module data."
|
|
},
|
|
"limitVelocityOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Limit Velocity over Lifetime module data."
|
|
},
|
|
"inheritVelocity": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Inherit Velocity module data."
|
|
},
|
|
"lifetimeByEmitterSpeed": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Lifetime by Emitter Speed module data."
|
|
},
|
|
"forceOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Force over Lifetime module data."
|
|
},
|
|
"colorOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Color over Lifetime module data."
|
|
},
|
|
"colorBySpeed": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Color by Speed module data."
|
|
},
|
|
"sizeOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Size over Lifetime module data."
|
|
},
|
|
"sizeBySpeed": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Size by Speed module data."
|
|
},
|
|
"rotationOverLifetime": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Rotation over Lifetime module data."
|
|
},
|
|
"rotationBySpeed": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Rotation by Speed module data."
|
|
},
|
|
"externalForces": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "External Forces module data."
|
|
},
|
|
"noise": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Noise module data."
|
|
},
|
|
"collision": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Collision module data."
|
|
},
|
|
"trigger": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Trigger module data."
|
|
},
|
|
"subEmitters": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Sub Emitters module data."
|
|
},
|
|
"textureSheetAnimation": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Texture Sheet Animation module data."
|
|
},
|
|
"lights": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Lights module data."
|
|
},
|
|
"trails": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Trails module data."
|
|
},
|
|
"customData": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Custom Data module data."
|
|
},
|
|
"renderer": {
|
|
"$ref": "#/$defs/com.IvanMurzak.ReflectorNet.Model.SerializedMember",
|
|
"description": "Renderer module data."
|
|
}
|
|
},
|
|
"required": [
|
|
"componentIndex",
|
|
"isPlaying",
|
|
"isPaused",
|
|
"isEmitting",
|
|
"isStopped",
|
|
"particleCount",
|
|
"time"
|
|
],
|
|
"description": "Response containing ParticleSystem data with requested modules."
|
|
}
|
|
},
|
|
"required": [
|
|
"result"
|
|
]
|
|
}
|
|
```
|
|
|