254,392 Commits over 3,990 Days - 2.66cph!
Applied locker spec color fix to previously missed skin 2656590153
Applied locker spec color fix to previously missed skin 2656590153
Applied locker spec color fix to previously missed skin 2929539528
Allow expanded parameters on input nodes
Player Pusher - this doesn't feel like the best way to do this
Add IRenderContext::GetSubContext() to get or create a sub context for a new thread, use it in managedsceneobject
Render contexts can never be passed between threads; they can only be used on the thread that created them. The thread index will be set in the constructor and can't change after that.
This causes a problem in our current implementation of SceneCustomObject that reuses the threaded render context on the main thread and expects we can add things,modify and render it from there, for D3D11 it is not a problem since the implementation or driver seems to have a mutex for command lists, but on Vulkan that gives validation errors and causes crashes.
Valve has the concept of Secondary RenderContexts but doesn't fit what we need
This implements the concept of SubThreads to RenderContext, a very simple way to pass the render context around and consume it in a timely manner, it creates a new render context with the same characteristics as the parent one in a new thread and submits it when the parent context is released
Remove pragma optimize off
Only override states if target layer wants it so, otherwise subcontext just uses the default rasterizer and depth stencil state, fixes worldpanels with depth test, pass attributes from rendercontext rather than layer
Fix exception in heartbeat worker when exiting with Ctrl+C
Detect server crashes and make sure it restarts
Proper timer to make sure logs are submitted after some time instead of waiting for a full batch
More networking and clean up
Fix issues with loading compiled resource json in editor space
Only override states if target layer wants it so, otherwise subcontext just uses the default rasterizer and depth stencil state, fixes worldpanels with depth test, pass attributes from rendercontext rather than layer
ActionGraph: Double-click on an input to start editing it
https://files.facepunch.com/ziks/1b1811b1/sbox-dev_Gea8n5mihG.mp4
Comment out debug gizmo code.
Additional checks.
detail texture tweaks
replaced cobblestone road textures with something higher quality and better feature scale
material tweaks
Deleted metal detector UI code and prefabs now it is not used.
Added an additional client-side check before requesting flags.
Couple of extra null checks to be safe.
Remove pragma optimize off
▉▇▋▆ ▊▇▌▄▊▆▋▉ ▉▊▍▍▇▉▆ ▍▄▌ ▇▊-▊▊▇▌▅ █▄▇▉▊▌▋▅ ▊▇█ ▇▄▉▍▉▆▄▍ ▍▍▋▆▋
Add IRenderContext::GetSubContext() to get or create a sub context for a new thread, use it in managedsceneobject
Render contexts can never be passed between threads; they can only be used on the thread that created them. The thread index will be set in the constructor and can't change after that.
This causes a problem in our current implementation of SceneCustomObject that reuses the threaded render context on the main thread and expects we can add things,modify and render it from there, for D3D11 it is not a problem since the implementation or driver seems to have a mutex for command lists, but on Vulkan that gives validation errors and causes crashes.
Valve has the concept of Secondary RenderContexts but doesn't fit what we need
This implements the concept of SubThreads to RenderContext, a very simple way to pass the render context around and consume it in a timely manner, it creates a new render context with the same characteristics as the parent one in a new thread and submits it when the parent context is released
EditorSplashScreen remove StaysOnTopHint - intrusive to all other OS windows and hides exception dialogs
Bail starting tools if our base projects fail to compile because nothing will work and it's impossible to recover
▍█▊▉ ▆▊█▉▆▅ ▉▅█▄▌▄▄
▊▅▌▊▄▌ ▉▇▋▌▄▇▄▍▉▇ ▉▌▊▊▉▌▊▄.▅▌▊ ▍▊▄▍▊▉
█▌▉ ▉▋▌▊▄▅ ▉▌ █▆▆▆
Re-order some checks to avoid a raycast in some situations
Added a link directly to the flag collider so I can remove a GetComponent
String table, empty entry unit test
Removed some now unused code.
Removed a couple of double gets.
Split NetworkTest into Gun
Handle empty entry in StringTable
Don't try to multiple Term GameObjects
Differentiate between Network Root objects and network objects in tree
Fix network object serialization
Better errors when component deserialize errors
Don't network spawn disabled objects
merge from
91744 Skin bundle update
Merge from main -> backpacks
Fix backpack inventory panel visible by default (should be hidden)
Actually use the sky_camera offset/angle/scale in native
shifted decal layers around for some materials to avoid projecting out of context
random color detail map and mask for rope bridges (for a splash of color)
▊▇▌▉▍█.▅▉▉▄/▆▆▌▋▄▇▆▄▋▇▌▊█▊▄ ▋▋▇█▋▋▌▋/▆▍▄▄▄█▋▇▆ ▌▄▉▆▆▋▆▋▌▉
▇▊▍▄ ▌▅▉▅ ▊▌▄▋▆▇▉ ▊▌▍▆▅▉.▄▄▉▌* █▅▋█▄▄▋▍ ▆▉▄▆▍▅▍█▆▄█ ▆▄▌ ▆▋▊▌▆ █▊▄ ▇▊█▅ █▄▌▊▉▋▇▋
▍▌█▇▍▌▇▋▆▍ ▊▇▋▊▌▍▌ ▆▋▆▇▅▅█▋▋ .▋▌▊ ▉█▊▌▇
▌▇▇▆▍█▅.▍▋▇▄▅█▋▅▌▌▇▄▄█▌▊▄▊ ▅▄█▄▊█ ▍██▌▉▊▉▆▆ ▅▇█ ▌█▉▆
▍▊▋▋ ▅▊ ▋▌▄▊ ▆▊▋▇▊▌▄▍▄ ▋▄▍▊ ▆▇▅ ▋▍▅█▌▉ ▄▍▅▌▇ ▍▇▇▊▊▋▌ ▇▌█▌█▉▇ ▌▇▌▆▄▄█▇ ▍▌▌▋, ▊▌▊ ▊▌▆ ▌█▄ ▊▋▄█.
▅▌▌█ ▊▌▉▊▄▄▆▅▋▄ ▋▌▊▇█▌▌▅▍ ▊▅ ▊▊▉▄▆▆ ▊▌▋ ▌▆▊▌▇▄
▇▅▉▌█ *.█▅ ▆▄▉█ ▆▆▅▉ ▍▌▅▆▍▆▍, ▉▌▋▉▇ ▍▆▉_▆▋▄▇▉▋▊_▅▆▊▉ ▇██ ▋▍▇ ▊▆▌█ █▉ ▇▌█▉
▊▄▍▅ ▅▍▉ ▆▋▆ ▌▊▋▇▊▍▉█▌ █▄▅▋ ▅▋▋▇▅▌▅▊▉▅▆
▍▄▆▉██▍▅ ▄▋▉▍ █▉▋█▍ ▍▍▍█
▉▇▋█ █▊██ ▉▉▇▉ ▉▇▉▊▄▄ ██▌▄ ▍▊ ▋▆▋▇ ▇▅▋▊▅▋▇▋█ ▅▄▋█▋█ ▆▅▇▍▆▆▋▍ ▌▉█ ▉█▇▅ ▊▅▌▅▅▇, ▋▋█▋▍▋▆▍▄ ▊▄▅▊▋ █▇▇▉▄▉ ▆▍▄▊▅▍█▇█ ▌▍▇▊▄ ██ ▍▆▆█ ▉▍▌▌
██▌▉▊▆ ▋▆▄▉▅▌ ▊▋▉▄▇▌█▅▋▋▉.▉▆▍ █▅▇▊▍
▆▄▆▅▋▄ ▍▊▅▄▊▆ ▄▍▊▌▅▊▅ ▄▋█▋
▅▋▌▆▆▊ ▌▊▍█▉▌ ▌█▊▌▍█▅▇▄_▄█▉▊▊▅ ▆█▅▉
!▆▋▆▄█▍ ▌▊▍▇▇▋ ▌▉▄▌▇
▉▌▆▊ ▉▅ ▊▄▇▇▉▊█▊, ▆▋▌▆▅ ▉▇▅ ▌▅▌▅▄▊▇ ▉▍▊▋ ▌▊▊▍▌▋▉ ▉▄▅▉▆▍
! █▊▅ ▍▄▆▌▇▄▇▍ ▄▌▇▅ ▄▊▋▇▍▌▊▍▊▌▍▉▉
! ▍▆▄ ▆▌▌▋▇█▇▉ ▊▋█▌ ▇▊▌▄▇█▉ ▇▇▆▇▅▌ ▋▉▅▄ ▋▇█▋ .▆▊▅ ▄▊▌▉▆
! ▆▊▅▇▌ ▉▍▍ ▍▅▅▇ ▌▋▄▉▊▌▉▌▅ █▍▇▄▄▄▍▊▍
! ▋▊▍▄▅▉▅▋▍ ▆▊▆▅▉▆▄▌▉▊ ▊▇▋ ▆▊▅.▋▋▌▆▋█▍▆▍█▉█
! ▌▊▉█▍▍▇▆ ▍▇▇▅▄▆▉▇ ▄▊▍▇ ▆▍█▌▇█ ▅▋▊▍▆ ▅▋▊▄▍▄▅
!█▌▍ █▅█ ▇▊▆█▍▉ ▆▆ █▅▅▌ ▆▋▅█▋▊ ▉▍▄▆██ ▆▊▇▍▅▅▇▌▌
!▍█▊▆▊▌▅▋▍.__▊▉ █▅▊▇▍▄▄▇▌▆▇ ▄▆▌ ▆▆▆▆▅▆ ▌▇▄▆ ▆▉▆▅▋█▅▅
▉▌▍▄▍ ▍▍▅▅▄▄▊ ▊▇▇▇█▉▌█ ▌▇▋▅▅ █▄ █▌▍▉▇▄▅█▇ ▌▅▆▇▇ ▍▅▋▇█▉▌▅
!▌▊▆▊▊▇ ▆▅▌▌█▌█▆▆ █▊▉▉▌▄▉▇ ▆▉▅ ▌▆▍▌▋▍ ▅▇▄▆▇▋▇
▌▆▆▍ ▆▌█ ▍▊ ▌▇▊▌▍▄▅ ▆▆▍ ▅▉ █▍▅▄▅▉ ▊▄▆▍
!▅▍▆▋▉▋▉▅ █▄▅▅▇▊▅ ▍▍▅▆▋▍ █▉▋▇▇▅▍▅/▇▋▌█▍▆▊▉▆█▇ ▋▅█▄█▇ ▉█▌▅▉▉▌ ▉▍▋▇█▇▆▉▉
▍▅▆▇ ▋███▇ ▋▊▌▄ ▋▍▉▇▍▋ ▊▅▍▋▆▍▍ ▍█▇▅▌ ▆▌ ▅▆▆▋▅▊.▅▍▇▋▋▌▄█▅▋▌▅██▌█▄▇▄▇▌█
!▍▅▆ ▌█▍▌▉▊▋
!▆▇▊▊▋ ▅▄█▍█▋▋ ▉▍ █▌ ▍▊▆▍ ▋▋▋▊_▄▆▉▍▇▄▉▊▄▄
!▍▄▌ ▅▋▌▇▊▇▇ ▋▆▉▇▇ ▊▄▅▇ ▋▄█▉▍▊▉ ▊▄▄▌▌▅▊▉▍ █▍▋ ▍▇▉▅▇▇ ▍▋ ▊▆▉ ▋▄ ▇ ▆▇▍▉█▌▉▆ ▆▆▉█
!▉▉▉▄▇ ▍▊ ▆▆▍▆▍▄▅ ▄▌▌█ ▉▇▌█▌▇▉█▍▅▆▋.__▅▆
!▉▌▌ ▇▅▉▌▊▄▋▅ ▆▄▄█ ▆▌▊▇▋▋▆▊ ▅▋▆_▉▌▍▉▍█
!▌▍█▅▇ "▊▊▇" ▉▌ ▆▅▆▉▆█▍ ▋▇▊█▇█▆ ▆▋▊▍ ▍▍▋▉▋▋█▅▉▇ ▌▅▍▄
▆▌▍█▌▅▄ ▄▍▆▅▇ ▍██▅▌▊▄ ▋▇▉▅▋▇▉ ▄▅ ▍▊▌▅▋█▅▉▇▌▌█, ▌▍▄▉ ▇█ ▋▄▊██▆▅▅
!▋▋▋ ▆▄▇▄▍▅▆▇ ▍▊▉▇ ▍▌▄▋▉▍ █▉ ▊▇▍▋_▄██▅▊▄▉▊█▌▅▋▉█▍
!▋▋▅ █▋▅▋▋▊█ █▉▆▇ ▆▄▌▄▉.▄█▋▅▋▌▄▌▍▄▊▆▆▅▍▊▋▉▍▅▊▆
!▋▋▋▅▉ ▇▇▅▋ ▆▊▄▇█ ▄▊█▉▋▆▌▊▍ ▅▅█ ▆▊█▉ ▌▌▌▋▊▍█▉▇▊▉ ▋▆▇▉▆▋
! █▊▅ ▅██▇█▄▌▉ ▍▄ ▅▋▋▆ █▋▅▉▌ ▄▅▌▅ ▄▋▅ █▉▊▍ ▋▋▍▇█
!██▉ ▇▊▅▌▉▇▉ ▋▍▍▍▋ ▄▅ ▊▉▍▆▇
!▇▊▆▊▆ ▍▄▇█▋█▌▍ ▇▉ ▆▆ ▍▆▇▋ ▉▍▅█▉▌▍▉ ▄█▇▆▄▄▍
!▅▍▌▍▉ ▄▅▍▉▅▄█ █▍█▉ ▊▍▉▌▊.▅▅▊▄▅▋ ▇▇▄▊▍ ▆▊▄▆ ▅▆ ▋▋█▄▉▆ ▉▇█▊▉▌ ▋▆▉▆
!▆▍▋▅ ▍█▆▋▊▉ ▉▄▆ ▌▌▆█▇ ▅▋█▊▉
▍▄▋▊▅▌▉ ▇▇▇▄▇▅█▍▇▇ ▉▊▇▄▊ █▅▊▋ ▇▇ ▇▄▋▌▊█
!▌▄▆▋▅▍▅ ▅▆▋▆█▋▌ ▉▍▌▆ ▋▆█▆▊▉▄ ▇▉ ▅▄▆▊▅▊▊▉▌▅ ▉▇▋▆▍█
!▋▍▆▄▉▌▇▆ █▄█▍▊█▊▋ ▋█▍▅ ▄▅▄▋.▄▆▊▌▆▍▍▍▉▌
!▌▊▌▇▍ ▆▊▍▅▄▆▊ ▍▇▉▌▉▇▇ ▋█▊▍ █▍▆▆▉▍▉▅█ █▌▊▄▌██▊▉
!▄▄▍█▇ ▇▆▆█▇▊▊ ▌▇▆▊ ▇▇▋▄▄:▄▉▍▋▆▅
!▋█▍ ▅▍▊▆█▊▍▄▉ ▍▍▆█▆█ ▌▊█▇ ▇▉▅▊▊:█▍█▍▊▄▅▉▌▉▅▊▄▉▍▊▋▇
! ▋▋▅ ▌▉▆▉▍▊▊▇ ▄▇▄▆ ▄▋█▅▄▇▉▋██▍ ▄▌▌▄█▋▊▆▇ ▍█▊█▅█▋█▉▅▋
!▅▅█▍ ▋▉█▊ (▍▆▍▋█▊▅▋▅▊▆) ▊█▅▊▇▉▅▄ ▍▊▊▄▆▇ ▊▌▍▇▌▆▌▆▍
!▆▅▍▋▆▌▍▋ ▊▋▆█▇▍▉▄ █▊▉█▄▇▅
!▋▇ ▋▋▆ ▇▆▇ ▇▇ █▍▉▇ ▋▍▆▍▍▍▇ ▍▌▇▌█▇█ ▊▇▋▍▌▍▆▇ █▄▋ ▇▇█▍▄▌▄▍
▊▋▊▇█ "▄█▌ ▋▉█▍ ▌▍▌▋▄▊█▄▉ ▅▇▉ ▅▆▉▉▌▄" ▋█▌█▊▋▄▍
!▆▌█ ▅▉ ▌▄▄ ▍█▉▋▌ ██▍▇▉▇▅ ▅▆▉▌▍▊ ▋▄ ▅▇▇-▅▊
▅█▋▍▉ "▌▌▄ ▅▌▄▍ ▋▆▍█▍▅▊▆█ ▍▍▊ ▋▌▆█▊▇" ▊▄▉▅▌▌▉▍
!▍▄▄ █▅ ▊▍▊ ▆▊▍▇█ ▆▅▄▇▅█▅ ▆▋▊▇█▋ ▆▍ ▇▊▇-▄▌
Delete unused 2d skybox tracking CSceneWorld::m_skyboxes
Restore deleted 3d skybox view layers
Delete SceneCamera.Skybox - this was a stupid way to do it
Add internal SceneSkybox3D, create this from skybox_reference in SceneMapLoader using its own MapLoader
SkyboxMapLoader loads 2d skybox
▄▌▇ ▉▊▄▍▄▍▅▉ ▇▇▅▉▆▄▍▊█▅█ ▊▍▉ ▉█▆▄▋ ▍▉ ▋▄▅▌▍▊▊▍█ ▍▍█▍▌▉▊▋ ▄▆▇ ▋▊▍▊▆█▄▅▉/▋▍▅▆▄▊▆▍▋▆ █▆▋▍▆█▅ ▍▊▍ ▌█▄▉▊▌ ▄▅▉ ▉▉▊█▇▋▍▌ ▆▍▆▆ ▊▄▋▋▄▍ ▊▋▅▄█▇▅▋
▉▉▊▇▆▆▉.▉▋▋▌▉▋▊ ▌▉▊▆▊▄ ▄▅█ ▉█▍▊▊▌▍ ▉▆▇▄▌ ▋▅▍█ ▇▋▊█ ▇█ ▍▆▊▊▍▅▌
▍█▋▇ ▅▄▌▇▉▌▋ ▌▆▉▆▊▌▄█ ▋▌ ▆▇▇▋▅ ▅█▊▄ ▍▌▌▋▆▌▆ █▊▄▄▄▋▌▌▉
▅▌▋▉▌▊ █▇▄▋▅█ ▉▍▌█▊▉ ▍▌▄▉ ▆▇▇▇▇█▊, ▋▉▉█▆▍▆ ▊▄▆ ▆██▊▉▋▌▍▊ ▅▊█▅ ▌▄▉▊▊▇
! ▆█▆▄▋▆▆▉ ▍▇▄▊▋▉▇▊ █▉▌▊ ▊██▋▆▄ ▇▇▊█▊ ▇▊▆▌▋▄▇
!▋█▇ ▅▍▉ ▊▉▌▌▌▅ ▉▍ ▌▍▋▋ ▄█▋▊▍▍ ▍█▋▊▍█ ▋▊▊▄▌█▆█▉
▌▅▋▆██ █▌▊▉▊▉▄▊▉ ▊▄██▆▉▌▍▉▇ ▄▅ ▉▉▅▇▋▆▆.▆▇▍▇███ ▉▄▅▇▍
!▋▍▅█▋▍▌▅▍.__▄▅ ▆▍█▆▍▇▉▅▍▆▋ █▅▊ ▊▍▄▌▍▌ ▌▅▇▇ ▆█▅▇█▌▄▆
▆▆▋█▄ ▅█▆█▍█▊ ▍▉▍▋▅▍▌▇ ▄▅▆▄▉ ▄▄ ▉▆▆▋▄▅█▆▍ ▌▆▍▌▇ ▊▇▍▋▊▇▊█
!▇▆█▄▋▆ ▄▍▋▌▄▄▍▄▆ ▆▇▉▉▇▄▍▌ ▄▍▍ █▌▇▇▍▋ █▄▌▍▇▄█
▆▅▍▅ █▍▌ █▉ ▄▊▇▅▌▇▇ ▇▇▇ ▅▋ ▋▅▉█▍▆ ▊▌▅▆
!▍▇▄▆▅▄▌█ ▅▅▉▌▋▊▍ ▋▌▄▊█▊ ▍▍▊█▄█▊▉/▊▅▉█▌▋▄▄▉▅▇ ▉▍▅▍▅▍ █▌▉▅█▉▅ ▋▊▍█▇▌▅▊▅
▍▉▍▍ █▍▍▌▋ ▇▍▇▌ ▊▌▍▉█▊ ▉▅█▅▉▇▋ ▅▌▊▊▋ ▄▊ █▄▉▄▅▉.█▍▊▇▅▊▌▌▍▅█▌▇▉▄▍▉▇▇▊▊▋
!▅▆▄ ▉▌▊█▊▆▍
!▇▌▅▊▉ ▄▄▌▉▍▅▊ ▅▌ ▇▉ ▉▉▉▅ ▊▉▌▋_▋█▇▉▌▅▇▇▍▉
!▉█▇ █▇█▇█▄▋ ▉█▄▆▆ ▇▅▍▄ ▄▆▋▄█▌▅ ▋▉▄█▉▌▋▉▆ ▍▅▅ ▅▄▌▅▉▄ ▅▇ ▇▄▇ █▄ █ ▆▌▇▌█▍▊▆ ▋▌█▊
!▆▋▋█▍ ▇▅ ▍▋▄▆▅▅▍ ▆▉▋▊ ▅▊▇▄▉▌▆██▅█▌.__▇▄
!▋▍▌ █▊▌▅▄▆▄▋ ▆▊▅▊ ▉▊▅█▄▊▋▆ ▅▅▌_▆▉▌▄█▌
!▊▆█▆▄ "▌▍▍" █▅ ▇▇▇▆▆▅▋ ▍▉▇▇▆▇▍ ▋▊▆▋ ▊▊▅▆▉▌▊█▋█ █▌▆▉
▊▉█▌▌▍▊ ▅▋▍▉▄ ▉▇▌███▉ ▅▆▌▍▅▋▉ ▊▋ ▇▆▉▊▅▋▊▋▉▌▌▇, ▅▉▌▆ ▋█ ▆▆▉▇▄▍▇▄
!▇▋▊ ▇▄▆▆▌▋▉▇ ▌▍▋▋ ▄▍▉▊▅▍ ▊▄ ▊▇▇▆_▇▅▄▆▉▇▅█▍▅▆▌▉▄▇
!▋▆▌ ▌▉▉█▉██ ▇▅▅▊ ▊▍▍▋▄.▌▊▋▆▌▉▌▆▌▍▊▋▅▄▊▌▋▋█▋▊▍
!▊▊▌▆▅ ▍▋▇▆ ▆▄█▅▊ ▄▄▄▇▋▆▊▊▋ ▊▅▄ █▋▌▆ ▉▍▇▍▍▅█▉▇▌▉ █▊█▋▊▍
! ▍▌▋ ▋▅▄▇▆▄▌▆ ▄▅ ▉▍█▄ ▋▄▅▆▊ ▌▊█▍ ▍▋▅ ▍▆▌█ ▅█▍▄█
!█▍▍ ▋▍▆▅█▆▆ ▉▄▊▋▊ ▉▊ ▆▍▅▆▅
!▄▊▄▅▊ ▇▊▍▄▄█▉▆ ▅▅ █▋ ▊█▍▊ ▊▆▅▆▉▆▍█ ▅▍▍▆▆▌▇
!▋▋▊▌▌ ▆▅█▊▅█▉ ▇▆▉▇ ▋▇███.▌▍▄▅▊▉ ▍▅█▇▄ ▆▌▋▄ ▍▉ ▄██▋▉▄ ▅▊▉▆▊▊ ▅▍▌█
▌▌▋ ▉▋▆▋'▆'▇▅▌█ ▆▉██▇▆▆ ▄▍▊▇▌ ▍█▅▇▆▉ ▇█▆ ▌▍▍▆█▌▌▊ ▆██▅▋ ▇▍▋▆▆ ▍▊▋█
!▆█▌▊ ▆▅█▄▋▋ █▆█ ▊▉▆▍▇ █▇▋▆▍
▋▆▄▅▊▄▆ ▇▋█▇▋█▇▋▉▋ ▆▆▊▊▋ █▍▇▅ ▄▇ ▉▆▇▋▍▉
!▅█▅▍▋▍▉ █▊▋▅▌▄▌ ▅▌▊▅ █▉▆▍▋▅▋ █▄ ▍▌▉▄▉▋▍▅▇▇ ▋█▆▅▆▄
!▋▋█▄▅▅▊▉ ▆▆█▆▆▊▄▆ ▇▍▊▊ ▅▋▉▅.▅▊▌▉▍▊▆▇▄▍
!▄█▆▇▌ ▋▅▍▌▆▇▊ ▍▊▇▉▅▇▉ ▊▌▍▅ ▇▍█▇▅▉▉▄▄ ▆▆▊▉▍▍▄▌█
▆▍▇▌█ ▋ ▆▆█▉▌ ▋█▄▄ ▆▍█_█▇▍▇▆▅▆█▊▍
!▋▉▅▇▊ ▅▊▄▌▉█▋ ▅▍▅▄ ▅▆▋▅▊:▇▄▉▊█▉
!▌▊▅ ▉▄▄▆▉▍▇▉▅ ▇█▍█▇▍ ▊▆▄▆ ▅▄▍▊█:▆▇█▊▋▆▉▋█▊▄█▋▌█▆▊▊
! ▅█▋ ▋▍▋▊▍▅█▊ ▉▅▉▇ ▉▄▅█▋▌▌▋▋█▋ ▇█▌█▊▄█▇▌ ▆▋▉█▋▍▋▄▅▅▍
!██▅▆ ▌▆▋▍ (▋▆▊▄▆▅▇▅▄▊▌) ▊▄▋▋▄▋█▊ ▊▋▄▌▊▊ ▉▇▍▇▊▊▇▆▉
▊▉▉▋▇▇█▌ ▊▇▆█▌▊▊▅█▇▊▅.▅
!▊█▄▇▊▌█▌ █▄█▇█▅▆█ ▍▅▇▆▍█▉
▇▅▊▊▆ ▆▅ ▇▋▄▇▍▄█▇ ▊▉▍▄ ▆▇ ▋▅█▉█▊▉▅▆▍▆▆▍▋▆▍▅▆▊▆▊▋▇▅▆ ▅▍▉▉ ▌▆▌ ▅▅▉ ▄▆▅▋▉▊▅█ ▅▅▊▅▋▅
▊▇▊ █▍▊▄▌▆▇▆▊▍->▊█▊▇▅▋ ▅▆▋ ▄█▄▊▉▇ ▅▍▉▍ ▆█▌█ ▉█ ▆▉▉ ▆▍ ▌█▍▋▉▄
█▌▉█▊ ▍▌▇▆▇▆▅▊▊ "▇▋▇█ █▋▍▄▌▍▆" / "▊▍▋▆▍▄" ▍▍▆▋▅▄▉ ▊▉▍ ▅▇▄▍▇▌ ▊▊▄▅█
▆▋▅▇▍▊▅▍▍▅ ▄▆▇▇ ▅▇▌▅▋▋▌▍▋/▋▋▋▍/▌▋▇▅
!▅▋ ▊▊▆ ▅▇▆ █▇ ▊▉▌▅ ▄▋▉▆█▋█ ▇█▊▆▍▇▊ ▅▊▇▆▉▄▌▉ ▊▋▍ ▆▉▍▆▇▆█▍
█▍▆▌▇ █▊▉▉▄▇▄▇▊ "█▇▌▄ ▉▆▋▊▅▌▆" / "▊▍▇▆▇▌" ▋▉▄▅▊█▉ ▄▆▅ ▄▆▅▇▆▉ ▉▉▊▌▍
▉▄▇▋▌▇▊▋▉▆ ▆▅▆▉ █▇█▋▌▆▍▇▅/▊█▄▉/▍▄▇▌
!▉█ ▌▆█ ▊▇▌ ▄▍ ▇▊▍▋ ▄▍▋▋▆▅▋ ▋▊▄▅▍▋▇ ▌▌▊▊▆▇▊▋ ▇▇▄ ▊▅▍▋▇▉▊▅