From 17bc98abaf118c1e6a043ba7f8e024be9783cf82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Oct 2026 00:18:39 +0000 Subject: [PATCH] feat: Updated OpenAPI spec --- ...ient.AiTalkingPhotoCreateTalkingPhoto.g.cs | 4 ++-- ...ProjectsClient.TextToVideoCreateVideo.g.cs | 11 +++++++++- ....Models.TextToVideoCreateVideoRequest.g.cs | 20 +++++++++++++++++-- ...ient.AiTalkingPhotoCreateTalkingPhoto.g.cs | 4 ++-- ...ProjectsClient.TextToVideoCreateVideo.g.cs | 11 +++++++++- src/libs/MagicHour/openapi.yaml | 17 ++++++++-------- 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs b/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs index a2fa845..06414ec 100644 --- a/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs +++ b/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs @@ -20,7 +20,7 @@ public partial interface IVideoProjectsClient /// --header 'content-type: application/json' \
/// --data '
/// {
- /// "name": "My Talking Photo image",
+ /// "name": "My Talking Photo video",
/// "start_seconds": 0,
/// "end_seconds": 15,
/// "assets": {
@@ -56,7 +56,7 @@ public partial interface IVideoProjectsClient /// --header 'content-type: application/json' \
/// --data '
/// {
- /// "name": "My Talking Photo image",
+ /// "name": "My Talking Photo video",
/// "start_seconds": 0,
/// "end_seconds": 15,
/// "assets": {
diff --git a/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.TextToVideoCreateVideo.g.cs b/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.TextToVideoCreateVideo.g.cs index bc8215a..938b740 100644 --- a/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.TextToVideoCreateVideo.g.cs +++ b/src/libs/MagicHour/Generated/MagicHour.IVideoProjectsClient.TextToVideoCreateVideo.g.cs @@ -229,7 +229,16 @@ public partial interface IVideoProjectsClient /// Example: true /// /// - /// + /// + /// Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.
+ /// Supported models and reference media:
+ /// * **`kling-3.0`**: Supports images, videos.
+ /// * **`minimax-h3`**: Supports images, videos, audio.
+ /// * **`seedance-2.0`**: Supports images, videos, audio.
+ /// * **`seedance-2.0-mini`**: Supports images, videos, audio.
+ /// * **`seedance-2.5`**: Supports images, videos, audio.
+ /// * **`wan-3.0`**: Supports images, videos, audio. + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// diff --git a/src/libs/MagicHour/Generated/MagicHour.Models.TextToVideoCreateVideoRequest.g.cs b/src/libs/MagicHour/Generated/MagicHour.Models.TextToVideoCreateVideoRequest.g.cs index a278136..927ae3c 100644 --- a/src/libs/MagicHour/Generated/MagicHour.Models.TextToVideoCreateVideoRequest.g.cs +++ b/src/libs/MagicHour/Generated/MagicHour.Models.TextToVideoCreateVideoRequest.g.cs @@ -138,7 +138,14 @@ public sealed partial class TextToVideoCreateVideoRequest public required global::MagicHour.TextToVideoCreateVideoRequestStyle Style { get; set; } /// - /// + /// Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.
+ /// Supported models and reference media:
+ /// * **`kling-3.0`**: Supports images, videos.
+ /// * **`minimax-h3`**: Supports images, videos, audio.
+ /// * **`seedance-2.0`**: Supports images, videos, audio.
+ /// * **`seedance-2.0-mini`**: Supports images, videos, audio.
+ /// * **`seedance-2.5`**: Supports images, videos, audio.
+ /// * **`wan-3.0`**: Supports images, videos, audio. ///
[global::System.Text.Json.Serialization.JsonPropertyName("references")] public global::System.Collections.Generic.IList? References { get; set; } @@ -247,7 +254,16 @@ public sealed partial class TextToVideoCreateVideoRequest /// * **`wan-3.0`**: Toggle-able: no additional credits for audio
/// Example: true /// - /// + /// + /// Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.
+ /// Supported models and reference media:
+ /// * **`kling-3.0`**: Supports images, videos.
+ /// * **`minimax-h3`**: Supports images, videos, audio.
+ /// * **`seedance-2.0`**: Supports images, videos, audio.
+ /// * **`seedance-2.0-mini`**: Supports images, videos, audio.
+ /// * **`seedance-2.5`**: Supports images, videos, audio.
+ /// * **`wan-3.0`**: Supports images, videos, audio. + /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif diff --git a/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs b/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs index ee68808..40390bc 100644 --- a/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs +++ b/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.AiTalkingPhotoCreateTalkingPhoto.g.cs @@ -57,7 +57,7 @@ partial void ProcessAiTalkingPhotoCreateTalkingPhotoResponseContent( /// --header 'content-type: application/json' \
/// --data '
/// {
- /// "name": "My Talking Photo image",
+ /// "name": "My Talking Photo video",
/// "start_seconds": 0,
/// "end_seconds": 15,
/// "assets": {
@@ -103,7 +103,7 @@ partial void ProcessAiTalkingPhotoCreateTalkingPhotoResponseContent( /// --header 'content-type: application/json' \
/// --data '
/// {
- /// "name": "My Talking Photo image",
+ /// "name": "My Talking Photo video",
/// "start_seconds": 0,
/// "end_seconds": 15,
/// "assets": {
diff --git a/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.TextToVideoCreateVideo.g.cs b/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.TextToVideoCreateVideo.g.cs index 6136632..3abff40 100644 --- a/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.TextToVideoCreateVideo.g.cs +++ b/src/libs/MagicHour/Generated/MagicHour.VideoProjectsClient.TextToVideoCreateVideo.g.cs @@ -854,7 +854,16 @@ partial void ProcessTextToVideoCreateVideoResponseContent( /// Example: true /// /// - /// + /// + /// Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.
+ /// Supported models and reference media:
+ /// * **`kling-3.0`**: Supports images, videos.
+ /// * **`minimax-h3`**: Supports images, videos, audio.
+ /// * **`seedance-2.0`**: Supports images, videos, audio.
+ /// * **`seedance-2.0-mini`**: Supports images, videos, audio.
+ /// * **`seedance-2.5`**: Supports images, videos, audio.
+ /// * **`wan-3.0`**: Supports images, videos, audio. + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// diff --git a/src/libs/MagicHour/openapi.yaml b/src/libs/MagicHour/openapi.yaml index 16608ec..fae8f15 100644 --- a/src/libs/MagicHour/openapi.yaml +++ b/src/libs/MagicHour/openapi.yaml @@ -1800,23 +1800,23 @@ }, { "lang": "go", - "source": "package main\n\nimport (\n\tos \"os\"\n\n\tsdk \"github.com/magichourhq/magic-hour-go/client\"\n\tnullable \"github.com/magichourhq/magic-hour-go/nullable\"\n\tai_talking_photo \"github.com/magichourhq/magic-hour-go/resources/v1/ai_talking_photo\"\n\ttypes \"github.com/magichourhq/magic-hour-go/types\"\n)\n\nfunc main() {\n\tclient := sdk.NewClient(\n\t\tsdk.WithBearerAuth(os.Getenv(\"MAGIC_HOUR_API_KEY\")),\n\t)\n\tres, err := client.V1.AiTalkingPhoto.Create(ai_talking_photo.CreateRequest{\n\t\tAssets: types.V1AiTalkingPhotoCreateBodyAssets{\n\t\t\tAudioFilePath: \"api-assets/id/1234.mp3\",\n\t\t\tImageFilePath: \"api-assets/id/1234.png\",\n\t\t},\n\t\tEndSeconds: 15.0,\n\t\tMaxResolution: nullable.NewValue(1024),\n\t\tName: nullable.NewValue(\"My Talking Photo image\"),\n\t\tStartSeconds: 0.0,\n\t})\n}" + "source": "package main\n\nimport (\n\tos \"os\"\n\n\tsdk \"github.com/magichourhq/magic-hour-go/client\"\n\tnullable \"github.com/magichourhq/magic-hour-go/nullable\"\n\tai_talking_photo \"github.com/magichourhq/magic-hour-go/resources/v1/ai_talking_photo\"\n\ttypes \"github.com/magichourhq/magic-hour-go/types\"\n)\n\nfunc main() {\n\tclient := sdk.NewClient(\n\t\tsdk.WithBearerAuth(os.Getenv(\"MAGIC_HOUR_API_KEY\")),\n\t)\n\tres, err := client.V1.AiTalkingPhoto.Create(ai_talking_photo.CreateRequest{\n\t\tAssets: types.V1AiTalkingPhotoCreateBodyAssets{\n\t\t\tAudioFilePath: \"api-assets/id/1234.mp3\",\n\t\t\tImageFilePath: \"api-assets/id/1234.png\",\n\t\t},\n\t\tEndSeconds: 15.0,\n\t\tMaxResolution: nullable.NewValue(1024),\n\t\tName: nullable.NewValue(\"My Talking Photo video\"),\n\t\tStartSeconds: 0.0,\n\t})\n}" }, { "lang": "rust", - "source": "let client = magic_hour::Client::default()\n .with_bearer_auth(&std::env::var(\"MAGIC_HOUR_API_KEY\").unwrap());\nlet res = client\n .v1()\n .ai_talking_photo()\n .create(magic_hour::resources::v1::ai_talking_photo::CreateRequest {\n assets: magic_hour::models::V1AiTalkingPhotoCreateBodyAssets {\n audio_file_path: \"api-assets/id/1234.mp3\".to_string(),\n image_file_path: \"api-assets/id/1234.png\".to_string(),\n },\n end_seconds: 15.0,\n max_resolution: Some(1024),\n name: Some(\"My Talking Photo image\".to_string()),\n start_seconds: 0.0,\n ..Default::default()\n })\n .await;" + "source": "let client = magic_hour::Client::default()\n .with_bearer_auth(&std::env::var(\"MAGIC_HOUR_API_KEY\").unwrap());\nlet res = client\n .v1()\n .ai_talking_photo()\n .create(magic_hour::resources::v1::ai_talking_photo::CreateRequest {\n assets: magic_hour::models::V1AiTalkingPhotoCreateBodyAssets {\n audio_file_path: \"api-assets/id/1234.mp3\".to_string(),\n image_file_path: \"api-assets/id/1234.png\".to_string(),\n },\n end_seconds: 15.0,\n max_resolution: Some(1024),\n name: Some(\"My Talking Photo video\".to_string()),\n start_seconds: 0.0,\n ..Default::default()\n })\n .await;" }, { "lang": "curl", - "source": "curl --request POST \\\n --url https://api.magichour.ai/v1/ai-talking-photo \\\n --header 'accept: application/json' \\\n --header \"authorization: Bearer $MAGIC_HOUR_API_KEY\" \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"name\": \"My Talking Photo image\",\n \"start_seconds\": 0,\n \"end_seconds\": 15,\n \"assets\": {\n \"image_file_path\": \"api-assets/id/1234.png\",\n \"audio_file_path\": \"api-assets/id/1234.mp3\"\n },\n \"style\": {\n \"generation_mode\": \"realistic\",\n \"prompt\": \"string\"\n },\n \"max_resolution\": 1024\n}\n'" + "source": "curl --request POST \\\n --url https://api.magichour.ai/v1/ai-talking-photo \\\n --header 'accept: application/json' \\\n --header \"authorization: Bearer $MAGIC_HOUR_API_KEY\" \\\n --header 'content-type: application/json' \\\n --data '\n{\n \"name\": \"My Talking Photo video\",\n \"start_seconds\": 0,\n \"end_seconds\": 15,\n \"assets\": {\n \"image_file_path\": \"api-assets/id/1234.png\",\n \"audio_file_path\": \"api-assets/id/1234.mp3\"\n },\n \"style\": {\n \"generation_mode\": \"realistic\",\n \"prompt\": \"string\"\n },\n \"max_resolution\": 1024\n}\n'" }, { "lang": "php", - "source": " \"https://api.magichour.ai/v1/ai-talking-photo\",\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_ENCODING => \"\",\n CURLOPT_MAXREDIRS => 10,\n CURLOPT_TIMEOUT => 30,\n CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n CURLOPT_CUSTOMREQUEST => \"POST\",\n CURLOPT_POSTFIELDS => json_encode([\n 'name' => 'My Talking Photo image',\n 'start_seconds' => 0,\n 'end_seconds' => 15,\n 'assets' => [\n 'image_file_path' => 'api-assets/id/1234.png',\n 'audio_file_path' => 'api-assets/id/1234.mp3'\n ],\n 'style' => [\n 'generation_mode' => 'realistic',\n 'prompt' => 'string'\n ],\n 'max_resolution' => 1024\n ]),\n CURLOPT_HTTPHEADER => [\n \"accept: application/json\",\n \"authorization: Bearer \",\n \"content-type: application/json\"\n ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n echo \"cURL Error #:\" . $err;\n} else {\n echo $response;\n}" + "source": " \"https://api.magichour.ai/v1/ai-talking-photo\",\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_ENCODING => \"\",\n CURLOPT_MAXREDIRS => 10,\n CURLOPT_TIMEOUT => 30,\n CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n CURLOPT_CUSTOMREQUEST => \"POST\",\n CURLOPT_POSTFIELDS => json_encode([\n 'name' => 'My Talking Photo video',\n 'start_seconds' => 0,\n 'end_seconds' => 15,\n 'assets' => [\n 'image_file_path' => 'api-assets/id/1234.png',\n 'audio_file_path' => 'api-assets/id/1234.mp3'\n ],\n 'style' => [\n 'generation_mode' => 'realistic',\n 'prompt' => 'string'\n ],\n 'max_resolution' => 1024\n ]),\n CURLOPT_HTTPHEADER => [\n \"accept: application/json\",\n \"authorization: Bearer \",\n \"content-type: application/json\"\n ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n echo \"cURL Error #:\" . $err;\n} else {\n echo $response;\n}" }, { "lang": "java", - "source": "HttpResponse response = Unirest.post(\"https://api.magichour.ai/v1/ai-talking-photo\")\n .header(\"accept\", \"application/json\")\n .header(\"content-type\", \"application/json\")\n .header(\"authorization\", \"Bearer \")\n .body(\"{\\\"name\\\":\\\"My Talking Photo image\\\",\\\"start_seconds\\\":0,\\\"end_seconds\\\":15,\\\"assets\\\":{\\\"image_file_path\\\":\\\"api-assets/id/1234.png\\\",\\\"audio_file_path\\\":\\\"api-assets/id/1234.mp3\\\"},\\\"style\\\":{\\\"generation_mode\\\":\\\"realistic\\\",\\\"prompt\\\":\\\"string\\\"},\\\"max_resolution\\\":1024}\")\n .asString();" + "source": "HttpResponse response = Unirest.post(\"https://api.magichour.ai/v1/ai-talking-photo\")\n .header(\"accept\", \"application/json\")\n .header(\"content-type\", \"application/json\")\n .header(\"authorization\", \"Bearer \")\n .body(\"{\\\"name\\\":\\\"My Talking Photo video\\\",\\\"start_seconds\\\":0,\\\"end_seconds\\\":15,\\\"assets\\\":{\\\"image_file_path\\\":\\\"api-assets/id/1234.png\\\",\\\"audio_file_path\\\":\\\"api-assets/id/1234.mp3\\\"},\\\"style\\\":{\\\"generation_mode\\\":\\\"realistic\\\",\\\"prompt\\\":\\\"string\\\"},\\\"max_resolution\\\":1024}\")\n .asString();" } ] } @@ -3603,11 +3603,11 @@ }, { "lang": "go", - "source": "package main\n\nimport (\n\tos \"os\"\n\n\tsdk \"github.com/magichourhq/magic-hour-go/client\"\n\tnullable \"github.com/magichourhq/magic-hour-go/nullable\"\n\tcharacter_replace \"github.com/magichourhq/magic-hour-go/resources/v1/character_replace\"\n\ttypes \"github.com/magichourhq/magic-hour-go/types\"\n)\n\nfunc main() {\n\tclient := sdk.NewClient(\n\t\tsdk.WithBearerAuth(os.Getenv(\"MAGIC_HOUR_API_KEY\")),\n\t)\n\tres, err := client.V1.CharacterReplace.Create(character_replace.CreateRequest{\n\t\tAssets: types.V1CharacterReplaceCreateBodyAssets{\n\t\t\tImageFilePath: \"api-assets/id/5678.png\",\n\t\t\tVideoFilePath: \"api-assets/id/1234.mp4\",\n\t\t},\n\t\tEndSeconds: 15.0,\n\t\tName: nullable.NewValue(\"My Character Replace video\"),\n\t\tResolution: nullable.NewValue(types.V1CharacterReplaceCreateBodyResolutionEnum720p),\n\t\tStartSeconds: nullable.NewValue(0.0),\n\t\tStyle: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyle{\n\t\t\tMode: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyleModeEnumReplace),\n\t\t\tSelectionMode: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyleSelectionModeEnumAuto),\n\t\t}),\n\t})\n}" + "source": "package main\n\nimport (\n\tos \"os\"\n\n\tsdk \"github.com/magichourhq/magic-hour-go/client\"\n\tnullable \"github.com/magichourhq/magic-hour-go/nullable\"\n\tcharacter_replace \"github.com/magichourhq/magic-hour-go/resources/v1/character_replace\"\n\ttypes \"github.com/magichourhq/magic-hour-go/types\"\n)\n\nfunc main() {\n\tclient := sdk.NewClient(\n\t\tsdk.WithBearerAuth(os.Getenv(\"MAGIC_HOUR_API_KEY\")),\n\t)\n\tres, err := client.V1.CharacterReplace.Create(character_replace.CreateRequest{\n\t\tAssets: types.V1CharacterReplaceCreateBodyAssets{\n\t\t\tImageFilePath: \"api-assets/id/5678.png\",\n\t\t\tVideoFilePath: \"api-assets/id/1234.mp4\",\n\t\t},\n\t\tEndSeconds: 15.0,\n\t\tModel: nullable.NewValue(types.V1CharacterReplaceCreateBodyModelEnumWanAnimate),\n\t\tName: nullable.NewValue(\"My Character Replace video\"),\n\t\tResolution: nullable.NewValue(types.V1CharacterReplaceCreateBodyResolutionEnum720p),\n\t\tStartSeconds: nullable.NewValue(0.0),\n\t\tStyle: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyle{\n\t\t\tMode: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyleModeEnumReplace),\n\t\t\tSelectionMode: nullable.NewValue(types.V1CharacterReplaceCreateBodyStyleSelectionModeEnumAuto),\n\t\t}),\n\t})\n}" }, { "lang": "rust", - "source": "let client = magic_hour::Client::default()\n .with_bearer_auth(&std::env::var(\"MAGIC_HOUR_API_KEY\").unwrap());\nlet res = client\n .v1()\n .character_replace()\n .create(magic_hour::resources::v1::character_replace::CreateRequest {\n assets: magic_hour::models::V1CharacterReplaceCreateBodyAssets {\n image_file_path: \"api-assets/id/5678.png\".to_string(),\n video_file_path: \"api-assets/id/1234.mp4\".to_string(),\n },\n end_seconds: 15.0,\n name: Some(\"My Character Replace video\".to_string()),\n resolution: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyResolutionEnum::Enum720p,\n ),\n start_seconds: Some(0.0),\n style: Some(magic_hour::models::V1CharacterReplaceCreateBodyStyle {\n mode: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyStyleModeEnum::Replace,\n ),\n selection_mode: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyStyleSelectionModeEnum::Auto,\n ),\n ..Default::default()\n }),\n })\n .await;" + "source": "let client = magic_hour::Client::default()\n .with_bearer_auth(&std::env::var(\"MAGIC_HOUR_API_KEY\").unwrap());\nlet res = client\n .v1()\n .character_replace()\n .create(magic_hour::resources::v1::character_replace::CreateRequest {\n assets: magic_hour::models::V1CharacterReplaceCreateBodyAssets {\n image_file_path: \"api-assets/id/5678.png\".to_string(),\n video_file_path: \"api-assets/id/1234.mp4\".to_string(),\n },\n end_seconds: 15.0,\n model: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyModelEnum::WanAnimate,\n ),\n name: Some(\"My Character Replace video\".to_string()),\n resolution: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyResolutionEnum::Enum720p,\n ),\n start_seconds: Some(0.0),\n style: Some(magic_hour::models::V1CharacterReplaceCreateBodyStyle {\n mode: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyStyleModeEnum::Replace,\n ),\n selection_mode: Some(\n magic_hour::models::V1CharacterReplaceCreateBodyStyleSelectionModeEnum::Auto,\n ),\n ..Default::default()\n }),\n })\n .await;" }, { "lang": "curl", @@ -4566,7 +4566,8 @@ "required": ["name", "file_path"] }, "minItems": 1, - "maxItems": 10 + "maxItems": 10, + "description": "Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.\n\nSupported models and reference media:\n* **`kling-3.0`**: Supports images, videos.\n* **`minimax-h3`**: Supports images, videos, audio.\n* **`seedance-2.0`**: Supports images, videos, audio.\n* **`seedance-2.0-mini`**: Supports images, videos, audio.\n* **`seedance-2.5`**: Supports images, videos, audio.\n* **`wan-3.0`**: Supports images, videos, audio." } }, "required": ["end_seconds", "style"]