7 Commits
Author SHA1 Message Date
amd64fox 2a179d3cf0 version bump to 1.2.96
enable the redesigned context menu, canvas toggle, and video shelf previews
2026-08-08 14:03:04 +03:00
amd64fox c2cc808ef6 fix(block_slots): prepare semantic patching for Spotify 1.2.96
- resolve slot enums from mapper control flow instead of field offsets
- allow short or exact versions in the validation workflow
2026-08-08 00:09:42 +03:00
amd64fox 50bc5a6526 version bump to 1.2.95 2026-07-25 02:13:21 +03:00
amd64foxandthynome 3d1ddd6850 fix(binary): handle BinaryScanner failures
#878

Co-authored-by: thynome <125388433+thynomex@users.noreply.github.com>
2026-07-14 22:58:38 +03:00
amd64fox afb4c3fcd1 Add exclusions to Microsoft Defender
- Add exclusions to Microsoft Defender to prevent false positives
2026-07-11 20:50:11 +03:00
amd64foxandGitHub e22aba4ed4 version bump to 1.2.94 2026-07-11 16:37:12 +03:00
amd64fox 9eafb084c6 testing the new patch for slots in version 1.2.94
#876
2026-07-11 15:50:34 +03:00
36 changed files with 1364 additions and 35 deletions
+29 -14
View File
@@ -1,38 +1,53 @@
name: Check Spotx for the latest Spotify
run-name: Check SpotX for Spotify ${{ inputs.version || 'latest' }}
on:
workflow_dispatch:
inputs:
version:
description: Spotify version like 1.2.95 or 1.2.95.453, empty means latest
required: false
default: ''
type: string
jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Spotx
shell: powershell
env:
SPOTIFY_VERSION: ${{ inputs.version }}
run: |
$jsonUrl = "https://raw.githubusercontent.com/LoaderSpot/table/refs/heads/main/table/versions.json"
$resp = Invoke-RestMethod -Uri $jsonUrl
$spotifyVersion = ([string]$env:SPOTIFY_VERSION).Trim()
# Use fullversion because installer names include architecture suffixes
$latestEntry = $resp.PSObject.Properties | Select-Object -First 1
if (-not $latestEntry) {
throw "No Spotify versions found in $jsonUrl"
if ([string]::IsNullOrWhiteSpace($spotifyVersion)) {
$jsonUrl = "https://raw.githubusercontent.com/LoaderSpot/table/refs/heads/main/table/versions.json"
$resp = Invoke-RestMethod -Uri $jsonUrl
# Use fullversion for the installer name
$latestEntry = $resp.PSObject.Properties | Select-Object -First 1
if (-not $latestEntry) {
throw "No Spotify versions found in $jsonUrl"
}
$spotifyVersion = [string]$latestEntry.Value.fullversion
if ([string]::IsNullOrWhiteSpace($spotifyVersion) -or $spotifyVersion -notmatch '^\d+\.\d+\.\d+\.\d+\.g[0-9a-f]{8}$') {
throw "Invalid Spotify fullversion for $($latestEntry.Name)"
}
}
elseif ($spotifyVersion -notmatch '^\d+\.\d+\.\d+(?:\.\d+)?$') {
throw "Invalid Spotify version: $spotifyVersion"
}
$spotifyFullVersion = $latestEntry.Value.fullversion
if ([string]::IsNullOrWhiteSpace($spotifyFullVersion) -or $spotifyFullVersion -notmatch '^\d+\.\d+\.\d+\.\d+\.g[0-9a-f]{8}$') {
throw "Invalid Spotify fullversion for $($latestEntry.Name)"
}
Write-Host "Selected Spotify version: $spotifyVersion"
# Incoming parameters
$parameters = @{
Verbose = $true
new_theme = $true
version = $spotifyFullVersion
version = $spotifyVersion
confirm_spoti_recomended_over = $true
cache_limit = 1000
block_update_on = $true
+118 -14
View File
@@ -111,7 +111,7 @@
"native_description": "Enable music leavebehinds on eligible playlists for desktop",
"version": {
"fr": "1.2.10",
"to": ""
"to": "1.2.93"
}
},
"HptoLocationRefactor": {
@@ -417,7 +417,7 @@
"native_description": "Allow switching between the new Home Ads format and legacy HPTO format (as opposed to only showing the legacy HPTO format)",
"version": {
"fr": "1.2.34",
"to": ""
"to": "1.2.94"
}
},
"LimitedAdsLabelsOnPlaylistCards": {
@@ -512,7 +512,7 @@
"native_description": "Enables the Employee Flag to send to Sentry",
"version": {
"fr": "1.2.44",
"to": ""
"to": "1.2.93"
}
},
"HomeImpressions": {
@@ -656,7 +656,7 @@
"native_description": "Enable Hpto announcements on Home",
"version": {
"fr": "1.2.65",
"to": ""
"to": "1.2.94"
}
},
"SponsoredPlaylistV2": {
@@ -778,7 +778,7 @@
"name": "bypassApplyUpdateCheck",
"version": {
"fr": "1.2.84",
"to": ""
"to": "1.2.93"
}
},
"ad_feedback_in_stream": {
@@ -836,6 +836,62 @@
"fr": "1.2.92",
"to": ""
}
},
"EmbeddedAdHtmlDisplay": {
"name": "enableEmbeddedAdHtmlDisplay",
"description": "Enable HTML display ads in the embedded NPV",
"version": {
"fr": "1.2.94",
"to": ""
}
},
"ImageOptimizationSentrySpanMeasurement": {
"name": "enableImageOptimizationSentrySpanMeasurement",
"description": "Enable Sentry image resource span attributes for image optimization rollout measurement",
"version": {
"fr": "1.2.94",
"to": ""
}
},
"SentryReactRouterV6Routing": {
"name": "enableSentryReactRouterV6Routing",
"description": "Enable Sentry React Router v6 route instrumentation for Web Player SPA transactions",
"version": {
"fr": "1.2.94",
"to": ""
}
},
"SponsoredPlaylistHorizontalVideo": {
"name": "enableSponsoredPlaylistHorizontalVideo",
"description": "Enables horizontal video layout for sponsored playlist headers on desktop",
"version": {
"fr": "1.2.95",
"to": ""
}
},
"AdsSurfaceStateForAdOrchestration": {
"name": "useAdsSurfaceStateForAdOrchestration",
"description": "Use ads-owned NPV and cinema surface state for ad orchestration",
"version": {
"fr": "1.2.96",
"to": ""
}
},
"HptoHarmonyVideoPlayer": {
"name": "enableHptoHarmonyVideoPlayer",
"description": "Enable the Harmony-based video player for HPTO home video ads, replacing the Betamax player",
"version": {
"fr": "1.2.96",
"to": ""
}
},
"SidekickFeedbackBanner": {
"name": "enableSidekickFeedbackBanner",
"description": "Show the feedback banner in the Sidekick chat",
"version": {
"fr": "1.2.96",
"to": ""
}
}
},
"EnableExp": {
@@ -962,7 +1018,7 @@
"native_description": "Enable silence trimming in podcasts",
"version": {
"fr": "1.1.99",
"to": ""
"to": "1.2.93"
}
},
"PlaybackSpeedIncrements": {
@@ -1448,7 +1504,7 @@
"native_description": "Disable the Premium Only Modal",
"version": {
"fr": "1.2.39",
"to": ""
"to": "1.2.95"
}
},
"CenteredLayout": {
@@ -1664,7 +1720,7 @@
"native_description": "Enable reverse sort direction in Your Library",
"version": {
"fr": "1.2.60",
"to": ""
"to": "1.2.94"
}
},
"BackendSearchHistory": {
@@ -1910,7 +1966,7 @@
"native_description": "Enable BPM and key columns in playlist recommendations",
"version": {
"fr": "1.2.82",
"to": ""
"to": "1.2.94"
}
},
"ShareActionBarButton": {
@@ -1934,7 +1990,7 @@
"native_description": "Show video preference settings for users to control video playback types",
"version": {
"fr": "1.2.86",
"to": ""
"to": "1.2.95"
}
},
"VideoQualityEnabled": {
@@ -1984,6 +2040,54 @@
"fr": "1.2.89",
"to": ""
}
},
"LeaderboardEmptySlotHandling": {
"name": "enableLeaderboardEmptySlotHandling",
"native_description": "Config for clearing the current leaderboard ad and hiding the leaderboard container when the ad slot returns an empty response",
"version": {
"fr": "1.2.94",
"to": ""
}
},
"EntityHeaderNew": {
"name": "enableEntityHeaderNew",
"native_description": "Enable the new entity header design",
"version": {
"fr": "1.2.95",
"to": ""
}
},
"ContextMenuLayoutV2": {
"name": "enableContextMenuLayoutV2",
"native_description": "Enables the Context Menu 2.0 layout",
"version": {
"fr": "1.2.96",
"to": ""
}
},
"CanvasContextMenuToggle": {
"name": "enableCanvasContextMenuToggle",
"native_description": "Enables the Canvas context menu toggle",
"version": {
"fr": "1.2.96",
"to": ""
}
},
"MusicVideos": {
"name": "enableMusicVideos",
"native_description": "Whether music videos are available for the current user. Override to true for supported products and markets",
"version": {
"fr": "1.2.96",
"to": ""
}
},
"VideoShelfPreviews": {
"name": "enableVideoShelfPreviews",
"native_description": "Enable video previews on hover in video shelf cards",
"version": {
"fr": "1.2.96",
"to": ""
}
}
},
"CustomExp": {
@@ -2084,7 +2188,7 @@
"value": "CONTROL",
"version": {
"fr": "1.2.31",
"to": ""
"to": "1.2.93"
}
},
"CanvasNpv": {
@@ -2211,7 +2315,7 @@
"block_slots": {
"version": {
"fr": "1.1.59",
"to": ""
"to": "1.2.93"
},
"add": "slot}(?=.{3,8}(override_url|queued_ads))",
"match": "slots(?=.{3,8}(override_url|queued_ads))",
@@ -2220,7 +2324,7 @@
"block_slots_2": {
"version": {
"fr": "1.2.55",
"to": ""
"to": "1.2.93"
},
"add": "slot}(?=.{25,35}state)",
"match": "slots(?=.{25,35}state)",
@@ -2229,7 +2333,7 @@
"block_slots_3": {
"version": {
"fr": "1.2.55",
"to": ""
"to": "1.2.93"
},
"add": "}(?=payload=)",
"match": "\\?(?=payload=)",
+1118 -7
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════════════╗
║ Сардэчна запрашаем у SpotX для Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════════════╗
║ উইন্ডোজ স্পটএক্স এ আপনাকে স্বাগতম ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═════════════════════════════╗
║ Vítejte v SpotX pro Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════════╗
║ Willkommen bei SpotX für Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════════╗
║ Καλώς ήρθατε στο SpotX για Windows ║
+3
View File
@@ -36,6 +36,9 @@
Error = "Error"
FileLocBroken = "Location of Spotify files is broken, uninstall Spotify client and run the script again"
Spicetify = "Spicetify detected, it must be installed after SpotX, open recommended actions in FAQ ? [Y/N]"
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
NoRestore = "SpotX has already been installed, xpui.bak not found. `nPlease uninstall Spotify client and run Install.bat again"
InstallComplete = "installation completed"
HostInfo = "Unwanted URLs found in hosts file"
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═════════════════════════════════════════════╗
║ Le damos la bienvenida a SpotX para Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════════╗
║ Tervetuloa SpotX:n Windowsiin ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════════════════════════╗
║ Maligayang pagdating sa SpotX para sa Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════════╗
║ Bienvenue sur SpotX pour Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════════╗
║ SpotX for Windows में आपका स्वागत है ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════════════════╗
║ Üdvözöllek a SpotX Windowsos telepítőjében ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════════════════╗
║ Selamat datang di SpotX untuk Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════════╗
║ Benvenuti a SpotX per Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═══════════════════════════╗
║ SpotX Windows用にようこそ ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════╗
║ Witamy w SpotX dla Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═════════════════════════════════╗
║ Bem-vindo ao SpotX para Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════════════╗
║ Bine ați venit la SpotX pentru Windows ║
+3
View File
@@ -36,6 +36,9 @@
Error = "Ошибка"
FileLocBroken = "Расположение файлов Spotify нарушено, удалите клиент Spotify и снова запустите скрипт"
Spicetify = "Обнаружен Spicetify, он должен быть установлен после SpotX, открыть рекомендуемые действия в FAQ ? [Y/N]"
DefenderPrompt = "Добавить исключения в Microsoft Defender для предотвращения ложных срабатываний? [Y/N]"
DefenderAdded = "Исключения добавлены в Microsoft Defender"
DefenderFailed = "Исключения не добавлены в Microsoft Defender"
NoRestore = "SpotX уже был установлен, но файл для восстановления xpui.bak не найден. `nУдалите клиент Spotify и снова запустите Install.bat"
InstallComplete = "Установка завершена"
HostInfo = "В файле hosts найдены нежелательные Url-адреса"
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════╗
║ Welcome to SpotX for Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════════╗
║ Välkommen till SpotX för Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════╗
║ Windows SpotXக்கு வரவேற்கிறோம் ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════════╗
║ Windows için SpotX'e Hoşgeldiniz ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔══════════════════════════════════════╗
║ Ласкаво просимо до SpotX для Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═════════════════════════════════════╗
║ Chào mừng đến với SpotX cho Windows ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔═════════════════════════════╗
║ 歡迎使用 SpotX Windows 版 ║
+3
View File
@@ -1,4 +1,7 @@
[PSCustomObject]@{
DefenderPrompt = "Add exclusions to Microsoft Defender to prevent false positives? [Y/N]"
DefenderAdded = "Exclusions added to Microsoft Defender"
DefenderFailed = "Microsoft Defender exclusions were not added"
Welcome = "
╔════════════════════════════════╗
║ 欢迎使用 SpotX 的 Windows 版本 ║