diff --git a/.temp-moonlight-original b/.temp-moonlight-original new file mode 160000 index 000000000..e762aa61f --- /dev/null +++ b/.temp-moonlight-original @@ -0,0 +1 @@ +Subproject commit e762aa61faf70716f2f6b71f81859b25a2d6db3d diff --git a/Assets.xcassets/starfield.imageset/Contents.json b/Assets.xcassets/starfield.imageset/Contents.json new file mode 100644 index 000000000..dcb6ffb87 --- /dev/null +++ b/Assets.xcassets/starfield.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "starfield.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "starfield 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "starfield 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/starfield.imageset/starfield 1.png b/Assets.xcassets/starfield.imageset/starfield 1.png new file mode 100644 index 000000000..a83f9622f Binary files /dev/null and b/Assets.xcassets/starfield.imageset/starfield 1.png differ diff --git a/Assets.xcassets/starfield.imageset/starfield 2.png b/Assets.xcassets/starfield.imageset/starfield 2.png new file mode 100644 index 000000000..a83f9622f Binary files /dev/null and b/Assets.xcassets/starfield.imageset/starfield 2.png differ diff --git a/Assets.xcassets/starfield.imageset/starfield.png b/Assets.xcassets/starfield.imageset/starfield.png new file mode 100644 index 000000000..a83f9622f Binary files /dev/null and b/Assets.xcassets/starfield.imageset/starfield.png differ diff --git a/Assets.xcassets/thumb_Apocalypse.imageset/Contents.json b/Assets.xcassets/thumb_Apocalypse.imageset/Contents.json new file mode 100644 index 000000000..edfbed579 --- /dev/null +++ b/Assets.xcassets/thumb_Apocalypse.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Apocalypse.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Apocalypse 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Apocalypse 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 1.jpg b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 1.jpg new file mode 100644 index 000000000..83a070b65 Binary files /dev/null and b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 1.jpg differ diff --git a/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 2.jpg b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 2.jpg new file mode 100644 index 000000000..83a070b65 Binary files /dev/null and b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse 2.jpg differ diff --git a/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse.jpg b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse.jpg new file mode 100644 index 000000000..83a070b65 Binary files /dev/null and b/Assets.xcassets/thumb_Apocalypse.imageset/thumb_Apocalypse.jpg differ diff --git a/Assets.xcassets/thumb_Atlantis.imageset/Contents.json b/Assets.xcassets/thumb_Atlantis.imageset/Contents.json new file mode 100644 index 000000000..a51b8432f --- /dev/null +++ b/Assets.xcassets/thumb_Atlantis.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Atlantis.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Atlantis 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Atlantis 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 1.jpg b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 1.jpg new file mode 100644 index 000000000..3dae26826 Binary files /dev/null and b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 1.jpg differ diff --git a/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 2.jpg b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 2.jpg new file mode 100644 index 000000000..3dae26826 Binary files /dev/null and b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis 2.jpg differ diff --git a/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis.jpg b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis.jpg new file mode 100644 index 000000000..3dae26826 Binary files /dev/null and b/Assets.xcassets/thumb_Atlantis.imageset/thumb_Atlantis.jpg differ diff --git a/Assets.xcassets/thumb_Fireflies.imageset/Contents.json b/Assets.xcassets/thumb_Fireflies.imageset/Contents.json new file mode 100644 index 000000000..70b899889 --- /dev/null +++ b/Assets.xcassets/thumb_Fireflies.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Fireflies.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Fireflies 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Fireflies 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 1.jpg b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 1.jpg new file mode 100644 index 000000000..9282f04da Binary files /dev/null and b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 1.jpg differ diff --git a/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 2.jpg b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 2.jpg new file mode 100644 index 000000000..9282f04da Binary files /dev/null and b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies 2.jpg differ diff --git a/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies.jpg b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies.jpg new file mode 100644 index 000000000..9282f04da Binary files /dev/null and b/Assets.xcassets/thumb_Fireflies.imageset/thumb_Fireflies.jpg differ diff --git a/Assets.xcassets/thumb_Foundry.imageset/Contents.json b/Assets.xcassets/thumb_Foundry.imageset/Contents.json new file mode 100644 index 000000000..4fa14c860 --- /dev/null +++ b/Assets.xcassets/thumb_Foundry.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Foundry.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Foundry 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Foundry 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 1.jpg b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 1.jpg new file mode 100644 index 000000000..0e6259ef6 Binary files /dev/null and b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 1.jpg differ diff --git a/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 2.jpg b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 2.jpg new file mode 100644 index 000000000..0e6259ef6 Binary files /dev/null and b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry 2.jpg differ diff --git a/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry.jpg b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry.jpg new file mode 100644 index 000000000..0e6259ef6 Binary files /dev/null and b/Assets.xcassets/thumb_Foundry.imageset/thumb_Foundry.jpg differ diff --git a/Assets.xcassets/thumb_Fullmoon.imageset/Contents.json b/Assets.xcassets/thumb_Fullmoon.imageset/Contents.json new file mode 100644 index 000000000..51aa5e8a6 --- /dev/null +++ b/Assets.xcassets/thumb_Fullmoon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Fullmoon.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Fullmoon 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Fullmoon 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 1.jpg b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 1.jpg new file mode 100644 index 000000000..3a02258b8 Binary files /dev/null and b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 1.jpg differ diff --git a/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 2.jpg b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 2.jpg new file mode 100644 index 000000000..3a02258b8 Binary files /dev/null and b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon 2.jpg differ diff --git a/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon.jpg b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon.jpg new file mode 100644 index 000000000..3a02258b8 Binary files /dev/null and b/Assets.xcassets/thumb_Fullmoon.imageset/thumb_Fullmoon.jpg differ diff --git a/Assets.xcassets/thumb_Inked.imageset/Contents.json b/Assets.xcassets/thumb_Inked.imageset/Contents.json new file mode 100644 index 000000000..a9baf1069 --- /dev/null +++ b/Assets.xcassets/thumb_Inked.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Inked.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Inked 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Inked 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 1.jpg b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 1.jpg new file mode 100644 index 000000000..0bf286cbd Binary files /dev/null and b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 1.jpg differ diff --git a/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 2.jpg b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 2.jpg new file mode 100644 index 000000000..0bf286cbd Binary files /dev/null and b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked 2.jpg differ diff --git a/Assets.xcassets/thumb_Inked.imageset/thumb_Inked.jpg b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked.jpg new file mode 100644 index 000000000..0bf286cbd Binary files /dev/null and b/Assets.xcassets/thumb_Inked.imageset/thumb_Inked.jpg differ diff --git a/Assets.xcassets/thumb_Jungle.imageset/Contents.json b/Assets.xcassets/thumb_Jungle.imageset/Contents.json new file mode 100644 index 000000000..e561e59d1 --- /dev/null +++ b/Assets.xcassets/thumb_Jungle.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Jungle.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Jungle 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Jungle 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 1.jpg b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 1.jpg new file mode 100644 index 000000000..4b5f728f3 Binary files /dev/null and b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 1.jpg differ diff --git a/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 2.jpg b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 2.jpg new file mode 100644 index 000000000..4b5f728f3 Binary files /dev/null and b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle 2.jpg differ diff --git a/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle.jpg b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle.jpg new file mode 100644 index 000000000..4b5f728f3 Binary files /dev/null and b/Assets.xcassets/thumb_Jungle.imageset/thumb_Jungle.jpg differ diff --git a/Assets.xcassets/thumb_Loft.imageset/Contents.json b/Assets.xcassets/thumb_Loft.imageset/Contents.json new file mode 100644 index 000000000..541987946 --- /dev/null +++ b/Assets.xcassets/thumb_Loft.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Loft.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Loft 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Loft 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 1.jpg b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 1.jpg new file mode 100644 index 000000000..b3df6d1e7 Binary files /dev/null and b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 1.jpg differ diff --git a/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 2.jpg b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 2.jpg new file mode 100644 index 000000000..b3df6d1e7 Binary files /dev/null and b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft 2.jpg differ diff --git a/Assets.xcassets/thumb_Loft.imageset/thumb_Loft.jpg b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft.jpg new file mode 100644 index 000000000..b3df6d1e7 Binary files /dev/null and b/Assets.xcassets/thumb_Loft.imageset/thumb_Loft.jpg differ diff --git a/Assets.xcassets/thumb_Meadow.imageset/Contents.json b/Assets.xcassets/thumb_Meadow.imageset/Contents.json new file mode 100644 index 000000000..ec6a10861 --- /dev/null +++ b/Assets.xcassets/thumb_Meadow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Meadow.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Meadow 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Meadow 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 1.jpg b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 1.jpg new file mode 100644 index 000000000..e3e5cee5b Binary files /dev/null and b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 1.jpg differ diff --git a/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 2.jpg b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 2.jpg new file mode 100644 index 000000000..e3e5cee5b Binary files /dev/null and b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow 2.jpg differ diff --git a/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow.jpg b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow.jpg new file mode 100644 index 000000000..e3e5cee5b Binary files /dev/null and b/Assets.xcassets/thumb_Meadow.imageset/thumb_Meadow.jpg differ diff --git a/Assets.xcassets/thumb_Metro.imageset/Contents.json b/Assets.xcassets/thumb_Metro.imageset/Contents.json new file mode 100644 index 000000000..8fd0d32a0 --- /dev/null +++ b/Assets.xcassets/thumb_Metro.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Metro.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Metro 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Metro 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 1.jpg b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 1.jpg new file mode 100644 index 000000000..327555b37 Binary files /dev/null and b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 1.jpg differ diff --git a/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 2.jpg b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 2.jpg new file mode 100644 index 000000000..327555b37 Binary files /dev/null and b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro 2.jpg differ diff --git a/Assets.xcassets/thumb_Metro.imageset/thumb_Metro.jpg b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro.jpg new file mode 100644 index 000000000..327555b37 Binary files /dev/null and b/Assets.xcassets/thumb_Metro.imageset/thumb_Metro.jpg differ diff --git a/Assets.xcassets/thumb_Mistfire.imageset/Contents.json b/Assets.xcassets/thumb_Mistfire.imageset/Contents.json new file mode 100644 index 000000000..4aa5a08ef --- /dev/null +++ b/Assets.xcassets/thumb_Mistfire.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Mistfire.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Mistfire 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Mistfire 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 1.jpg b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 1.jpg new file mode 100644 index 000000000..aa45311c4 Binary files /dev/null and b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 1.jpg differ diff --git a/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 2.jpg b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 2.jpg new file mode 100644 index 000000000..aa45311c4 Binary files /dev/null and b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire 2.jpg differ diff --git a/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire.jpg b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire.jpg new file mode 100644 index 000000000..aa45311c4 Binary files /dev/null and b/Assets.xcassets/thumb_Mistfire.imageset/thumb_Mistfire.jpg differ diff --git a/Assets.xcassets/thumb_Monolith.imageset/Contents.json b/Assets.xcassets/thumb_Monolith.imageset/Contents.json new file mode 100644 index 000000000..4bc86d61e --- /dev/null +++ b/Assets.xcassets/thumb_Monolith.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Monolith.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Monolith 2.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Monolith 1.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 1.jpg b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 1.jpg new file mode 100644 index 000000000..5df1b31a4 Binary files /dev/null and b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 1.jpg differ diff --git a/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 2.jpg b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 2.jpg new file mode 100644 index 000000000..5df1b31a4 Binary files /dev/null and b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith 2.jpg differ diff --git a/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith.jpg b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith.jpg new file mode 100644 index 000000000..5df1b31a4 Binary files /dev/null and b/Assets.xcassets/thumb_Monolith.imageset/thumb_Monolith.jpg differ diff --git a/Assets.xcassets/thumb_Moondaze.imageset/Contents.json b/Assets.xcassets/thumb_Moondaze.imageset/Contents.json new file mode 100644 index 000000000..0d9d4fe37 --- /dev/null +++ b/Assets.xcassets/thumb_Moondaze.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Moondaze.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Moondaze 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Moondaze 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 1.jpg b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 1.jpg new file mode 100644 index 000000000..903065650 Binary files /dev/null and b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 1.jpg differ diff --git a/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 2.jpg b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 2.jpg new file mode 100644 index 000000000..903065650 Binary files /dev/null and b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze 2.jpg differ diff --git a/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze.jpg b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze.jpg new file mode 100644 index 000000000..903065650 Binary files /dev/null and b/Assets.xcassets/thumb_Moondaze.imageset/thumb_Moondaze.jpg differ diff --git a/Assets.xcassets/thumb_Moonlight.imageset/Contents.json b/Assets.xcassets/thumb_Moonlight.imageset/Contents.json new file mode 100644 index 000000000..5bac225ed --- /dev/null +++ b/Assets.xcassets/thumb_Moonlight.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Moonlight.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Moonlight 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Moonlight 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 1.jpg b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 1.jpg new file mode 100644 index 000000000..2bb4647b9 Binary files /dev/null and b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 1.jpg differ diff --git a/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 2.jpg b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 2.jpg new file mode 100644 index 000000000..2bb4647b9 Binary files /dev/null and b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight 2.jpg differ diff --git a/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight.jpg b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight.jpg new file mode 100644 index 000000000..2bb4647b9 Binary files /dev/null and b/Assets.xcassets/thumb_Moonlight.imageset/thumb_Moonlight.jpg differ diff --git a/Assets.xcassets/thumb_Moonrise.imageset/Contents.json b/Assets.xcassets/thumb_Moonrise.imageset/Contents.json new file mode 100644 index 000000000..3cd9a7ebc --- /dev/null +++ b/Assets.xcassets/thumb_Moonrise.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Moonrise.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Moonrise 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Moonrise 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 1.jpg b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 1.jpg new file mode 100644 index 000000000..6ae425010 Binary files /dev/null and b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 1.jpg differ diff --git a/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 2.jpg b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 2.jpg new file mode 100644 index 000000000..6ae425010 Binary files /dev/null and b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise 2.jpg differ diff --git a/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise.jpg b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise.jpg new file mode 100644 index 000000000..6ae425010 Binary files /dev/null and b/Assets.xcassets/thumb_Moonrise.imageset/thumb_Moonrise.jpg differ diff --git a/Assets.xcassets/thumb_Nexus.imageset/Contents.json b/Assets.xcassets/thumb_Nexus.imageset/Contents.json new file mode 100644 index 000000000..9b93391c1 --- /dev/null +++ b/Assets.xcassets/thumb_Nexus.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_terrace1.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_terrace1 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_terrace1 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 1.jpg b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 1.jpg new file mode 100644 index 000000000..96d0ba19c Binary files /dev/null and b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 1.jpg differ diff --git a/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 2.jpg b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 2.jpg new file mode 100644 index 000000000..96d0ba19c Binary files /dev/null and b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1 2.jpg differ diff --git a/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1.jpg b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1.jpg new file mode 100644 index 000000000..96d0ba19c Binary files /dev/null and b/Assets.xcassets/thumb_Nexus.imageset/thumb_terrace1.jpg differ diff --git a/Assets.xcassets/thumb_Polar.imageset/Contents.json b/Assets.xcassets/thumb_Polar.imageset/Contents.json new file mode 100644 index 000000000..ea734db03 --- /dev/null +++ b/Assets.xcassets/thumb_Polar.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Polar.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Polar 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Polar 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 1.jpg b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 1.jpg new file mode 100644 index 000000000..f5ed0bf64 Binary files /dev/null and b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 1.jpg differ diff --git a/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 2.jpg b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 2.jpg new file mode 100644 index 000000000..f5ed0bf64 Binary files /dev/null and b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar 2.jpg differ diff --git a/Assets.xcassets/thumb_Polar.imageset/thumb_Polar.jpg b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar.jpg new file mode 100644 index 000000000..f5ed0bf64 Binary files /dev/null and b/Assets.xcassets/thumb_Polar.imageset/thumb_Polar.jpg differ diff --git a/Assets.xcassets/thumb_Reach.imageset/Contents.json b/Assets.xcassets/thumb_Reach.imageset/Contents.json new file mode 100644 index 000000000..58b0c5801 --- /dev/null +++ b/Assets.xcassets/thumb_Reach.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Reach.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Reach 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Reach 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 1.jpg b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 1.jpg new file mode 100644 index 000000000..6d66b4b16 Binary files /dev/null and b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 1.jpg differ diff --git a/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 2.jpg b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 2.jpg new file mode 100644 index 000000000..6d66b4b16 Binary files /dev/null and b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach 2.jpg differ diff --git a/Assets.xcassets/thumb_Reach.imageset/thumb_Reach.jpg b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach.jpg new file mode 100644 index 000000000..6d66b4b16 Binary files /dev/null and b/Assets.xcassets/thumb_Reach.imageset/thumb_Reach.jpg differ diff --git a/Assets.xcassets/thumb_Realm.imageset/Contents.json b/Assets.xcassets/thumb_Realm.imageset/Contents.json new file mode 100644 index 000000000..74d110b20 --- /dev/null +++ b/Assets.xcassets/thumb_Realm.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_santorini1.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_santorini1 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_santorini1 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 1.jpg b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 1.jpg new file mode 100644 index 000000000..a2654f9b9 Binary files /dev/null and b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 1.jpg differ diff --git a/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 2.jpg b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 2.jpg new file mode 100644 index 000000000..a2654f9b9 Binary files /dev/null and b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1 2.jpg differ diff --git a/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1.jpg b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1.jpg new file mode 100644 index 000000000..a2654f9b9 Binary files /dev/null and b/Assets.xcassets/thumb_Realm.imageset/thumb_santorini1.jpg differ diff --git a/Assets.xcassets/thumb_Rubble.imageset/Contents.json b/Assets.xcassets/thumb_Rubble.imageset/Contents.json new file mode 100644 index 000000000..8fb57b387 --- /dev/null +++ b/Assets.xcassets/thumb_Rubble.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Rubble.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Rubble 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Rubble 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 1.jpg b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 1.jpg new file mode 100644 index 000000000..9abeececb Binary files /dev/null and b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 1.jpg differ diff --git a/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 2.jpg b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 2.jpg new file mode 100644 index 000000000..9abeececb Binary files /dev/null and b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble 2.jpg differ diff --git a/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble.jpg b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble.jpg new file mode 100644 index 000000000..9abeececb Binary files /dev/null and b/Assets.xcassets/thumb_Rubble.imageset/thumb_Rubble.jpg differ diff --git a/Assets.xcassets/thumb_Shroom.imageset/Contents.json b/Assets.xcassets/thumb_Shroom.imageset/Contents.json new file mode 100644 index 000000000..7276f06f2 --- /dev/null +++ b/Assets.xcassets/thumb_Shroom.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_street 1.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_street.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_street 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Shroom.imageset/thumb_street 1.jpg b/Assets.xcassets/thumb_Shroom.imageset/thumb_street 1.jpg new file mode 100644 index 000000000..9593f90ea Binary files /dev/null and b/Assets.xcassets/thumb_Shroom.imageset/thumb_street 1.jpg differ diff --git a/Assets.xcassets/thumb_Shroom.imageset/thumb_street 2.jpg b/Assets.xcassets/thumb_Shroom.imageset/thumb_street 2.jpg new file mode 100644 index 000000000..9593f90ea Binary files /dev/null and b/Assets.xcassets/thumb_Shroom.imageset/thumb_street 2.jpg differ diff --git a/Assets.xcassets/thumb_Shroom.imageset/thumb_street.jpg b/Assets.xcassets/thumb_Shroom.imageset/thumb_street.jpg new file mode 100644 index 000000000..9593f90ea Binary files /dev/null and b/Assets.xcassets/thumb_Shroom.imageset/thumb_street.jpg differ diff --git a/Assets.xcassets/thumb_Stalked.imageset/Contents.json b/Assets.xcassets/thumb_Stalked.imageset/Contents.json new file mode 100644 index 000000000..d3ef06f34 --- /dev/null +++ b/Assets.xcassets/thumb_Stalked.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Stalked.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Stalked 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Stalked 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 1.jpg b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 1.jpg new file mode 100644 index 000000000..4ce9f7393 Binary files /dev/null and b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 1.jpg differ diff --git a/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 2.jpg b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 2.jpg new file mode 100644 index 000000000..4ce9f7393 Binary files /dev/null and b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked 2.jpg differ diff --git a/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked.jpg b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked.jpg new file mode 100644 index 000000000..4ce9f7393 Binary files /dev/null and b/Assets.xcassets/thumb_Stalked.imageset/thumb_Stalked.jpg differ diff --git a/Assets.xcassets/thumb_Station.imageset/Contents.json b/Assets.xcassets/thumb_Station.imageset/Contents.json new file mode 100644 index 000000000..a42d7ff63 --- /dev/null +++ b/Assets.xcassets/thumb_Station.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Station.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Station 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Station 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Station.imageset/thumb_Station 1.jpg b/Assets.xcassets/thumb_Station.imageset/thumb_Station 1.jpg new file mode 100644 index 000000000..3cecd4d7a Binary files /dev/null and b/Assets.xcassets/thumb_Station.imageset/thumb_Station 1.jpg differ diff --git a/Assets.xcassets/thumb_Station.imageset/thumb_Station 2.jpg b/Assets.xcassets/thumb_Station.imageset/thumb_Station 2.jpg new file mode 100644 index 000000000..3cecd4d7a Binary files /dev/null and b/Assets.xcassets/thumb_Station.imageset/thumb_Station 2.jpg differ diff --git a/Assets.xcassets/thumb_Station.imageset/thumb_Station.jpg b/Assets.xcassets/thumb_Station.imageset/thumb_Station.jpg new file mode 100644 index 000000000..3cecd4d7a Binary files /dev/null and b/Assets.xcassets/thumb_Station.imageset/thumb_Station.jpg differ diff --git a/Assets.xcassets/thumb_Trackday.imageset/Contents.json b/Assets.xcassets/thumb_Trackday.imageset/Contents.json new file mode 100644 index 000000000..3e555d630 --- /dev/null +++ b/Assets.xcassets/thumb_Trackday.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Trackday.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Trackday 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Trackday 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 1.jpg b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 1.jpg new file mode 100644 index 000000000..42509dfe9 Binary files /dev/null and b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 1.jpg differ diff --git a/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 2.jpg b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 2.jpg new file mode 100644 index 000000000..42509dfe9 Binary files /dev/null and b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday 2.jpg differ diff --git a/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday.jpg b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday.jpg new file mode 100644 index 000000000..42509dfe9 Binary files /dev/null and b/Assets.xcassets/thumb_Trackday.imageset/thumb_Trackday.jpg differ diff --git a/Assets.xcassets/thumb_Zenith.imageset/Contents.json b/Assets.xcassets/thumb_Zenith.imageset/Contents.json new file mode 100644 index 000000000..0d5455942 --- /dev/null +++ b/Assets.xcassets/thumb_Zenith.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_Zenith.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_Zenith 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_Zenith 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 1.jpg b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 1.jpg new file mode 100644 index 000000000..b95c32373 Binary files /dev/null and b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 1.jpg differ diff --git a/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 2.jpg b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 2.jpg new file mode 100644 index 000000000..b95c32373 Binary files /dev/null and b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith 2.jpg differ diff --git a/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith.jpg b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith.jpg new file mode 100644 index 000000000..b95c32373 Binary files /dev/null and b/Assets.xcassets/thumb_Zenith.imageset/thumb_Zenith.jpg differ diff --git a/Assets.xcassets/thumb_arc.imageset/Contents.json b/Assets.xcassets/thumb_arc.imageset/Contents.json new file mode 100644 index 000000000..275cec271 --- /dev/null +++ b/Assets.xcassets/thumb_arc.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_arc.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_arc 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_arc 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_arc.imageset/thumb_arc 1.jpg b/Assets.xcassets/thumb_arc.imageset/thumb_arc 1.jpg new file mode 100644 index 000000000..09ce7a039 Binary files /dev/null and b/Assets.xcassets/thumb_arc.imageset/thumb_arc 1.jpg differ diff --git a/Assets.xcassets/thumb_arc.imageset/thumb_arc 2.jpg b/Assets.xcassets/thumb_arc.imageset/thumb_arc 2.jpg new file mode 100644 index 000000000..09ce7a039 Binary files /dev/null and b/Assets.xcassets/thumb_arc.imageset/thumb_arc 2.jpg differ diff --git a/Assets.xcassets/thumb_arc.imageset/thumb_arc.jpg b/Assets.xcassets/thumb_arc.imageset/thumb_arc.jpg new file mode 100644 index 000000000..09ce7a039 Binary files /dev/null and b/Assets.xcassets/thumb_arc.imageset/thumb_arc.jpg differ diff --git a/Assets.xcassets/thumb_camo.imageset/Contents.json b/Assets.xcassets/thumb_camo.imageset/Contents.json new file mode 100644 index 000000000..baea1e8bd --- /dev/null +++ b/Assets.xcassets/thumb_camo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_camo.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_camo 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_camo 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_camo.imageset/thumb_camo 1.jpg b/Assets.xcassets/thumb_camo.imageset/thumb_camo 1.jpg new file mode 100644 index 000000000..12ca6c10e Binary files /dev/null and b/Assets.xcassets/thumb_camo.imageset/thumb_camo 1.jpg differ diff --git a/Assets.xcassets/thumb_camo.imageset/thumb_camo 2.jpg b/Assets.xcassets/thumb_camo.imageset/thumb_camo 2.jpg new file mode 100644 index 000000000..12ca6c10e Binary files /dev/null and b/Assets.xcassets/thumb_camo.imageset/thumb_camo 2.jpg differ diff --git a/Assets.xcassets/thumb_camo.imageset/thumb_camo.jpg b/Assets.xcassets/thumb_camo.imageset/thumb_camo.jpg new file mode 100644 index 000000000..12ca6c10e Binary files /dev/null and b/Assets.xcassets/thumb_camo.imageset/thumb_camo.jpg differ diff --git a/Assets.xcassets/thumb_cobblestone.imageset/Contents.json b/Assets.xcassets/thumb_cobblestone.imageset/Contents.json new file mode 100644 index 000000000..a2ae8e9e7 --- /dev/null +++ b/Assets.xcassets/thumb_cobblestone.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_cobblestone1.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_cobblestone1 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_cobblestone1 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 1.jpg b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 1.jpg new file mode 100644 index 000000000..df1fb78cd Binary files /dev/null and b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 1.jpg differ diff --git a/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 2.jpg b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 2.jpg new file mode 100644 index 000000000..657e18456 Binary files /dev/null and b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1 2.jpg differ diff --git a/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1.jpg b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1.jpg new file mode 100644 index 000000000..2f1dcb458 Binary files /dev/null and b/Assets.xcassets/thumb_cobblestone.imageset/thumb_cobblestone1.jpg differ diff --git a/Assets.xcassets/thumb_nebula.imageset/Contents.json b/Assets.xcassets/thumb_nebula.imageset/Contents.json new file mode 100644 index 000000000..c644c0a7e --- /dev/null +++ b/Assets.xcassets/thumb_nebula.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_nebula.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_nebula 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_nebula 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 1.jpg b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 1.jpg new file mode 100644 index 000000000..67b3b8fff Binary files /dev/null and b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 1.jpg differ diff --git a/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 2.jpg b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 2.jpg new file mode 100644 index 000000000..67b3b8fff Binary files /dev/null and b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula 2.jpg differ diff --git a/Assets.xcassets/thumb_nebula.imageset/thumb_nebula.jpg b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula.jpg new file mode 100644 index 000000000..67b3b8fff Binary files /dev/null and b/Assets.xcassets/thumb_nebula.imageset/thumb_nebula.jpg differ diff --git a/Assets.xcassets/thumb_oasis.imageset/Contents.json b/Assets.xcassets/thumb_oasis.imageset/Contents.json new file mode 100644 index 000000000..ee6fd2691 --- /dev/null +++ b/Assets.xcassets/thumb_oasis.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_oasis.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_oasis 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_oasis 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 1.jpg b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 1.jpg new file mode 100644 index 000000000..ef57c0d1c Binary files /dev/null and b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 1.jpg differ diff --git a/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 2.jpg b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 2.jpg new file mode 100644 index 000000000..ef57c0d1c Binary files /dev/null and b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis 2.jpg differ diff --git a/Assets.xcassets/thumb_oasis.imageset/thumb_oasis.jpg b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis.jpg new file mode 100644 index 000000000..ef57c0d1c Binary files /dev/null and b/Assets.xcassets/thumb_oasis.imageset/thumb_oasis.jpg differ diff --git a/Assets.xcassets/thumb_outpost.imageset/Contents.json b/Assets.xcassets/thumb_outpost.imageset/Contents.json new file mode 100644 index 000000000..b6a253f9e --- /dev/null +++ b/Assets.xcassets/thumb_outpost.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "thumb_outpost.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "thumb_outpost 1.jpg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "thumb_outpost 2.jpg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 1.jpg b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 1.jpg new file mode 100644 index 000000000..06c229b4c Binary files /dev/null and b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 1.jpg differ diff --git a/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 2.jpg b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 2.jpg new file mode 100644 index 000000000..06c229b4c Binary files /dev/null and b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost 2.jpg differ diff --git a/Assets.xcassets/thumb_outpost.imageset/thumb_outpost.jpg b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost.jpg new file mode 100644 index 000000000..06c229b4c Binary files /dev/null and b/Assets.xcassets/thumb_outpost.imageset/thumb_outpost.jpg differ diff --git a/COOP_TESTING_GUIDE.md b/COOP_TESTING_GUIDE.md new file mode 100644 index 000000000..60ffd901b --- /dev/null +++ b/COOP_TESTING_GUIDE.md @@ -0,0 +1,146 @@ +# SharePlay Co-op Testing Guide + +## 🎮 What Was Implemented + +Remote co-op multiplayer via SharePlay - two Vision Pro users can play local co-op games together by both streaming from the same gaming PC. + +--- + +## ✅ Pre-Testing Checklist + +### On Your Gaming PC: +1. **Sunshine is running** and accessible on your network +2. **Multiple connections enabled** in Sunshine settings (if there's a limit setting) +3. **Local co-op game installed** (recommended: It Takes Two, Overcooked 2, Cuphead) + +### On Both Vision Pros: +1. **Both devices on same WiFi** (for initial testing) +2. **Latest build installed** on both devices +3. **FaceTime enabled** and signed in with Apple ID +4. **Both devices paired** with your gaming PC (normal Moonlight pairing) + +--- + +## 🚀 How to Test + +### Step 1: Start FaceTime Call +- Start a FaceTime call between the two Vision Pros +- Keep the call active throughout testing + +### Step 2: Start Co-op Session (Vision Pro #1 - Host) +1. Open Moonlight app +2. You'll see your gaming PC with **two buttons**: "Connect" and "Co-op" +3. Tap the **"Co-op"** button (violet/purple color) +4. Select the co-op game you want to play +5. Tap **"Start Co-op Session"** +6. SharePlay invitation should appear +7. Send invitation to Vision Pro #2 + +### Step 3: Join Session (Vision Pro #2 - Guest) +1. Accept the SharePlay invitation +2. Moonlight app should open automatically +3. You'll see "Joining co-op session" screen +4. App will auto-pair with the gaming PC (using shared certificates) +5. Game should auto-launch + +### Step 4: Play Together! +- Vision Pro #1: Controller slot 0 (Player 1) +- Vision Pro #2: Controller slot 1 (Player 2) +- Both should see the same game +- Both controllers should work independently +- **Look for the "2P" badge** in the top controls (fades with other icons) + +--- + +## 🔍 What to Watch For + +### Expected Behavior: +✅ Both devices stream video from the same PC +✅ Controllers work independently (not mirrored) +✅ Audio plays on both devices (game audio + FaceTime voice) +✅ Display modes can be different (one curved, one flat) +✅ Resolution/HDR can be independent + +### Potential Issues to Test: + +1. **Frame Rate Mismatch** + - If guest has different frame rate setting, should show error + - Both must have matching frame rate (60fps, 90fps, or 120fps) + +2. **Connection Failures** + - If Sunshine blocks second connection, will show connection error + - Check Sunshine logs for "maximum connections reached" + +3. **Controller Assignment** + - Verify Player 1's controller controls Player 1 in-game + - Verify Player 2's controller controls Player 2 in-game + - In-game, check controller indicators/player slots + +4. **Disconnect Handling** + - Tap "Disconnect" button on one device + - Other device should continue streaming (solo) + - Or both disconnect if co-op session ends + +5. **Reconnection** + - After disconnecting, try starting another co-op session + - Guest should auto-connect without re-pairing + - Check if guest's device has the PC saved as "🎮 Co-op: [Your Name]'s PC" + +--- + +## 🐛 Known Limitations (MVP) + +- **2 players max** (can expand to 4 later) +- **Frame rate must match** between players +- **No in-game voice chat** (use FaceTime audio) +- **Controller disconnect notification** not yet implemented +- **Sunshine connection limit detection** shows generic error + +--- + +## 📝 Testing Scenarios + +### Scenario 1: Basic Co-op +1. Start FaceTime +2. Host starts co-op +3. Guest joins +4. Both play together +5. Host disconnects +6. Verify guest can continue solo + +### Scenario 2: Second Session +1. Complete Scenario 1 +2. Start new FaceTime call +3. Host starts co-op again (same or different game) +4. Guest should auto-join faster (PC already paired) + +### Scenario 3: Display Mode Mix +1. Host uses Curved Display +2. Guest uses Flat Display +3. Verify both work correctly + +### Scenario 4: Quality Settings +1. Host at 4K HDR 120fps +2. Guest at 1080p SDR 120fps (same frame rate) +3. Verify both stream correctly at different qualities + +--- + +## 🎬 How to Record Issues + +If something breaks: +1. Check console logs on both devices +2. Look for `[CoopCoordinator]`, `[CoopSetup]` log messages +3. Note the exact step where it failed +4. Check Sunshine logs on gaming PC + +--- + +## 🏷️ Rollback + +If this feature causes issues: +```bash +git checkout Before-SharePlay-Coop +``` + +This will revert all co-op changes and restore the app to the previous working state. diff --git a/HDRControlPanel.swift b/HDRControlPanel.swift index 3e11facc7..6130b74b4 100644 --- a/HDRControlPanel.swift +++ b/HDRControlPanel.swift @@ -2,7 +2,7 @@ // HDRControlPanel.swift // Moonlight Vision // -// Created by AI Assistant on 1/19/25. +// Created by AI Assistant on 1/19/25. Updated May 2026 by NeoVector X. // Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. // @@ -11,200 +11,215 @@ import SwiftUI struct HDRControlPanel: View { @ObservedObject var settings: HDRSettings @Binding var isPresented: Bool - - @State private var showAdvanced = false - + /// Pushed on every slider tick from this panel (RealityKit attachments do not always propagate parent `onChange`). + var onLiveUpdate: (() -> Void)? = nil + /// Curved-display attachment uses `0.6`; flat display passes `1.0` where the panel is not embedded as a shrunk attachment. + var attachmentLayoutScale: CGFloat = 0.6 + /// When `true` and Reference HDR is on: grading sliders keep full layout but lose orange accent and do not accept drags (flat and curved pass this). + var dimInactiveGradingControlsWhenReferenceHDR: Bool = false + + private var referenceHDRNeutralGradingSliderChrome: Bool { + dimInactiveGradingControlsWhenReferenceHDR && settings.referenceHDR + } + + private let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + private let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + var body: some View { VStack(alignment: .leading, spacing: 24) { + // Header HStack { VStack(alignment: .leading, spacing: 4) { Text("Enhanced HDR") - .font(.title2) - .fontWeight(.semibold) - Text("Fine-tune your display quality") - .font(.caption) - .foregroundStyle(.secondary) + .font(.system(size: 24, weight: .bold)) + .foregroundColor(.white) + Text("Fine-tune color and exposure") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.5)) } - Spacer() - Button { - withAnimation(.easeInOut(duration: 0.3)) { - isPresented = false - } + withAnimation { isPresented = false } } label: { Image(systemName: "xmark.circle.fill") - .foregroundStyle(.secondary) - .imageScale(.large) + .font(.system(size: 32)) + .foregroundColor(.white.opacity(0.8)) } .buttonStyle(.plain) } - - Divider() - - // Display Quality Section - VStack(alignment: .leading, spacing: 16) { - Text("Display Quality") - .font(.headline) - .foregroundStyle(.secondary) - - HDRSlider( - title: "Brightness", - value: $settings.brightness, - range: 0.5...2.0, - defaultValue: 1.0, - icon: "sun.max.fill" - ) - - HDRSlider( - title: "Contrast", - value: $settings.contrast, - range: 0.5...2.0, - defaultValue: 1.15, - icon: "circle.lefthalf.filled" - ) - - HDRSlider( - title: "Saturation", - value: $settings.saturation, - range: 0.0...2.0, - defaultValue: 1.0, - icon: "paintpalette.fill" - ) + + dividerLine + + // Display Quality + VStack(alignment: .leading, spacing: 18) { + sectionLabel("Display Quality") + + HDRSlider(title: "Brightness", value: $settings.brightness, range: 0.5...2.0, defaultValue: 1.35, icon: "sun.max.fill", brandOrange: brandOrange, neutralChrome: referenceHDRNeutralGradingSliderChrome) + VStack(alignment: .leading, spacing: 4) { + HDRSlider(title: "Contrast", value: $settings.contrast, range: 0.5...2.0, defaultValue: 1.15, icon: "circle.lefthalf.filled", brandOrange: brandOrange, neutralChrome: referenceHDRNeutralGradingSliderChrome) + Text("Values below 1.0 brighten dark areas toward mid-tones.") + .font(.system(size: 10)) + .foregroundColor(.white.opacity(0.38)) + .fixedSize(horizontal: false, vertical: true) + } + HDRSlider(title: "Saturation", value: $settings.saturation, range: 0.0...2.0, defaultValue: 1.40, icon: "paintpalette.fill", brandOrange: brandOrange, neutralChrome: referenceHDRNeutralGradingSliderChrome) } - - Divider() - - // Advanced Section - DisclosureGroup(isExpanded: $showAdvanced) { - VStack(alignment: .leading, spacing: 16) { - HDRSlider( - title: "Luminance", - value: $settings.luminance, - range: 100...1000, - defaultValue: 300, - icon: "lightbulb.fill", - unit: " nits", - step: 10 - ) - - HDRSlider( - title: "Gamma", - value: $settings.gamma, - range: 1.8...2.8, - defaultValue: 2.2, - icon: "chart.line.uptrend.xyaxis", - step: 0.1 - ) - - HDRSlider( - title: "Peak Brightness", - value: $settings.peakBrightness, - range: 400...1600, - defaultValue: 800, - icon: "sun.max.circle.fill", - unit: " nits", - step: 50 + + dividerLine + + // Exposure + VStack(alignment: .leading, spacing: 18) { + sectionLabel("Exposure") + HDRSlider(title: "Exposure", value: $settings.pqExposure, range: 0.5...2.0, defaultValue: 1.0, icon: "dial.medium.fill", brandOrange: brandOrange, neutralChrome: referenceHDRNeutralGradingSliderChrome) + } + + dividerLine + + VStack(alignment: .leading, spacing: 12) { + sectionLabel("Accuracy") + Toggle(isOn: $settings.referenceHDR) { + ( + Text("Reference HDR") + .font(.system(size: 15, weight: .medium)) + .foregroundColor(.white) + + Text(" – Adjustments via sliders or filters do not apply when enabled.") + .font(.system(size: 11)) + .foregroundColor(.white.opacity(0.45)) ) + .fixedSize(horizontal: false, vertical: true) } - .padding(.top, 12) - } label: { - HStack { - Text("Advanced") - .font(.headline) - .foregroundStyle(.secondary) - Spacer() - } + .tint(brandOrange) } - .tint(.primary) - - Divider() - - // Reset Button + + dividerLine + + // Reset HStack { Spacer() Button { - withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) { - settings.reset() - } + withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) { settings.reset() } } label: { Label("Reset to Defaults", systemImage: "arrow.counterclockwise") - .font(.subheadline) + .font(.system(size: 14, weight: .medium)) + .foregroundColor(.white.opacity(0.7)) + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .stroke(Color.white.opacity(0.2), lineWidth: 1) + ) } - .buttonStyle(.bordered) + .buttonStyle(.plain) Spacer() } } - .padding(28) - .frame(width: 450) - .glassBackgroundEffect() - .onChange(of: settings.brightness) { _, _ in settings.save() } - .onChange(of: settings.contrast) { _, _ in settings.save() } - .onChange(of: settings.saturation) { _, _ in settings.save() } - .onChange(of: settings.luminance) { _, _ in settings.save() } - .onChange(of: settings.gamma) { _, _ in settings.save() } - .onChange(of: settings.peakBrightness) { _, _ in settings.save() } + .padding(32) + .frame(width: 520) + .background( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: 20, x: 0, y: 10) + ) + .overlay( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) + .scaleEffect(attachmentLayoutScale) + .onChange(of: settings.brightness) { _, _ in notifyPanelValueChanged() } + .onChange(of: settings.contrast) { _, _ in notifyPanelValueChanged() } + .onChange(of: settings.saturation) { _, _ in notifyPanelValueChanged() } + .onChange(of: settings.pqExposure) { _, _ in notifyPanelValueChanged() } + .onChange(of: settings.referenceHDR) { _, _ in notifyPanelValueChanged() } + } + + private func notifyPanelValueChanged() { + settings.save() + onLiveUpdate?() + } + + private var dividerLine: some View { + Rectangle() + .fill(Color.white.opacity(0.1)) + .frame(height: 1) + } + + private func sectionLabel(_ text: String) -> some View { + Text(text) + .font(.system(size: 11, weight: .semibold)) + .foregroundColor(.white.opacity(0.45)) + .textCase(.uppercase) + .kerning(1.0) } } -// Custom HDR Slider Component +// MARK: - HDR Slider + struct HDRSlider: View { let title: String @Binding var value: Float let range: ClosedRange let defaultValue: Float let icon: String - var unit: String = "" + let brandOrange: Color var step: Float = 0.01 - + /// Reference HDR + stream flag: no orange accent, sliders do not move (layout unchanged). + var neutralChrome: Bool = false + @State private var isResetting = false - + + private var sliderTint: Color { + neutralChrome ? Color.white.opacity(0.28) : brandOrange + } + + private var chromeInteractive: Bool { !neutralChrome } + var body: some View { VStack(alignment: .leading, spacing: 8) { HStack { Label(title, systemImage: icon) - .font(.subheadline) - .foregroundStyle(.primary) - + .font(.system(size: 15, weight: .medium)) + .foregroundColor(.white) + Spacer() - - // Value display with unit - Text(String(format: unit.isEmpty ? "%.2f" : "%.0f", value) + unit) - .font(.subheadline) - .foregroundStyle(.secondary) - .monospacedDigit() - .frame(minWidth: 60, alignment: .trailing) - - // Reset to default button + + Text(String(format: "%.2f", value)) + .font(.system(size: 14).monospacedDigit()) + .foregroundColor(.white.opacity(0.5)) + .frame(minWidth: 44, alignment: .trailing) + Button { withAnimation(.spring(response: 0.2, dampingFraction: 0.8)) { value = defaultValue isResetting = true } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - isResetting = false - } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { isResetting = false } } label: { Image(systemName: "arrow.counterclockwise") - .font(.caption) - .foregroundStyle(abs(value - defaultValue) < 0.01 ? .tertiary : .secondary) + .font(.system(size: 12)) + .foregroundColor(abs(value - defaultValue) < 0.01 ? Color.white.opacity(0.2) : Color.white.opacity(0.6)) } .buttonStyle(.plain) .scaleEffect(isResetting ? 0.8 : 1.0) - .disabled(abs(value - defaultValue) < 0.01) + .disabled(!chromeInteractive || abs(value - defaultValue) < 0.01) } - + Slider( value: Binding( get: { value }, - set: { newValue in - value = (newValue / step).rounded() * step - } + set: { newValue in value = (newValue / step).rounded() * step } ), in: range ) - .tint(.blue) + .tint(sliderTint) + .disabled(!chromeInteractive) } } } @@ -212,7 +227,6 @@ struct HDRSlider: View { #Preview { @State var isPresented = true @StateObject var settings = HDRSettings() - return HDRControlPanel(settings: settings, isPresented: $isPresented) - .frame(width: 600, height: 800) -} \ No newline at end of file + .padding() +} diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index 4d357e67b..2e012340b 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -34,7 +34,9 @@ realitykitRendererAnimateOpening:(BOOL)realitykitRendererAnimateOpening realitykitRendererCurvature:(NSNumber*)realitykitRendererCurvature dimPassthrough:(BOOL)dimPassthrough - hideSystemCursor:(BOOL)hideSystemCursor; + hideSystemCursor:(BOOL)hideSystemCursor + showMicButton:(BOOL)showMicButton + hideHandsIn360Environment:(BOOL)hideHandsIn360Environment; - (NSArray*) getHosts; - (void) updateHost:(TemporaryHost*)host; @@ -47,4 +49,10 @@ realitykitRendererAnimateOpening:(BOOL)realitykitRendererAnimateOpening - (void) updateUniqueId:(NSString*)uniqueId; - (NSString*) getUniqueId; +// Co-op Session Support +- (NSData* _Nullable) exportPairingDataForHost:(TemporaryHost*)host; +- (TemporaryHost* _Nullable) importPairingData:(NSData*)data address:(NSString*)address name:(NSString*)name coopTag:(NSString* _Nullable)coopTag; +- (TemporaryHost* _Nullable) findHostByAddress:(NSString*)address; +- (void) removeCoopHosts; + @end \ No newline at end of file diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 07bb49563..5487a33c7 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -72,7 +72,9 @@ - (void) saveSettingsWithBitrate:(NSInteger)bitrate realitykitRendererAnimateOpening:(BOOL)realitykitRendererAnimateOpening realitykitRendererCurvature:(NSNumber*)realitykitRendererCurvature dimPassthrough:(BOOL)dimPassthrough - hideSystemCursor:(BOOL)hideSystemCursor { + hideSystemCursor:(BOOL)hideSystemCursor + showMicButton:(BOOL)showMicButton + hideHandsIn360Environment:(BOOL)hideHandsIn360Environment { [_managedObjectContext performBlockAndWait:^{ MoonlightSettings* settingsToSave = [self retrieveSettings]; settingsToSave.framerate = [NSNumber numberWithInteger:framerate]; @@ -96,6 +98,8 @@ - (void) saveSettingsWithBitrate:(NSInteger)bitrate settingsToSave.realitykitRendererCurvature = realitykitRendererCurvature; settingsToSave.dimPassthrough = [NSNumber numberWithBool: dimPassthrough]; settingsToSave.hideSystemCursor = [NSNumber numberWithBool:hideSystemCursor]; + settingsToSave.showMicButton = [NSNumber numberWithBool:showMicButton]; + settingsToSave.hideHandsIn360Environment = [NSNumber numberWithBool:hideHandsIn360Environment]; [self saveData]; }]; } @@ -195,6 +199,26 @@ - (void) removeHost:(TemporaryHost*)host { }]; } +- (void) removeCoopHosts { + [_managedObjectContext performBlockAndWait:^{ + NSArray *hosts = [self fetchRecords:@"Host"]; + BOOL didDelete = NO; + + for (MoonlightHost* host in hosts) { + if ([host.name hasPrefix:@"🎮 Co-op:"]) { + Log(LOG_I, @"Removing co-op host from database: %@", host.name); + [self->_managedObjectContext deleteObject:host]; + didDelete = YES; + } + } + + if (didDelete) { + [self saveData]; + Log(LOG_I, @"Co-op hosts removed from database"); + } + }]; +} + - (void) saveData { NSError* error; if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error]) { @@ -259,4 +283,121 @@ - (NSArray*) fetchRecords:(NSString*)entityName { return fetchedRecords; } +// MARK: - Co-op Session Support + +- (NSData* _Nullable) exportPairingDataForHost:(TemporaryHost*)host +{ + if (!host || !host.serverCert) { + Log(LOG_W, @"Cannot export pairing data - host or serverCert is nil"); + return nil; + } + + // Package the essential pairing info into a dictionary + NSDictionary *pairingInfo = @{ + @"serverCert": host.serverCert, + @"uuid": host.uuid ?: @"", + @"httpsPort": @(host.httpsPort), + @"pairState": @(host.pairState) + }; + + // Serialize to NSData + NSError *error = nil; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:pairingInfo requiringSecureCoding:NO error:&error]; + + if (error) { + Log(LOG_E, @"Failed to export pairing data: %@", error.localizedDescription); + return nil; + } + + Log(LOG_I, @"Exported pairing data for host: %@", host.name); + return data; +} + +- (TemporaryHost* _Nullable) importPairingData:(NSData*)data address:(NSString*)address name:(NSString*)name coopTag:(NSString* _Nullable)coopTag +{ + if (!data || !address || !name) { + Log(LOG_W, @"Cannot import pairing data - missing required parameters"); + return nil; + } + + // Deserialize pairing info + NSError *error = nil; + NSDictionary *pairingInfo = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] fromData:data error:&error]; + + if (error || !pairingInfo) { + Log(LOG_E, @"Failed to import pairing data: %@", error ? error.localizedDescription : @"Invalid data"); + return nil; + } + + // Check if host already exists (but only for non-coop hosts) + if (!coopTag) { + TemporaryHost *existingHost = [self findHostByAddress:address]; + if (existingHost) { + Log(LOG_I, @"Host already exists: %@", existingHost.name); + return existingHost; + } + } + + // Create new host with imported pairing data + NSString *displayName = coopTag ? [NSString stringWithFormat:@"🎮 Co-op: %@", name] : name; + + // For co-op hosts, create temporary in-memory only host (not saved to Core Data) + if (coopTag) { + TemporaryHost *tempHost = [[TemporaryHost alloc] init]; + tempHost.name = displayName; + tempHost.address = address; + tempHost.localAddress = address; + tempHost.externalAddress = address; + tempHost.activeAddress = address; + tempHost.uuid = pairingInfo[@"uuid"]; + tempHost.serverCert = pairingInfo[@"serverCert"]; + tempHost.pairState = [pairingInfo[@"pairState"] intValue]; + tempHost.httpsPort = [pairingInfo[@"httpsPort"] unsignedShortValue]; + + Log(LOG_I, @"Created temporary co-op host (not saved to database): %@", displayName); + return tempHost; + } + + // For regular hosts, save to Core Data + __block TemporaryHost *newHost = nil; + [_managedObjectContext performBlockAndWait:^{ + MoonlightHost *host = [NSEntityDescription insertNewObjectForEntityForName:@"Host" inManagedObjectContext:self->_managedObjectContext]; + host.name = displayName; + host.address = address; + host.localAddress = address; + host.externalAddress = address; + host.uuid = pairingInfo[@"uuid"]; + host.serverCert = pairingInfo[@"serverCert"]; + host.pairState = pairingInfo[@"pairState"]; + + [self saveData]; + + newHost = [[TemporaryHost alloc] initFromHost:host]; + // Set httpsPort on the TemporaryHost (not persisted in Core Data) + newHost.httpsPort = [pairingInfo[@"httpsPort"] unsignedShortValue]; + }]; + + Log(LOG_I, @"Imported pairing data, created and saved host: %@", displayName); + return newHost; +} + +- (TemporaryHost* _Nullable) findHostByAddress:(NSString*)address +{ + if (!address) { + return nil; + } + + NSArray *allHosts = [self getHosts]; + for (TemporaryHost *host in allHosts) { + if ([host.address isEqualToString:address] || + [host.localAddress isEqualToString:address] || + [host.externalAddress isEqualToString:address] || + [host.activeAddress isEqualToString:address]) { + return host; + } + } + + return nil; +} + @end \ No newline at end of file diff --git a/Limelight/Input/ControllerSupport.h b/Limelight/Input/ControllerSupport.h index 53eba2697..81547d100 100644 --- a/Limelight/Input/ControllerSupport.h +++ b/Limelight/Input/ControllerSupport.h @@ -52,6 +52,9 @@ -(void) setControllerLed:(uint16_t)controllerNumber r:(uint8_t)r g:(uint8_t)g b:(uint8_t)b; +(int) getConnectedGamepadMask:(StreamConfiguration*)streamConfig settings:(TemporarySettings* _Nullable)settings; ++(int) getGamepadMaskForSlot:(int)slot; + +-(void) setSwapABXYButtons:(BOOL)swap; -(NSUInteger) getConnectedGamepadCount; diff --git a/Limelight/Input/ControllerSupport.m b/Limelight/Input/ControllerSupport.m index bb2722b2f..de0b51e25 100644 --- a/Limelight/Input/ControllerSupport.m +++ b/Limelight/Input/ControllerSupport.m @@ -51,6 +51,7 @@ @implementation ControllerSupport { char _controllerNumbers; bool _multiController; bool _swapABXYButtons; + int _controllerSlotOffset; // For co-op: offset added to controller index } // UPDATE_BUTTON_FLAG(controller, flag, pressed) @@ -169,8 +170,12 @@ - (void)detachGCEventInteractionFromView:(UIView *)view { -(void) rumble:(unsigned short)controllerNumber lowFreqMotor:(unsigned short)lowFreqMotor highFreqMotor:(unsigned short)highFreqMotor { - Controller* controller = [_controllers objectForKey:[NSNumber numberWithInteger:controllerNumber]]; - if (controller == nil && controllerNumber == 0 && _oscEnabled) { + // FIX: Adjust the controller number by subtracting the offset to find the LOCAL controller index. + // Host sends command for "Controller 1" (Guest), but locally it is index 0. + int localIndex = controllerNumber - _controllerSlotOffset; + + Controller* controller = [_controllers objectForKey:[NSNumber numberWithInteger:localIndex]]; + if (controller == nil && localIndex == 0 && _oscEnabled) { // TODO: Rumble emulation for OSC } if (controller == nil) { @@ -184,8 +189,11 @@ -(void) rumble:(unsigned short)controllerNumber lowFreqMotor:(unsigned short)low -(void) rumbleTriggers:(uint16_t)controllerNumber leftTrigger:(uint16_t)leftTrigger rightTrigger:(uint16_t)rightTrigger { - Controller* controller = [_controllers objectForKey:[NSNumber numberWithInteger:controllerNumber]]; - if (controller == nil && controllerNumber == 0 && _oscEnabled) { + // FIX: Subtract offset to find local controller + int localIndex = controllerNumber - _controllerSlotOffset; + + Controller* controller = [_controllers objectForKey:[NSNumber numberWithInteger:localIndex]]; + if (controller == nil && localIndex == 0 && _oscEnabled) { // TODO: Trigger rumble emulation for OSC } if (controller == nil) { @@ -431,7 +439,16 @@ -(void) clearButtonFlag:(Controller*)controller flags:(int)flags -(uint16_t) getActiveGamepadMask { - return (_multiController ? _controllerNumbers : 1) | (_oscEnabled ? 1 : 0); + // Base mask: which controllers are present locally + uint16_t baseMask = (_multiController ? _controllerNumbers : 1) | (_oscEnabled ? 1 : 0); + + // FIX: For co-op mode, shift the mask to match the slot offset + // Host (slot 0): mask stays as 0x1 (bit 0 = controller 0 present) + // Guest (slot 1): mask becomes 0x2 (bit 1 = controller 1 present) + if (_controllerSlotOffset > 0) { + return baseMask << _controllerSlotOffset; + } + return baseMask; } -(void) updateFinished:(Controller*)controller @@ -468,7 +485,9 @@ -(void) updateFinished:(Controller*)controller } // Player 1 is always present for OSC - LiSendMultiControllerEvent(_multiController ? controller.playerIndex : 0, [self getActiveGamepadMask], + // Apply co-op slot offset to controller number (guest sends as controller 1, not 0) + int controllerNumber = (_multiController ? controller.playerIndex : 0) + _controllerSlotOffset; + LiSendMultiControllerEvent(controllerNumber, [self getActiveGamepadMask], buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY); } @@ -556,8 +575,50 @@ -(void) initializeControllerBattery:(Controller*) controller { if (@available(iOS 14.0, tvOS 14.0, *)) { if (controller.gamepad.battery) { - // Poll for updated battery status every 30 seconds - controller.batteryTimer = [NSTimer scheduledTimerWithTimeInterval:30 repeats:YES block:^(NSTimer *timer) { + NSLog(@"[Battery] Initializing battery monitoring for playerIndex=%ld, batteryState=%ld, batteryLevel=%.2f", + (long)controller.playerIndex, + (long)controller.gamepad.battery.batteryState, + controller.gamepad.battery.batteryLevel); + + // Send initial battery state unconditionally + { + uint8_t batteryState; + switch (controller.gamepad.battery.batteryState) { + case GCDeviceBatteryStateFull: + batteryState = LI_BATTERY_STATE_FULL; + break; + case GCDeviceBatteryStateCharging: + batteryState = LI_BATTERY_STATE_CHARGING; + break; + case GCDeviceBatteryStateDischarging: + batteryState = LI_BATTERY_STATE_DISCHARGING; + break; + case GCDeviceBatteryStateUnknown: + default: + batteryState = LI_BATTERY_STATE_UNKNOWN; + break; + } + + LiSendControllerBatteryEvent(controller.playerIndex, batteryState, (uint8_t)(controller.gamepad.battery.batteryLevel * 100)); + + controller.lastBatteryState = controller.gamepad.battery.batteryState; + controller.lastBatteryLevel = controller.gamepad.battery.batteryLevel; + + NSLog(@"[Battery] Sending initial battery update to Swift UI: level=%d, state=%u, playerIndex=%ld", + (int)(controller.gamepad.battery.batteryLevel * 100), batteryState, (long)controller.playerIndex); + + // Update Swift UI for primary controller (playerIndex 0) + if (controller.playerIndex == 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[ControllerBatteryState shared] updateBatteryWithLevel:(int)(controller.gamepad.battery.batteryLevel * 100) + state:batteryState + hasController:YES]; + }); + } + } + + // Poll for updated battery status every 5 seconds + controller.batteryTimer = [NSTimer scheduledTimerWithTimeInterval:5 repeats:YES block:^(NSTimer *timer) { if (controller.lastBatteryState != controller.gamepad.battery.batteryState || controller.lastBatteryLevel != controller.gamepad.battery.batteryLevel) { uint8_t batteryState; @@ -582,11 +643,22 @@ -(void) initializeControllerBattery:(Controller*) controller controller.lastBatteryState = controller.gamepad.battery.batteryState; controller.lastBatteryLevel = controller.gamepad.battery.batteryLevel; + + NSLog(@"[Battery] Battery update: level=%d, state=%u, playerIndex=%ld", + (int)(controller.gamepad.battery.batteryLevel * 100), batteryState, (long)controller.playerIndex); + + // Update Swift UI for primary controller (playerIndex 0) + if (controller.playerIndex == 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[ControllerBatteryState shared] updateBatteryWithLevel:(int)(controller.gamepad.battery.batteryLevel * 100) + state:batteryState + hasController:YES]; + }); + } } }]; - - // Fire the timer immediately to send the initial battery state - [controller.batteryTimer fire]; + } else { + NSLog(@"[Battery] No battery available for controller playerIndex=%ld", (long)controller.playerIndex); } } } @@ -595,6 +667,15 @@ -(void) cleanupControllerBattery:(Controller*) controller { if (@available(iOS 14.0, tvOS 14.0, *)) { [controller.batteryTimer invalidate]; + + // Update Swift UI when primary controller disconnects + if (controller.playerIndex == 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[ControllerBatteryState shared] updateBatteryWithLevel:0 + state:LI_BATTERY_STATE_UNKNOWN + hasController:NO]; + }); + } } } @@ -743,7 +824,11 @@ -(BOOL) reportControllerArrival:(Controller*) limeController // Report the new controller to the host // NB: This will fail if the connection hasn't been fully established yet // and we will try again later. - if (LiSendControllerArrivalEvent(controller.playerIndex, + // FIX: Apply co-op slot offset to controller number (must match LiSendMultiControllerEvent) + int controllerNumber = controller.playerIndex + _controllerSlotOffset; + Log(LOG_I, @"Reporting controller arrival: playerIndex=%d, slotOffset=%d, controllerNumber=%d", + controller.playerIndex, _controllerSlotOffset, controllerNumber); + if (LiSendControllerArrivalEvent(controllerNumber, [self getActiveGamepadMask], type, supportedButtonFlags, @@ -1287,11 +1372,24 @@ +(int) getConnectedGamepadMask:(StreamConfiguration*)streamConfig settings:(Temp return mask; } ++(int) getGamepadMaskForSlot:(int)slot +{ + // Return a bitmask for a specific controller slot + // Used for co-op sessions to assign specific slots to players + return 1 << slot; +} + -(NSUInteger) getConnectedGamepadCount { return _controllers.count; } +-(void) setSwapABXYButtons:(BOOL)swap +{ + _swapABXYButtons = swap; + Log(LOG_I, @"Swap A/B X/Y buttons updated to: %d", swap); +} + -(id) initWithConfig:(StreamConfiguration*)streamConfig delegate:(id)delegate { self = [super init]; @@ -1301,7 +1399,10 @@ -(id) initWithConfig:(StreamConfiguration*)streamConfig delegate:(id _hapticPlayer API_AVAILABLE(ios(13.0), tvos(14.0)); + CHHapticEngine* _hapticEngine API_AVAILABLE(ios(13.0), tvos(14.0), visionos(1.0)); + id _hapticPlayer API_AVAILABLE(ios(13.0), tvos(14.0), visionos(1.0)); BOOL _playing; } --(void)cleanup API_AVAILABLE(ios(14.0), tvos(14.0)) { - if (_hapticPlayer != nil) { - [_hapticPlayer cancelAndReturnError:nil]; - _hapticPlayer = nil; - } +-(void)cleanup API_AVAILABLE(ios(14.0), tvos(14.0), visionos(1.0)) { + // Check _hapticEngine first - if stoppedHandler already fired, + // both _hapticEngine and _hapticPlayer will be nil if (_hapticEngine != nil) { + if (_hapticPlayer != nil) { + // Only stop if we were actively playing - avoids exception if engine already stopped + if (_playing) { + [_hapticPlayer stopAtTime:0 error:nil]; + } + _hapticPlayer = nil; + } [_hapticEngine stopWithCompletionHandler:nil]; _hapticEngine = nil; } + _playing = NO; } --(void)setMotorAmplitude:(unsigned short)amplitude API_AVAILABLE(ios(14.0), tvos(14.0)) { +-(void)setMotorAmplitude:(unsigned short)amplitude API_AVAILABLE(ios(14.0), tvos(14.0), visionos(1.0)) { NSError* error; // Check if the haptic engine died @@ -83,27 +89,58 @@ -(void)setMotorAmplitude:(unsigned short)amplitude API_AVAILABLE(ios(14.0), tvos } } --(id) initWithGamepad:(GCController*)gamepad locality:(GCHapticsLocality)locality API_AVAILABLE(ios(14.0), tvos(14.0)) { +-(id) initWithGamepad:(GCController*)gamepad locality:(GCHapticsLocality)locality API_AVAILABLE(ios(14.0), tvos(14.0), visionos(1.0)) { + // 1. DIAGNOSTIC LOGGING + Log(LOG_I, @"[NeoMoonlight] Initializing Haptics for Player %ld...", (long)gamepad.playerIndex); + if (gamepad.haptics == nil) { - Log(LOG_W, @"Controller %d does not support haptics", gamepad.playerIndex); + Log(LOG_W, @"[NeoMoonlight] FAILURE: Controller %ld haptics is NIL.", (long)gamepad.playerIndex); return nil; } + // Log what the OS actually thinks this controller can do + Log(LOG_I, @"[NeoMoonlight] Supported Localities: %@", [gamepad.haptics supportedLocalities]); + + _playerIndex = gamepad.playerIndex; + GCHapticsLocality targetLocality = locality; + + // 2. THE BYPASS LOGIC + // If the requested locality (e.g., LeftHandle) is NOT supported, try 'All' instead of quitting. if (![[gamepad.haptics supportedLocalities] containsObject:locality]) { - Log(LOG_W, @"Controller %d does not support haptic locality: %@", gamepad.playerIndex, locality); + Log(LOG_W, @"[NeoMoonlight] Requested locality %@ missing. Attempting fallback to 'All'...", locality); + targetLocality = GCHapticsLocalityAll; + + // Double check if 'All' is supported, or just force it blindly (Apple sometimes hides capabilities) + if (![[gamepad.haptics supportedLocalities] containsObject:GCHapticsLocalityAll]) { + Log(LOG_W, @"[NeoMoonlight] Even 'All' is not listed. Forcing engine creation anyway as 'Default'..."); + targetLocality = GCHapticsLocalityDefault; + } + } + + // 3. CREATE ENGINE + // We use the determined targetLocality (Original -> All -> Default) + @try { + _hapticEngine = [gamepad.haptics createEngineWithLocality:targetLocality]; + } + @catch (NSException *exception) { + Log(LOG_E, @"[NeoMoonlight] CRASH creating engine: %@", exception); return nil; } - - _playerIndex = gamepad.playerIndex; - _hapticEngine = [gamepad.haptics createEngineWithLocality:locality]; - + + if (_hapticEngine == nil) { + Log(LOG_W, @"[NeoMoonlight] createEngineWithLocality returned nil."); + return nil; + } + NSError* error; [_hapticEngine startAndReturnError:&error]; if (error != nil) { - Log(LOG_W, @"Controller %d: Haptic engine failed to start: %@", gamepad.playerIndex, error); + Log(LOG_W, @"[NeoMoonlight] Haptic engine failed to start: %@", error); return nil; } + Log(LOG_I, @"[NeoMoonlight] SUCCESS: Haptic Engine Started for Player %ld", (long)_playerIndex); + __weak typeof(self) weakSelf = self; _hapticEngine.stoppedHandler = ^(CHHapticEngineStoppedReason stoppedReason) { HapticContext* me = weakSelf; @@ -111,7 +148,7 @@ -(id) initWithGamepad:(GCController*)gamepad locality:(GCHapticsLocality)localit return; } - Log(LOG_W, @"Controller %d: Haptic engine stopped: %p", me->_playerIndex, stoppedReason); + Log(LOG_W, @"Controller %ld: Haptic engine stopped: %ld", (long)me->_playerIndex, (long)stoppedReason); me->_hapticPlayer = nil; me->_hapticEngine = nil; me->_playing = NO; @@ -122,7 +159,7 @@ -(id) initWithGamepad:(GCController*)gamepad locality:(GCHapticsLocality)localit return; } - Log(LOG_W, @"Controller %d: Haptic engine reset", me->_playerIndex); + Log(LOG_W, @"Controller %ld: Haptic engine reset", (long)me->_playerIndex); me->_hapticPlayer = nil; me->_playing = NO; [me->_hapticEngine startAndReturnError:nil]; @@ -132,7 +169,7 @@ -(id) initWithGamepad:(GCController*)gamepad locality:(GCHapticsLocality)localit } +(HapticContext*) createContextForHighFreqMotor:(GCController*)gamepad { - if (@available(iOS 14.0, tvOS 14.0, *)) { + if (@available(iOS 14.0, tvOS 14.0, visionOS 1.0, *)) { return [[HapticContext alloc] initWithGamepad:gamepad locality:GCHapticsLocalityRightHandle]; } else { @@ -141,7 +178,7 @@ +(HapticContext*) createContextForHighFreqMotor:(GCController*)gamepad { } +(HapticContext*) createContextForLowFreqMotor:(GCController*)gamepad { - if (@available(iOS 14.0, tvOS 14.0, *)) { + if (@available(iOS 14.0, tvOS 14.0, visionOS 1.0, *)) { return [[HapticContext alloc] initWithGamepad:gamepad locality:GCHapticsLocalityLeftHandle]; } else { @@ -150,7 +187,7 @@ +(HapticContext*) createContextForLowFreqMotor:(GCController*)gamepad { } +(HapticContext*) createContextForLeftTrigger:(GCController*)gamepad { - if (@available(iOS 14.0, tvOS 14.0, *)) { + if (@available(iOS 14.0, tvOS 14.0, visionOS 1.0, *)) { return [[HapticContext alloc] initWithGamepad:gamepad locality:GCHapticsLocalityLeftTrigger]; } else { @@ -159,7 +196,7 @@ +(HapticContext*) createContextForLeftTrigger:(GCController*)gamepad { } +(HapticContext*) createContextForRightTrigger:(GCController*)gamepad { - if (@available(iOS 14.0, tvOS 14.0, *)) { + if (@available(iOS 14.0, tvOS 14.0, visionOS 1.0, *)) { return [[HapticContext alloc] initWithGamepad:gamepad locality:GCHapticsLocalityRightTrigger]; } else { diff --git a/Limelight/Input/StreamView.h b/Limelight/Input/StreamView.h index 07e23533e..543b4cfd5 100644 --- a/Limelight/Input/StreamView.h +++ b/Limelight/Input/StreamView.h @@ -34,6 +34,7 @@ enum X1MouseButton : uint8_t; config:(StreamConfiguration*)streamConfig; - (void) showOnScreenControls; - (OnScreenControlsLevel) getCurrentOscState; +- (BOOL) toggleKeyboard; #if !TARGET_OS_TV - (void) updateCursorLocation:(CGPoint)location isMouse:(BOOL)isMouse; diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index 6a4ab2e19..01d4f37a2 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -433,6 +433,24 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } } +- (BOOL)toggleKeyboard { + if (isInputingText) { + Log(LOG_D, @"Closing the keyboard (via toggle)"); + [keyInputField resignFirstResponder]; + isInputingText = false; + return NO; + } else { + Log(LOG_D, @"Opening the keyboard (via toggle)"); + keyInputField.delegate = self; + keyInputField.text = @"0"; + [keyInputField becomeFirstResponder]; + [keyInputField addTarget:self action:@selector(onKeyboardPressed:) forControlEvents:UIControlEventEditingChanged]; + [keyInputField.undoManager disableUndoRegistration]; + isInputingText = true; + return YES; + } +} + - (UIBarButtonItem *)createButtonWithImageNamed:(NSString *)imageName backgroundColor:(UIColor *)backgroundColor target:(id)target action:(SEL)action keyCode:(NSInteger)keyCode isToggleable:(BOOL)isToggleable { UIImage *image = [UIImage imageNamed:imageName]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents index 3541e9a2c..8def0d79a 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -30,6 +30,7 @@ + @@ -39,6 +40,7 @@ + diff --git a/Limelight/Network/DiscoveryManager.h b/Limelight/Network/DiscoveryManager.h index 8959a35f7..16162a8f5 100644 --- a/Limelight/Network/DiscoveryManager.h +++ b/Limelight/Network/DiscoveryManager.h @@ -19,6 +19,7 @@ @interface DiscoveryManager : NSObject - (id) initWithHosts:(NSArray*)hosts andCallback:(id) callback; +- (id) initWithHosts:(NSArray*)hosts andCallback:(id) callback uniqueId:(NSString*)uniqueId cert:(NSData*)cert; - (void) startDiscovery; - (void) stopDiscovery; - (void) stopDiscoveryBlocking; diff --git a/Limelight/Network/DiscoveryManager.m b/Limelight/Network/DiscoveryManager.m index c40210779..2a12dd34a 100644 --- a/Limelight/Network/DiscoveryManager.m +++ b/Limelight/Network/DiscoveryManager.m @@ -33,10 +33,12 @@ @implementation DiscoveryManager { } - (id)initWithHosts:(NSArray *)hosts andCallback:(id)callback { + return [self initWithHosts:hosts andCallback:callback uniqueId:nil cert:nil]; +} + +- (id)initWithHosts:(NSArray *)hosts andCallback:(id)callback uniqueId:(NSString*)uniqueId cert:(NSData*)cert { self = [super init]; - // Using addHostToDiscovery ensures no duplicates - // will make it into the list from the database _callback = callback; shouldDiscover = NO; _hostQueue = [NSMutableArray array]; @@ -49,9 +51,15 @@ - (id)initWithHosts:(NSArray *)hosts andCallback:(id)callback _opQueue = [[NSOperationQueue alloc] init]; _mdnsMan = [[MDNSManager alloc] initWithCallback:self]; - [CryptoManager generateKeyPairUsingSSL]; - _uniqueId = [IdManager getUniqueId]; - _cert = [CryptoManager readCertFromFile]; + + if (uniqueId != nil && cert != nil) { + _uniqueId = uniqueId; + _cert = cert; + } else { + [CryptoManager generateKeyPairUsingSSL]; + _uniqueId = [IdManager getUniqueId]; + _cert = [CryptoManager readCertFromFile]; + } return self; } diff --git a/Limelight/Stream/Connection.h b/Limelight/Stream/Connection.h index 69d96c94f..22c183a41 100644 --- a/Limelight/Stream/Connection.h +++ b/Limelight/Stream/Connection.h @@ -33,6 +33,7 @@ int DrSubmitDecodeUnit(PDECODE_UNIT decodeUnit); -(id) initWithConfig:(StreamConfiguration*)config renderer:(id __strong)myRenderer connectionCallbacks:(id)callbacks; -(void) terminate; +-(void) terminateWithCompletion:(void (^)(void))completion; -(void) main; -(BOOL) getVideoStats:(video_stats_t*)stats; -(NSString*) getActiveCodecName; diff --git a/Limelight/Stream/Connection.m b/Limelight/Stream/Connection.m index a39777528..815fb810e 100644 --- a/Limelight/Stream/Connection.m +++ b/Limelight/Stream/Connection.m @@ -54,31 +54,8 @@ void setVolume(int newVol) { static id __strong renderer; -void ResetConnectionStaticState(void) { - Log(LOG_I, @"[Connection] Resetting static state for clean reconnection"); - - // Clear renderer reference safely - if (renderer) { - [renderer stop]; - renderer = nil; - } - - // Clear callbacks - _callbacks = nil; - - // Reset video stats - if (videoStatsLock) { - [videoStatsLock lock]; - memset(¤tVideoStats, 0, sizeof(currentVideoStats)); - memset(&lastVideoStats, 0, sizeof(lastVideoStats)); - [videoStatsLock unlock]; - } - - lastFrameNumber = 0; - activeVideoFormat = 0; - - Log(LOG_I, @"[Connection] Static state reset completed"); -} +// Empty stub — referenced by StreamFrameViewController.m (iOS target) +void ResetConnectionStaticState(void) {} int DrDecoderSetup(int videoFormat, int width, int height, int redrawRate, void* context, int drFlags) { @@ -432,23 +409,40 @@ void ClSetControllerLED(uint16_t controllerNumber, uint8_t r, uint8_t g, uint8_t } -(void) terminate +{ + [self terminateWithCompletion:nil]; +} + +-(void) terminateWithCompletion:(void (^)(void))completion { // Interrupt any action blocking LiStartConnection(). This is // thread-safe and done outside initLock on purpose, since we - // won't be able to acquire it if LiStartConnection is in - // progress. + // won't be able to acquire it if LiStartConnection is in progress. LiInterruptConnection(); // We dispatch this async to get out because this can be invoked // on a thread inside common and we don't want to deadlock. It also avoids // blocking on the caller's thread waiting to acquire initLock. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + // Acquire the lock — wait indefinitely. ConnectionSerializer on the Swift side + // ensures no new LiStartConnection() can begin until our completion fires, + // so holding this lock is always safe and no forced-unlock is ever needed. [initLock lock]; - LiStopConnection(); - ResetConnectionStaticState(); + // Run LiStopConnection() and wait for it to truly finish. + // LiStopConnection() can occasionally be slow (audio thread shutdown), + // but we must wait — firing the completion early is what caused crashes. + LiStopConnection(); [initLock unlock]; + + Log(LOG_I, @"[Connection] LiStopConnection() completed and initLock released."); + + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(); + }); + } }); } @@ -566,7 +560,16 @@ -(id) initWithConfig:(StreamConfiguration*)config renderer:(id) throws -> CMFormatDescription { +/// Optional `masteringDisplayColorVolume` / `contentLightLevelInfo` are ST 2086 / CLL payloads from Sunshine +/// (`LiGetHdrMetadata` → `HDRParsingUtils`), matching `CMVideoFormatDescriptionCreateFromHEVCParameterSets` extensions. +public func CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C( + _ obuData: UnsafeMutableBufferPointer, + masteringDisplayColorVolume: Data? = nil, + contentLightLevelInfo: Data? = nil +) throws -> CMFormatDescription { guard let seqRange = findSequenceHeaderOBURange(in: obuData) else { throw AV1FormatDescriptionError.sequenceHeaderNotFound } @@ -140,12 +146,17 @@ public func CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C(_ obu CP_BT_2020 : kCVImageBufferColorPrimaries_ITU_R_2020, CP_BT_601 : kCVImageBufferColorPrimaries_DCI_P3, ] + // ISO/IEC 23091-4 / AV1 color_config.transfer_characteristics. PQ (16) and HLG (18) must be present + // or CMVideoFormatDescription defaults to 709 transfer and VideoToolbox + the client mis-handle HDR. let tcMap: [Int: CFString] = [ - TC_BT_709 : kCVImageBufferTransferFunction_ITU_R_709_2, - TC_BT_2020_10_BIT : kCVImageBufferTransferFunction_ITU_R_2020, - TC_BT_2020_12_BIT : kCVImageBufferTransferFunction_ITU_R_2020, - TC_BT_601 : kCVImageBufferTransferFunction_sRGB, - TC_SRGB : kCVImageBufferTransferFunction_sRGB, + TC_BT_709: kCVImageBufferTransferFunction_ITU_R_709_2, + TC_BT_2020_10_BIT: kCVImageBufferTransferFunction_ITU_R_2020, + TC_BT_2020_12_BIT: kCVImageBufferTransferFunction_ITU_R_2020, + TC_BT_601: kCVImageBufferTransferFunction_sRGB, + TC_SRGB: kCVImageBufferTransferFunction_sRGB, + TC_LINEAR: kCVImageBufferTransferFunction_Linear, + TC_SMPTE_2084: kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ, + TC_HLG: kCVImageBufferTransferFunction_ITU_R_2100_HLG, ] let mMap: [Int: CFString] = [ MC_BT_709 : kCVImageBufferYCbCrMatrix_ITU_R_709_2, @@ -165,6 +176,12 @@ public func CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C(_ obu extensions[kCMFormatDescriptionExtension_Depth] = (seqInfo.bitsPerComponent * 3) as NSNumber extensions[kCMFormatDescriptionExtension_FormatName] = "av01" as NSString extensions[kCMFormatDescriptionExtension_FullRangeVideo] = seqInfo.isFullRange as NSNumber + if let masteringDisplayColorVolume { + extensions[kCMFormatDescriptionExtension_MasteringDisplayColorVolume as NSString] = masteringDisplayColorVolume as NSData + } + if let contentLightLevelInfo { + extensions[kCMFormatDescriptionExtension_ContentLightLevelInfo as NSString] = contentLightLevelInfo as NSData + } extensions[kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms] = atomsDict as CFDictionary let status = CMVideoFormatDescriptionCreate( diff --git a/Moonlight Vision/AmbientLightEngine.swift b/Moonlight Vision/AmbientLightEngine.swift index b56bb35e0..511bf75bd 100644 --- a/Moonlight Vision/AmbientLightEngine.swift +++ b/Moonlight Vision/AmbientLightEngine.swift @@ -3,18 +3,30 @@ import Metal import MetalKit import UIKit -// Optimized engine that uses stochastic sampling (25 points) instead of full-frame averaging. -// This reduces GPU load by ~99.9% compared to MPSImageStatisticsMean. +// ChromaHalo multi-zone color payload — 5 screen regions sampled per frame. +struct ChromaHaloColors { + let left: SIMD3 + let right: SIMD3 + let top: SIMD3 + let bottom: SIMD3 + let center: SIMD3 +} + +// Optimized engine that samples 5 screen zones (left, right, top, bottom, center). +// Each zone uses a 3x3 weighted grid (9 samples) = 45 total GPU reads per frame. +// Throttled to ~6.6 fps, async, non-blocking — zero impact on render pipeline. actor AmbientLightEngine { private let device: MTLDevice private let commandQueue: MTLCommandQueue private var computePipelineState: MTLComputePipelineState? + // 5 zones × RGBA = 5 float4 values private let resultBuffer: MTLBuffer - + private var lastUpdateTime: TimeInterval = 0 - // 0.15s = ~6.6 updates per second. Fast enough for "reactive" feel, slow enough to save M2/R1 power. - private let updateInterval: TimeInterval = 0.15 + // 0.15s = ~6.6 updates per second — fast enough for reactive, slow enough to save power + private let updateInterval: TimeInterval = 0.15 private var isProcessing = false + private var lastSentColors: ChromaHaloColors? init?() { guard let dev = MTLCreateSystemDefaultDevice(), @@ -23,31 +35,26 @@ actor AmbientLightEngine { } self.device = dev self.commandQueue = queue - - // Shared buffer for result (RGBA) so CPU can read it without copying - guard let buffer = dev.makeBuffer(length: MemoryLayout>.size, options: .storageModeShared) else { + + // 5 zones × RGBA (float4) = 5 × 16 bytes = 80 bytes + guard let buffer = dev.makeBuffer(length: MemoryLayout>.size * 5, options: .storageModeShared) else { return nil } self.resultBuffer = buffer - - // Compile the lightweight sampling shader + do { - let library = try dev.makeLibrary(source: stochasticShader, options: nil) - guard let function = library.makeFunction(name: "sample_ambient_color") else { return nil } + let library = try dev.makeLibrary(source: chromaHaloShader, options: nil) + guard let function = library.makeFunction(name: "sample_chromahalo_zones") else { return nil } self.computePipelineState = try dev.makeComputePipelineState(function: function) } catch { - print("AmbientLightEngine: Shader compilation error: \(error)") + print("AmbientLightEngine: ChromaHalo shader compilation error: \(error)") return nil } } func analyze(texture: MTLTexture) { let now = CACurrentMediaTime() - - // Throttle: Don't run if too soon OR if the GPU is still busy with the last request. - // This prevents the "command buffer jam" that causes stutter. guard now - lastUpdateTime >= updateInterval, !isProcessing else { return } - lastUpdateTime = now isProcessing = true @@ -57,80 +64,135 @@ actor AmbientLightEngine { isProcessing = false return } - + encoder.setComputePipelineState(pipeline) encoder.setTexture(texture, index: 0) encoder.setBuffer(resultBuffer, offset: 0, index: 0) - - // We only launch ONE thread. It reads 25 pixels. Extremely cheap. - encoder.dispatchThreads(MTLSize(width: 1, height: 1, depth: 1), - threadsPerThreadgroup: MTLSize(width: 1, height: 1, depth: 1)) + // 5 threads — one per zone + encoder.dispatchThreads(MTLSize(width: 5, height: 1, depth: 1), + threadsPerThreadgroup: MTLSize(width: 5, height: 1, depth: 1)) encoder.endEncoding() - - // Async completion handler - NO waitUntilCompleted()! + commandBuffer.addCompletedHandler { [weak self] _ in guard let self = self else { return } - - // Read result directly from shared memory - let pointer = self.resultBuffer.contents().bindMemory(to: SIMD4.self, capacity: 1) - let c = pointer.pointee - - // Send to main thread for UI update - Task { @MainActor in - NotificationCenter.default.post( - name: .ambientAverageColorUpdated, - object: nil, - userInfo: ["r": c.x, "g": c.y, "b": c.z] - ) + + let pointer = self.resultBuffer.contents().bindMemory(to: SIMD4.self, capacity: 5) + let rawLeft = pointer[0] + let rawRight = pointer[1] + let rawTop = pointer[2] + let rawBottom = pointer[3] + let rawCenter = pointer[4] + + let newColors = ChromaHaloColors( + left: SIMD3(rawLeft.x, rawLeft.y, rawLeft.z), + right: SIMD3(rawRight.x, rawRight.y, rawRight.z), + top: SIMD3(rawTop.x, rawTop.y, rawTop.z), + bottom: SIMD3(rawBottom.x, rawBottom.y, rawBottom.z), + center: SIMD3(rawCenter.x, rawCenter.y, rawCenter.z) + ) + + Task { + let shouldSend: Bool + let threshold: Float = 0.015 + + if let last = await self.lastSentColors { + let diff = chromaHaloDiff(newColors, last) + shouldSend = diff > threshold + } else { + shouldSend = true + } + + if shouldSend { + await self.updateLastSentColors(newColors) + await MainActor.run { + NotificationCenter.default.post( + name: .chromaHaloColorsUpdated, + object: nil, + userInfo: [ + "left": newColors.left, + "right": newColors.right, + "top": newColors.top, + "bottom": newColors.bottom, + "center": newColors.center + ] + ) + } + } + + await self.unlock() } - - // Unlock for the next frame - Task { await self.unlock() } } - + commandBuffer.commit() } - - private func unlock() { - isProcessing = false + + private func unlock() { isProcessing = false } + private func updateLastSentColors(_ c: ChromaHaloColors) { lastSentColors = c } +} + +// Max channel-diff across all 5 zones — determines if update is worth sending. +private func chromaHaloDiff(_ a: ChromaHaloColors, _ b: ChromaHaloColors) -> Float { + func d(_ x: SIMD3, _ y: SIMD3) -> Float { + abs(x.x - y.x) + abs(x.y - y.y) + abs(x.z - y.z) } + return max(d(a.left, b.left), max(d(a.right, b.right), max(d(a.top, b.top), max(d(a.bottom, b.bottom), d(a.center, b.center))))) } // MARK: - Metal Shader Source -// Samples 25 points in a 5x5 grid pattern (center of each cell) to approximate the average color instantly. -// Uses (i - 0.5) / 5.0 to avoid edge artifacts (letterboxing, black bars, compression noise). -private let stochasticShader = """ +// 5 threads, one per zone. Each zone samples a 3×3 weighted grid (9 reads). +// Zones are inset 12% from each edge to avoid black bars and encoder border artifacts. +private let chromaHaloShader = """ #include using namespace metal; -kernel void sample_ambient_color(texture2d sourceTexture [[texture(0)]], - device float4 *resultBuffer [[buffer(0)]], - uint id [[thread_position_in_grid]]) +kernel void sample_chromahalo_zones( + texture2d tex [[texture(0)]], + device float4 *result [[buffer(0)]], + uint id [[thread_position_in_grid]]) { - // Safety check - if (id > 0) return; + if (id >= 5) return; + + float w = float(tex.get_width()); + float h = float(tex.get_height()); + + // Zone centers (normalized UV). Safe 12% inset from edges avoids letterbox/encode artifacts. + // [0]=left, [1]=right, [2]=top, [3]=bottom, [4]=center + float2 centers[5]; + centers[0] = float2(0.12, 0.50); // left + centers[1] = float2(0.88, 0.50); // right + centers[2] = float2(0.50, 0.12); // top + centers[3] = float2(0.50, 0.88); // bottom + centers[4] = float2(0.50, 0.50); // center - float width = float(sourceTexture.get_width()); - float height = float(sourceTexture.get_height()); + // Zone radius — each zone samples a 3×3 area spanning ~16% of the image + float radius = 0.08; + + float2 center = centers[id]; float4 sum = float4(0.0); - - // 5x5 Grid Sample = 25 reads total. - // Center-sample each cell: (i - 0.5) / 5.0 gives us 0.1, 0.3, 0.5, 0.7, 0.9 - // This avoids edge artifacts (black bars, letterboxing). - for (int i = 1; i <= 5; i++) { - for (int j = 1; j <= 5; j++) { - float u = (float(i) - 0.5) / 5.0; - float v = (float(j) - 0.5) / 5.0; - uint2 pos = uint2(u * width, v * height); - sum += sourceTexture.read(pos); + float totalWeight = 0.0; + + // 3×3 Gaussian-weighted grid + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + float2 offset = float2(float(dx), float(dy)) * radius; + float2 uv = clamp(center + offset, float2(0.02), float2(0.98)); + uint2 pos = uint2(uv.x * w, uv.y * h); + float dist2 = float(dx*dx + dy*dy); + float weight = exp(-0.5 * dist2); + sum += tex.read(pos) * weight; + totalWeight += weight; } } - - // Average the results - resultBuffer[0] = sum / 25.0; + + result[id] = sum / totalWeight; } """ +extension Notification.Name { + static let chromaHaloColorsUpdated = Notification.Name("ChromaHaloColorsUpdated") +} + +// Legacy single-color notification kept for backward compatibility with any remaining callers extension Notification.Name { static let ambientAverageColorUpdated = Notification.Name("AmbientAverageColorUpdated") } diff --git a/Moonlight Vision/AppIntents/OpenStreamAppIntent.swift b/Moonlight Vision/AppIntents/OpenStreamAppIntent.swift index 609d03a5d..4dad6af97 100644 --- a/Moonlight Vision/AppIntents/OpenStreamAppIntent.swift +++ b/Moonlight Vision/AppIntents/OpenStreamAppIntent.swift @@ -18,7 +18,7 @@ struct OpenMoonlightApp: AppIntent { @Parameter(title: "Steamed App") var app: TemporaryApp - @Parameter(title: "Renderer") + @Parameter(title: "Display Mode") var renderer: Renderer static var title: LocalizedStringResource = "Start streaming app" @@ -33,13 +33,15 @@ struct OpenMoonlightApp: AppIntent { activity.targetContentIdentifier = "dummy" // IMPORTANT try! activity.setTypedPayload(config!) MainViewModel.shared.streamSettings.renderer = self.renderer + // Persist renderer selection so App Intent launches don't revert on reboot + MainViewModel.shared.streamSettings.save() UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil) print("perform intent") return .result() } static var parameterSummary: some ParameterSummary { - Summary("Stream from \(\.$host), stream app \(\.$app) with renderer \(\.$renderer)") + Summary("Stream from \(\.$host), stream app \(\.$app) with display mode \(\.$renderer)") } init() { diff --git a/Moonlight Vision/AppsView.swift b/Moonlight Vision/AppsView.swift index a6075b438..ee1e1c041 100644 --- a/Moonlight Vision/AppsView.swift +++ b/Moonlight Vision/AppsView.swift @@ -19,6 +19,7 @@ struct AppsView: View { @Environment(\.dismiss) private var dismiss @State private var nowLoading: String? + @State private var nowLoadingTimeout: DispatchWorkItem? @State private var firstFrameObserver: NSObjectProtocol? @State private var firstFrameFallback: DispatchWorkItem? @@ -138,6 +139,23 @@ struct AppsView: View { if nowLoading != nil { return } nowLoading = app.id ?? app.name + // CRITICAL FIX: Safety timeout to prevent nowLoading from getting stuck + // This prevents the "Launch locks up" bug where user can't tap any app + nowLoadingTimeout?.cancel() + let timeout = DispatchWorkItem { [weak viewModel] in + if self.nowLoading != nil { + print("[AppsView] ⚠️ Safety timeout: Clearing stuck nowLoading after 5s") + self.nowLoading = nil + // Also reset any potentially stuck state + if viewModel?.streamState == .stopping { + print("[AppsView] ⚠️ Force resetting stuck streamState") + viewModel?.streamState = .idle + } + } + } + nowLoadingTimeout = timeout + DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute: timeout) + // Stop discovery before starting stream to prevent interference viewModel.stopRefresh() @@ -192,10 +210,27 @@ struct AppsView: View { } private func openAppStream(app: TemporaryApp) { + // Gate: do not start a new connection until any in-progress stop has truly + // completed (LiStopConnection returned). The ConnectionSerializer is the + // authoritative gate — no timers, no guessing. + if ConnectionSerializer.shared.isStopInProgress { + print("[AppsView] ConnectionSerializer gate is closed — waiting for stop to complete before starting") + Task { + await ConnectionSerializer.shared.waitUntilReadyToStart() + print("[AppsView] ConnectionSerializer gate opened — proceeding with stream start") + openAppStream(app: app) + } + return + } + + // CRITICAL FIX: Defensively clear any stale state before starting + viewModel.prepareForNewStream() + if let config = viewModel.stream(app: app) { var renderer = viewModel.streamSettings.renderer - // Before opening a new stream, ensure any existing streaming window (including the middle screen) is closed + // Before opening a new stream, ensure any existing streaming window is closed + dismissWindow(id: "flatDisplayWindow") dismissWindow(id: "classicStreamingWindow") if renderer == .curvedDisplay { @@ -205,37 +240,40 @@ struct AppsView: View { print("[AppsView] Opening curved display immersive space...") let result = try await openImmersiveSpace(id: renderer.windowId, value: config) print("[AppsView] Immersive space result: \(result)") - nowLoading = nil - } - } - } else if renderer == .realitykit { - Task { - await dismissImmersiveSpace() - await MainActor.run { - openWindow(id: renderer.windowId, value: config) - dismissWindow(id: "mainView") - nowLoading = nil + self.viewModel.isImmersiveSpaceOpen = true + self.clearNowLoading() } } } else { - // Classic UIKit renderer + // Flat Display or Classic Display renderer Task { - await dismissImmersiveSpace() + // Only dismiss immersive space if one is actually open + if viewModel.isImmersiveSpaceOpen { + await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false + } await MainActor.run { DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { - pushWindow(id: renderer.windowId, value: config) + openWindow(id: renderer.windowId, value: config) } DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { dismissWindow(id: "mainView") } - nowLoading = nil + self.clearNowLoading() } } } } else { - nowLoading = nil + clearNowLoading() } } + + /// Clears nowLoading and cancels the safety timeout + private func clearNowLoading() { + nowLoadingTimeout?.cancel() + nowLoadingTimeout = nil + nowLoading = nil + } private func clearFirstFrameObservers() { if let obs = firstFrameObserver { @@ -249,7 +287,7 @@ struct AppsView: View { private func handleDisconnect() { print("[AppsView] Disconnect button tapped. Requesting disconnect from ViewModel.") viewModel.userDidRequestDisconnect() - nowLoading = nil + clearNowLoading() } private func handleQuit(app: TemporaryApp) { @@ -538,12 +576,14 @@ private func waitForTeardownThen(_ block: @escaping () -> Void) { var fired = false var obs1: NSObjectProtocol? var obs2: NSObjectProtocol? + var obs3: NSObjectProtocol? func cleanupAndFire() { if fired { return } fired = true if let o = obs1 { center.removeObserver(o) } if let o = obs2 { center.removeObserver(o) } + if let o = obs3 { center.removeObserver(o) } block() } @@ -557,6 +597,11 @@ private func waitForTeardownThen(_ block: @escaping () -> Void) { cleanupAndFire() } + obs3 = center.addObserver(forName: Notification.Name("StreamStartFailed"), object: nil, queue: .main) { _ in + print("[AppsView] Received StreamStartFailed") + cleanupAndFire() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { if !fired { print("[AppsView] Teardown wait timed out; proceeding") diff --git a/Moonlight Vision/AudioHelpers.swift b/Moonlight Vision/AudioHelpers.swift index 3023adb0d..a876686b2 100644 --- a/Moonlight Vision/AudioHelpers.swift +++ b/Moonlight Vision/AudioHelpers.swift @@ -6,6 +6,29 @@ // Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. // +import AVFoundation + +enum SoundStageSize: String, Codable, CaseIterable { + case small = "Small" + case medium = "Medium" + case large = "Large" + + var avAudioSessionSize: AVAudioSession.SoundStageSize { + switch self { + case .small: return .small + case .medium: return .medium + case .large: return .large + } + } + + func next() -> SoundStageSize { + let all = SoundStageSize.allCases + let currentIndex = all.firstIndex(of: self) ?? 0 + let nextIndex = (currentIndex + 1) % all.count + return all[nextIndex] + } +} + class AudioHelpers { private static func fixCategoryAndMic() { @@ -38,17 +61,16 @@ class AudioHelpers { /// Ensure that the audio session is surround and anchored to the active window /// Also ensures that the microphone uses voice chat noise cancellation. - static func fixAudioForSurroundForCurrentWindow() { + static func fixAudioForSurroundForCurrentWindow(soundStageSize: SoundStageSize = .medium) { AudioHelpers.fixCategoryAndMic() let audioSession = AVAudioSession.sharedInstance() do { if let id = UIApplication.shared.connectedScenes.first?.session.persistentIdentifier { - print("AudioHelpers - Found current window \(id)") + print("AudioHelpers - Found current window \(id) with sound stage: \(soundStageSize.rawValue)") - // TODO(shinyquagsire23): Not sure how this would interact w/ surround sound or Dolby try audioSession.setPreferredOutputNumberOfChannels(audioSession.maximumOutputNumberOfChannels) - try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: .medium, anchoringStrategy: .scene(identifier: id))) + try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: soundStageSize.avAudioSessionSize, anchoringStrategy: .scene(identifier: id))) } else { print("AudioHelpers - Couldn't find current window?") @@ -59,18 +81,17 @@ class AudioHelpers { } } - static func fixAudioForSurroundForUIKitWindow(_ window: UIWindow) { + static func fixAudioForSurroundForUIKitWindow(_ window: UIWindow, soundStageSize: SoundStageSize = .medium) { AudioHelpers.fixCategoryAndMic() let audioSession = AVAudioSession.sharedInstance() do { print(window, window.windowScene?.session.persistentIdentifier) if let id = window.windowScene?.session.persistentIdentifier { - print("AudioHelpers - Found UIKit window \(id)") + print("AudioHelpers - Found UIKit window \(id) with sound stage: \(soundStageSize.rawValue)") - // TODO(shinyquagsire23): Not sure how this would interact w/ surround sound or Dolby try audioSession.setPreferredOutputNumberOfChannels(audioSession.maximumOutputNumberOfChannels) - try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: .medium, anchoringStrategy: .scene(identifier: id))) + try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: soundStageSize.avAudioSessionSize, anchoringStrategy: .scene(identifier: id))) } else { fixAudioForDirectStereo() @@ -82,14 +103,14 @@ class AudioHelpers { } /// Anchor audio to a specific scene by its identifier - static func fixAudioForScene(identifier: String) { + static func fixAudioForScene(identifier: String, soundStageSize: SoundStageSize = .medium) { AudioHelpers.fixCategoryAndMic() let audioSession = AVAudioSession.sharedInstance() do { - print("AudioHelpers - Anchoring audio to scene: \(identifier)") + print("AudioHelpers - Anchoring audio to scene: \(identifier) with sound stage: \(soundStageSize.rawValue)") try audioSession.setPreferredOutputNumberOfChannels(audioSession.maximumOutputNumberOfChannels) - try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: .medium, anchoringStrategy: .scene(identifier: identifier))) + try audioSession.setIntendedSpatialExperience(.headTracked(soundStageSize: soundStageSize.avAudioSessionSize, anchoringStrategy: .scene(identifier: identifier))) } catch { print("AudioHelpers - Failed to anchor to scene \(identifier): \(error)") } diff --git a/Moonlight Vision/BatteryIndicatorView.swift b/Moonlight Vision/BatteryIndicatorView.swift new file mode 100644 index 000000000..a62fa61df --- /dev/null +++ b/Moonlight Vision/BatteryIndicatorView.swift @@ -0,0 +1,110 @@ +// +// BatteryIndicatorView.swift +// Moonlight Vision +// +// Created by NeoVectorX +// + +import SwiftUI + +struct BatteryIndicatorView: View { + @ObservedObject var batteryState = ControllerBatteryState.shared + @Binding var controlsHighlighted: Bool + @Binding var hideControls: Bool + var startHighlightTimer: () -> Void + var startHideTimer: () -> Void + + @State private var showPercentage = false + @State private var hideTimer: Timer? + + var body: some View { + if batteryState.hasController { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlsHighlighted = false + hideControls = false + + showPercentage.toggle() + + if showPercentage { + hideTimer?.invalidate() + hideTimer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.2)) { + showPercentage = false + } + } + } else { + hideTimer?.invalidate() + } + + startHideTimer() + } label: { + Label { + Text("Battery") + } icon: { + ZStack { + if showPercentage { + Text("\(batteryState.batteryLevel)%") + .font(.system(size: 15, weight: .semibold, design: .rounded)) + .minimumScaleFactor(0.6) + .lineLimit(1) + .transition(.opacity) + } else { + batteryIcon + .font(.system(size: 24.07)) + .transition(.opacity) + } + } + } + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + } + .labelStyle(.iconOnly) + .animation(.easeInOut(duration: 0.15), value: showPercentage) + } else { + EmptyView() + .onAppear { + batteryState.refreshBatteryState() + } + } + } + + private var batteryIcon: some View { + ZStack { + Image(systemName: batterySymbolName) + + if batteryState.batteryState.isCharging { + Image(systemName: "bolt.fill") + .font(.system(size: 10)) + } + } + } + + private var batterySymbolName: String { + if batteryState.batteryState == .full { + return "battery.100" + } + + let level = batteryState.batteryLevel + if level >= 75 { + return "battery.100" + } else if level >= 50 { + return "battery.75" + } else if level >= 25 { + return "battery.50" + } else if level >= 10 { + return "battery.25" + } else { + return "battery.0" + } + } +} diff --git a/Moonlight Vision/CenterPresetPopup.swift b/Moonlight Vision/CenterPresetPopup.swift new file mode 100644 index 000000000..1accd483f --- /dev/null +++ b/Moonlight Vision/CenterPresetPopup.swift @@ -0,0 +1,76 @@ +// +// Neo Moonlight +// +// Created by NeoVectorX +// +// + +import SwiftUI + +struct CenterPresetPopup: View { + var text: String + var icon: String + var width: CGFloat = 713 + /// Scale for title/icon/sizing (e.g. 1.2 = 20% larger). Used in curved display only; default 1.0. + var displayScale: CGFloat = 1.0 + + var body: some View { + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let radius: CGFloat = 24 * displayScale + let spacing: CGFloat = 12 * displayScale + let circleSize: CGFloat = 83 * displayScale + let iconSize: CGFloat = 34 * displayScale + let titleSize: CGFloat = 50 * displayScale + let tracking: CGFloat = 1.2 * displayScale + let height: CGFloat = (displayScale > 1.0) ? (160 * displayScale) : (132 * displayScale) + let padH: CGFloat = 24 * displayScale + let padV: CGFloat = 16 * displayScale + + HStack(spacing: spacing) { + Spacer() + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandOrange, brandOrange.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: circleSize, height: circleSize) + .shadow(color: brandOrange.opacity(0.5), radius: 12 * displayScale, x: 0, y: 8 * displayScale) + Image(systemName: icon) + .font(.system(size: iconSize, weight: .bold)) + .foregroundStyle(.white) + } + Text(text.uppercased()) + .font(.custom("Fredoka-SemiBold", size: titleSize)) + .tracking(tracking) + .foregroundColor(.white) + .lineLimit(1) + .minimumScaleFactor(0.5) + Spacer() + } + .frame(width: width, height: height) + .padding(.horizontal, padH) + .padding(.vertical, padV) + .background( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: 20 * displayScale, x: 0, y: 10 * displayScale) + ) + .overlay( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 * displayScale + ) + ) + .allowsHitTesting(false) + } +} diff --git a/Moonlight Vision/Components/CenterPresetPopup.swift b/Moonlight Vision/Components/CenterPresetPopup.swift index 8889926d4..d92145898 100644 --- a/Moonlight Vision/Components/CenterPresetPopup.swift +++ b/Moonlight Vision/Components/CenterPresetPopup.swift @@ -3,53 +3,57 @@ import SwiftUI struct CenterPresetPopup: View { var text: String var icon: String + var width: CGFloat = 713 var body: some View { - let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) - let babyBlue = Color(red: 0.72, green: 0.85, blue: 1.0) + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let radius: CGFloat = 24 - ZStack { - Circle() - .fill(RadialGradient(colors: [brandBlue.opacity(0.35), .clear], center: .center, startRadius: 0, endRadius: 220)) - .frame(width: 420, height: 420) - .blur(radius: 24) - - VStack(spacing: 16) { - Image(systemName: icon) - .font(.system(size: 34, weight: .bold)) - .foregroundStyle( + HStack(spacing: 12) { + Spacer() + ZStack { + Circle() + .fill( LinearGradient( - colors: [babyBlue, brandBlue], + colors: [brandOrange, brandOrange.opacity(0.85)], startPoint: .topLeading, endPoint: .bottomTrailing ) ) - - Text(text) - .font(.custom("Fredoka-SemiBold", size: 20)) - .foregroundColor(.white) - .shadow(color: .black.opacity(0.35), radius: 3, x: 0, y: 1) + .frame(width: 83, height: 83) + .shadow(color: brandOrange.opacity(0.5), radius: 12, x: 0, y: 8) + Image(systemName: icon) + .font(.system(size: 34, weight: .bold)) + .foregroundStyle(.white) } - .padding(.horizontal, 36) - .padding(.vertical, 26) - .background( - RoundedRectangle(cornerRadius: 20, style: .continuous) - .fill(.ultraThinMaterial) - .overlay( - RoundedRectangle(cornerRadius: 20, style: .continuous) - .stroke( - LinearGradient( - colors: [babyBlue.opacity(0.65), brandBlue.opacity(0.25)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ), - lineWidth: 1.5 - ) - ) - ) - .shadow(color: brandBlue.opacity(0.35), radius: 28, x: 0, y: 14) + Text(text.uppercased()) + .font(.custom("Fredoka-SemiBold", size: 50)) + .tracking(1.2) + .foregroundColor(.white) + .lineLimit(1) + .minimumScaleFactor(0.85) + Spacer() } - .frame(maxWidth: .infinity, maxHeight: .infinity) + .frame(width: width, height: 132) + .padding(.horizontal, 24) + .padding(.vertical, 16) + .background( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: 20, x: 0, y: 10) + ) + .overlay( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) .allowsHitTesting(false) } } \ No newline at end of file diff --git a/Moonlight Vision/Components/ConditionalGlass.swift b/Moonlight Vision/Components/ConditionalGlass.swift new file mode 100644 index 000000000..47b87dbc3 --- /dev/null +++ b/Moonlight Vision/Components/ConditionalGlass.swift @@ -0,0 +1,18 @@ +import SwiftUI + +struct ConditionalGlass: ViewModifier { + let enabled: Bool + func body(content: Content) -> some View { + if enabled { + content.glassBackgroundEffect() + } else { + content + } + } +} + +extension View { + func conditionalGlass(_ enabled: Bool) -> some View { + self.modifier(ConditionalGlass(enabled: enabled)) + } +} \ No newline at end of file diff --git a/Moonlight Vision/ComputerView.swift b/Moonlight Vision/ComputerView.swift index d0611cfac..df899de9f 100644 --- a/Moonlight Vision/ComputerView.swift +++ b/Moonlight Vision/ComputerView.swift @@ -12,6 +12,7 @@ import SwiftUI struct ComputerView: View { @EnvironmentObject private var viewModel: MainViewModel @Environment(\.isEmbeddedInCurved) private var isEmbeddedInCurved + @Environment(\.dismiss) private var dismiss // Stick with @Binding to ensure changes propagate back up if needed // (e.g., when pairing succeeds, the parent view should see the updated host). @@ -247,7 +248,25 @@ struct ComputerView: View { case .unpaired: // Host is Online but Unpaired -> Show Pairing UI - VStack(spacing: 24) { + VStack(spacing: 0) { + // X button to dismiss + HStack { + Button { + dismiss() + } label: { + Image(systemName: "xmark.circle.fill") + .font(.system(size: 28)) + .foregroundColor(.white.opacity(0.6)) + } + .buttonStyle(.plain) + Spacer() + } + .padding(.leading, 16) + .padding(.top, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(spacing: 24) { + ZStack { Circle() .fill( @@ -281,6 +300,7 @@ struct ComputerView: View { .font(.body) .multilineTextAlignment(.center) .foregroundColor(.white.opacity(0.8)) + .fixedSize(horizontal: false, vertical: true) .padding(.horizontal, 32) .padding(.bottom, 8) @@ -327,8 +347,10 @@ struct ComputerView: View { .shadow(color: babyBlue.opacity(0.4), radius: 16, x: 0, y: 8) } .buttonStyle(ScaleButtonStyle()) + } } - .padding(24) + .padding(.horizontal, 24) + .padding(.bottom, 24) .background( RoundedRectangle(cornerRadius: 20) .fill(.ultraThinMaterial) @@ -400,7 +422,24 @@ struct ComputerView: View { /// View displayed when the host is offline. private var offlineView: some View { - VStack(spacing: 15) { + VStack(spacing: 0) { + // X button to dismiss + HStack { + Button { + dismiss() + } label: { + Image(systemName: "xmark.circle.fill") + .font(.system(size: 28)) + .foregroundColor(.white.opacity(0.6)) + } + .buttonStyle(.plain) + Spacer() + } + .padding(.leading, 16) + .padding(.top, 8) + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(spacing: 15) { Label("Offline", systemImage: "desktopcomputer.trianglebadge.exclamationmark") .font(.title2) .foregroundColor(.red) // Clear offline indicator @@ -441,8 +480,9 @@ struct ComputerView: View { .disabled(host.mac == nil || host.mac == "00:00:00:00:00:00") // Visually indicate disabled state .opacity((host.mac == nil || host.mac == "00:00:00:00:00:00") ? 0.5 : 1.0) + } } - .padding(.vertical) // Add some vertical padding to the offline view + .padding(.bottom) // Add some vertical padding to the offline view } } diff --git a/Moonlight Vision/ConditionalGlass.swift b/Moonlight Vision/ConditionalGlass.swift new file mode 100644 index 000000000..47b87dbc3 --- /dev/null +++ b/Moonlight Vision/ConditionalGlass.swift @@ -0,0 +1,18 @@ +import SwiftUI + +struct ConditionalGlass: ViewModifier { + let enabled: Bool + func body(content: Content) -> some View { + if enabled { + content.glassBackgroundEffect() + } else { + content + } + } +} + +extension View { + func conditionalGlass(_ enabled: Bool) -> some View { + self.modifier(ConditionalGlass(enabled: enabled)) + } +} \ No newline at end of file diff --git a/Moonlight Vision/ConnectionSerializer.swift b/Moonlight Vision/ConnectionSerializer.swift new file mode 100644 index 000000000..af5c75592 --- /dev/null +++ b/Moonlight Vision/ConnectionSerializer.swift @@ -0,0 +1,62 @@ +// +// ConnectionSerializer.swift +// Moonlight Vision +// +// Ensures LiStartConnection never races with LiStopConnection. +// All stream start/stop operations must go through this serializer. +// A new connection cannot begin until the previous stop is fully acknowledged +// by the C library — no timers, no guessing. +// + +import Foundation + +/// A global serial gate that prevents LiStartConnection from racing with LiStopConnection. +/// +/// Usage pattern: +/// 1. Before stopping a stream, call `notifyStopBegun()`. +/// 2. When the stop completion fires (after LiStopConnection returns), call `notifyStopComplete()`. +/// 3. Before starting a new stream, call `waitUntilReadyToStart()` — this suspends +/// until any in-progress stop has fully completed. +/// +/// This replaces the timer-based `waitForTeardown` approach with a proper gate. +@MainActor +final class ConnectionSerializer { + static let shared = ConnectionSerializer() + + private var stopInProgress = false + private var continuations: [CheckedContinuation] = [] + + private init() {} + + /// Call this immediately before initiating a stream stop. + func notifyStopBegun() { + stopInProgress = true + print("[ConnectionSerializer] Stop begun — gate closed") + } + + /// Call this inside the stop completion block, after LiStopConnection() returns. + func notifyStopComplete() { + guard stopInProgress else { return } + stopInProgress = false + print("[ConnectionSerializer] Stop complete — gate opened, resuming \(continuations.count) waiter(s)") + let pending = continuations + continuations.removeAll() + for cont in pending { + cont.resume() + } + } + + /// Suspends the caller until any in-progress stop has fully completed. + /// If no stop is in progress, returns immediately. + func waitUntilReadyToStart() async { + guard stopInProgress else { return } + print("[ConnectionSerializer] New start requested while stop in progress — waiting...") + await withCheckedContinuation { cont in + continuations.append(cont) + } + print("[ConnectionSerializer] Wait complete — proceeding with start") + } + + /// Returns true if a stop is currently in progress. + var isStopInProgress: Bool { stopInProgress } +} diff --git a/Moonlight Vision/ControlComponents+LongPress.swift b/Moonlight Vision/ControlComponents+LongPress.swift new file mode 100644 index 000000000..bdae262ea --- /dev/null +++ b/Moonlight Vision/ControlComponents+LongPress.swift @@ -0,0 +1,49 @@ +import SwiftUI + +// MARK: - Long Press Control Button + +struct LongPressControlBtn: View { + let label: String + let systemImage: String + @Binding var controlsHighlighted: Bool + @Binding var hideControls: Bool + let startHighlightTimer: () -> Void + let startHideTimer: () -> Void + let primaryAction: () -> Void + let longPressAction: () -> Void + /// Optional; when set, called on tap so the host can fire sensory feedback (e.g. curved display spatial audio makes system tap quiet). + var onTapFeedback: (() -> Void)? = nil + + var body: some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + // Keep controlsHighlighted = true during action execution + // This prevents state flicker that breaks drag gesture recognition + hideControls = false + onTapFeedback?() + primaryAction() + startHideTimer() + } label: { + Label(label, systemImage: systemImage) + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + .contentShape(Rectangle()) + .simultaneousGesture( + LongPressGesture(minimumDuration: 0.8).onEnded { _ in + onTapFeedback?() + longPressAction() + } + ) + } + .labelStyle(.iconOnly) + } +} diff --git a/Moonlight Vision/ControllerBatteryState.swift b/Moonlight Vision/ControllerBatteryState.swift new file mode 100644 index 000000000..94f74ff53 --- /dev/null +++ b/Moonlight Vision/ControllerBatteryState.swift @@ -0,0 +1,92 @@ +// +// ControllerBatteryState.swift +// Moonlight Vision +// +// Created by NeoVectorX +// + +import Foundation +import Combine +import GameController + +@objc class ControllerBatteryState: NSObject, ObservableObject { + @objc static let shared = ControllerBatteryState() + + @Published var batteryLevel: Int = 0 // 0-100 + @Published var batteryState: BatteryState = .unknown + @Published var hasController: Bool = false + + /// Check for existing connected controllers and update battery state (primary controller only) + func refreshBatteryState() { + // Use GCController.current for the active controller, or fall back to first with playerIndex 0 + let controller: GCController? + if let current = GCController.current { + controller = current + } else { + // Fall back to first controller with playerIndex .index1 (player 1) or unset + controller = GCController.controllers().first(where: { + $0.playerIndex == .index1 || $0.playerIndex == .indexUnset + }) ?? GCController.controllers().first + } + + guard let controller = controller, let battery = controller.battery else { + return + } + + let level = Int(battery.batteryLevel * 100) + let state: UInt8 + switch battery.batteryState { + case .full: + state = 5 // LI_BATTERY_STATE_FULL + case .charging: + state = 3 // LI_BATTERY_STATE_CHARGING + case .discharging: + state = 2 // LI_BATTERY_STATE_DISCHARGING + default: + state = 0 // LI_BATTERY_STATE_UNKNOWN + } + + updateBattery(level: level, state: state, hasController: true) + } + + enum BatteryState { + case unknown + case discharging + case charging + case full + + var isCharging: Bool { + return self == .charging + } + } + + private override init() { + super.init() + } + + @objc func updateBattery(level: Int, state: UInt8, hasController: Bool) { + print("[Battery-Swift] updateBattery called: level=\(level), state=\(state), hasController=\(hasController), isMainThread=\(Thread.isMainThread)") + + // Ensure we're on main thread for @Published updates + if Thread.isMainThread { + self.batteryLevel = level + self.hasController = hasController + + switch state { + case 5: // LI_BATTERY_STATE_FULL + self.batteryState = .full + case 3: // LI_BATTERY_STATE_CHARGING + self.batteryState = .charging + case 2: // LI_BATTERY_STATE_DISCHARGING + self.batteryState = .discharging + default: + self.batteryState = .unknown + } + print("[Battery-Swift] State updated: level=\(self.batteryLevel), hasController=\(self.hasController), batteryState=\(self.batteryState)") + } else { + DispatchQueue.main.async { [weak self] in + self?.updateBattery(level: level, state: state, hasController: hasController) + } + } + } +} diff --git a/Moonlight Vision/CoopConnectingPopup.swift b/Moonlight Vision/CoopConnectingPopup.swift new file mode 100644 index 000000000..8dec2e596 --- /dev/null +++ b/Moonlight Vision/CoopConnectingPopup.swift @@ -0,0 +1,70 @@ +// +// CoopConnectingPopup.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// + +import SwiftUI + +struct CoopConnectingPopup: View { + var text: String = "Joining Session" + var icon: String = "person.line.dotted.person.fill" + + var body: some View { + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let radius: CGFloat = 24 + + HStack(spacing: 12) { + Spacer() + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandOrange, brandOrange.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: 83, height: 83) + .shadow(color: brandOrange.opacity(0.5), radius: 12, x: 0, y: 8) + Image(systemName: icon) + .font(.system(size: 34, weight: .bold)) + .foregroundStyle(.white) + .symbolEffect(.variableColor.iterative.reversing, options: .repeating) + } + Text(text.uppercased()) + .font(.custom("Fredoka-SemiBold", size: 50)) + .tracking(1.2) + .foregroundColor(.white) + .lineLimit(1) + .minimumScaleFactor(0.85) + Spacer() + } + .frame(width: 713, height: 132) + .padding(.horizontal, 24) + .padding(.vertical, 16) + .background( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .fill(brandNavy.opacity(0.92)) + .overlay( + RoundedRectangle(cornerRadius: radius, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + ) + .shadow(color: .black.opacity(0.25), radius: 30, x: 0, y: 16) + .allowsHitTesting(false) + } +} + +#Preview { + CoopConnectingPopup() +} diff --git a/Moonlight Vision/CoopHostView.swift b/Moonlight Vision/CoopHostView.swift new file mode 100644 index 000000000..08ed7ecee --- /dev/null +++ b/Moonlight Vision/CoopHostView.swift @@ -0,0 +1,980 @@ +// +// CoopHostView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import SwiftUI +import GroupActivities + +struct CoopHostView: View { + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.openWindow) private var openWindow + @Environment(\.openImmersiveSpace) private var openImmersiveSpace + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + @Environment(\.dismiss) private var dismiss + + @ObservedObject private var coordinator = CoopSessionCoordinator.shared + + let host: TemporaryHost + @Binding var isPresented: Bool + @Binding var parentIsPresented: Bool // To dismiss the entire co-op flow + + @State private var selectedApp: TemporaryApp? + @State private var isStartingSession = false + @State private var errorMessage: String? + @State private var selectedCoopBitrate: Int32 = 30000 // Default 30 Mbps + @State private var showRemoteSetupHelp = false + @State private var isHelpExpanded = false + @State private var isOnlineMode = false + + // Brand colors + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) + + var body: some View { + VStack(spacing: 16) { + // Header + VStack(spacing: 10) { + Text("Host Co-op Session") + .font(.system(size: 30, weight: .bold)) + .foregroundColor(.white) + } + .padding(.top, 100) + .padding(.bottom, 0) + + // Content + if coordinator.sessionActive && coordinator.isHosting { + hostWaitingView + } else { + appSelectionView + } + + Spacer() + .allowsHitTesting(false) + } + .frame(width: 600, height: 860) + .background( + RoundedRectangle(cornerRadius: 32) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) + .shadow(color: .black.opacity(0.3), radius: 30, x: 0, y: 15) + ) + .overlay( + RoundedRectangle(cornerRadius: 32) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .overlay(alignment: .topLeading) { + // Back button in top-left corner + Button { + isPresented = false + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white.opacity(0.7)) + .padding(16) + .background( + Circle() + .fill(Color.white.opacity(0.1)) + ) + } + .buttonStyle(.plain) + .clipShape(Circle()) + .hoverEffect() + .padding(.leading, 24) + .padding(.top, 24) + } + .sheet(isPresented: $showRemoteSetupHelp) { + remoteSetupHelpSheet + } + .onAppear { + // Refresh host data to ensure app list is populated + print("[CoopHost] View appeared, refreshing host data for: \(host.name)") + Task { + await viewModel.updateHost(host: host) + // Also refresh the app list (critical for co-op host view) + viewModel.refreshAppsFor(host: host) + } + + // Load last-used co-op bitrate from UserDefaults + let savedBitrate = UserDefaults.standard.integer(forKey: "lastCoopBitrate") + if savedBitrate > 0 { + selectedCoopBitrate = Int32(savedBitrate) + print("[CoopHost] Loaded saved co-op bitrate: \(selectedCoopBitrate / 1000) Mbps") + } else { + print("[CoopHost] Using default co-op bitrate: 30 Mbps") + } + } + } + + // MARK: - App Selection View + + private var appSelectionView: some View { + VStack(spacing: 20) { + // Connection Info Card + connectionInfoCard + + Text("Select a co-op session to host") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white) + + // Scrollable app list + ScrollView { + VStack(spacing: 12) { + ForEach(host.appList.sorted(by: { $0.name ?? "" < $1.name ?? "" }), id: \.id) { app in + CoopAppCard( + app: app, + isSelected: selectedApp?.id == app.id, + onTap: { selectedApp = app } + ) + } + } + .padding(.horizontal, 24) + } + .frame(height: 220) + + // Connection Type + connectionTypeCard + + // Bitrate Picker + bitratePickerCard + + // Start button + VStack(spacing: 0) { + Button(action: { + print("[CoopHost] BUTTON TAPPED!") + startCoopSession() + }) { + HStack(spacing: 12) { + if isStartingSession { + ProgressView() + .progressViewStyle(.circular) + .tint(.white) + } else { + Image(systemName: "person.2.fill") + .font(.system(size: 22, weight: .semibold)) + } + Text(isStartingSession ? "Starting..." : "Start Co-op Session") + .font(.system(size: 20, weight: .semibold)) + } + .foregroundColor(.white) + .padding(.horizontal, 32) + .padding(.vertical, 18) + .background( + RoundedRectangle(cornerRadius: 16) + .fill( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .shadow(color: brandViolet.opacity(0.3), radius: 15, x: 0, y: 8) + ) + } + .buttonStyle(ScaleButtonStyle()) + .disabled(selectedApp == nil || isStartingSession) + .opacity(selectedApp == nil ? 0.5 : 1.0) + + // Error message with fixed reserved space + VStack { + if let error = errorMessage { + Text(error) + .font(.system(size: 14, weight: .medium)) + .foregroundColor(.red) + .multilineTextAlignment(.center) + .padding(.horizontal, 16) + .padding(.top, 12) + } + } + .frame(height: 40) + } + .padding(.bottom, 32) + } + } + + // MARK: - Connection Info Card + + private var connectionInfoCard: some View { + VStack(alignment: .leading, spacing: 12) { + HStack { + Image(systemName: "network") + .font(.system(size: 18, weight: .semibold)) + Text("Connection Info") + .font(.system(size: 18, weight: .semibold)) + } + .foregroundColor(.white) + + Divider() + .background(Color.white.opacity(0.2)) + + // PC Name + HStack { + Text("🖥️ \(host.name)") + .font(.system(size: 16, weight: .medium)) + .foregroundColor(.white) + } + + // Combined Local and External Address on one line + HStack(spacing: 12) { + // Local Address + if let localAddr = host.localAddress { + HStack(spacing: 4) { + Text("Local:") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.6)) + Text(localAddr) + .font(.system(size: 13, weight: .medium)) + .foregroundColor(.white) + } + } + + // External Address + if let externalAddr = host.externalAddress, !externalAddr.isEmpty { + HStack(spacing: 4) { + Text("External:") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.6)) + Text(externalAddr) + .font(.system(size: 13, weight: .medium)) + .foregroundColor(.white) + } + } else { + HStack(spacing: 4) { + Text("External:") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.6)) + Text("Not detected") + .font(.system(size: 13, weight: .medium)) + .foregroundColor(.orange) + Image(systemName: "exclamationmark.triangle.fill") + .font(.system(size: 12)) + .foregroundColor(.orange) + + // Help button + Button { + showRemoteSetupHelp = true + } label: { + Image(systemName: "questionmark.circle.fill") + .font(.system(size: 14)) + .foregroundColor(.orange.opacity(0.8)) + } + .buttonStyle(.plain) + .hoverEffect() + } + } + } + + Divider() + .background(Color.white.opacity(0.2)) + + // Network reminder + HStack(spacing: 8) { + Image(systemName: "info.circle.fill") + .foregroundColor(.cyan) + Text("For online co-op, see User Guide for network setup") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.7)) + } + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(Color.white.opacity(0.1), lineWidth: 1) + ) + .padding(.horizontal, 24) + } + + // MARK: - Connection Type Card + + private var connectionTypeCard: some View { + VStack(alignment: .leading, spacing: 12) { + Text("Connection Type") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + + HStack(spacing: 12) { + Button { + isOnlineMode = false + } label: { + Text("Local") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 12) + .background(RoundedRectangle(cornerRadius: 10).fill(isOnlineMode ? Color.white.opacity(0.1) : brandViolet.opacity(0.6))) + } + .buttonStyle(.plain) + .hoverEffect() + + Button { + isOnlineMode = true + } label: { + Text("Online") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 12) + .background(RoundedRectangle(cornerRadius: 10).fill(isOnlineMode ? brandViolet.opacity(0.6) : Color.white.opacity(0.1))) + } + .buttonStyle(.plain) + .hoverEffect() + } + } + .fixedSize(horizontal: false, vertical: true) + .padding(12) + .background(RoundedRectangle(cornerRadius: 12).fill(Color.white.opacity(0.05))) + .overlay(RoundedRectangle(cornerRadius: 12).stroke(Color.white.opacity(0.1), lineWidth: 1)) + .padding(.horizontal, 24) + } + + // MARK: - Bitrate Picker Card + + private var bitratePickerCard: some View { + HStack { + Text("Co-op Mode Bitrate") + .font(.system(size: 16)) + .foregroundColor(.white.opacity(0.8)) + + Spacer() + + Picker("", selection: $selectedCoopBitrate) { + Text("25 Mbps").tag(Int32(25000)) + Text("30 Mbps").tag(Int32(30000)) + Text("50 Mbps").tag(Int32(50000)) + Text("75 Mbps").tag(Int32(75000)) + Text("100 Mbps").tag(Int32(100000)) + Text("120 Mbps").tag(Int32(120000)) + Text("150 Mbps").tag(Int32(150000)) + } + .pickerStyle(.menu) + .contentShape(Rectangle()) + .hoverEffect() + .onChange(of: selectedCoopBitrate) { _, newValue in + UserDefaults.standard.set(Int(newValue), forKey: "lastCoopBitrate") + print("[CoopHost] Saved co-op bitrate: \(newValue / 1000) Mbps") + } + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(Color.white.opacity(0.1), lineWidth: 1) + ) + .padding(.horizontal, 24) + } + + // MARK: - Host Waiting View + + private var hostWaitingView: some View { + VStack(spacing: 24) { + ProgressView() + .progressViewStyle(.circular) + .scaleEffect(1.5) + .tint(brandViolet) + + Text("Waiting for friend to join...") + .font(.system(size: 22, weight: .semibold)) + .foregroundColor(.white) + + Text("Participants: \(coordinator.participants.count)/2") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + + if coordinator.participants.count >= 2 { + Text("Friend joined! Starting game...") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(brandViolet) + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(brandViolet.opacity(0.15)) + ) + } + } + .padding(40) + } + + // MARK: - Actions + + private func startCoopSession() { + print("[CoopHost] ========== startCoopSession called ==========") + guard let app = selectedApp else { + print("[CoopHost] ERROR: No app selected") + return + } + guard !isStartingSession else { + print("[CoopHost] ERROR: Already starting session") + return + } + + print("[CoopHost] Starting session for app: \(app.name)") + isStartingSession = true + errorMessage = nil + + Task { @MainActor in + do { + // Force 90 FPS for co-op compatibility (M2 Vision Pro max) + let frameRate: Int32 = 90 + print("[CoopHost] Co-op frame rate locked to 90 FPS for M2 compatibility") + + // Export pairing data for sharing + print("[CoopHost] Exporting pairing data...") + let dataManager = DataManager() + guard let pairingData = dataManager.exportPairingData(for: host) else { + print("[CoopHost] ERROR: Failed to export pairing data") + throw CoopError.failedToExportPairing + } + print("[CoopHost] Pairing data exported successfully") + + // Use IP based on connection mode toggle + let targetAddress: String + if isOnlineMode { + guard let external = host.externalAddress, !external.isEmpty else { + errorMessage = "No external IP available for Online mode" + isStartingSession = false + return + } + targetAddress = external + print("[CoopHost] Online mode - using external IP: \(targetAddress)") + } else { + guard let local = host.localAddress, !local.isEmpty else { + errorMessage = "No local IP available" + isStartingSession = false + return + } + targetAddress = local + print("[CoopHost] Local mode - using local IP: \(targetAddress)") + } + + let isInternetAccessible = coordinator.isInternetAccessible(host: host) + + // Create activity with connection info (but DON'T activate yet!) + let activity = MoonlightCoopActivity( + hostPCAddress: targetAddress, + hostPCName: host.name, + hostPCPort: host.httpsPort, + isInternetAccessible: isInternetAccessible, + connectionMode: isOnlineMode ? "Online" : "Local", + appID: app.id ?? app.name, + appName: app.name, + sessionID: UUID().uuidString, + hostFrameRate: frameRate, + pairingData: pairingData + ) + print("[CoopHost] Activity created (NOT activated yet - waiting for first frame)") + + // Update ViewModel with co-op state + viewModel.isCoopSession = true + viewModel.assignedControllerSlot = 0 // Host is slot 0 (player 1) + + // Set co-op bitrate override before launching stream + viewModel.coopBitrateOverride = selectedCoopBitrate + print("[CoopHost] Set co-op bitrate override: \(selectedCoopBitrate / 1000) Mbps") + + // STEP 1: Wait for any previous teardown to complete before starting + if viewModel.streamState != .idle { + print("[CoopHost] Waiting for previous stream teardown to complete (state: \(viewModel.streamState.rawValue))...") + for _ in 0..<100 { // Up to 10 seconds + try? await Task.sleep(for: .milliseconds(100)) + if viewModel.streamState == .idle { break } + } + if viewModel.streamState != .idle { + print("[CoopHost] ERROR: Timed out waiting for previous stream to finish teardown") + errorMessage = "Previous stream is still shutting down. Please try again." + isStartingSession = false + return + } + print("[CoopHost] Previous teardown complete, proceeding with stream launch") + } + + // STEP 2: Launch the stream FIRST (before SharePlay activation) + print("[CoopHost] Launching stream FIRST (before SharePlay)...") + let streamStarted = launchCoopStream(app: app, host: host) + + guard streamStarted else { + print("[CoopHost] ERROR: Failed to start stream") + errorMessage = "Failed to start stream. Please try again." + isStartingSession = false + viewModel.isCoopSession = false + viewModel.coopBitrateOverride = nil + return + } + + // Wait a moment for the stream window to open + try? await Task.sleep(for: .milliseconds(300)) + + // Dismiss the co-op flow UI so user sees the stream + isPresented = false + parentIsPresented = false + + // STEP 2: Wait for first frame before activating SharePlay + // This ensures the guest won't see the session until host stream is working + print("[CoopHost] Waiting for first frame before activating SharePlay...") + let firstFrameReceived = await waitForFirstFrame(timeout: 30.0) + + if firstFrameReceived { + print("[CoopHost] First frame received! Now activating SharePlay...") + + // STEP 3: NOW activate SharePlay - guest will see session only after stream is working + try await coordinator.startHosting(activity: activity) + print("[CoopHost] SharePlay activated - session now visible to guest!") + } else { + print("[CoopHost] WARNING: First frame timeout, activating SharePlay anyway") + // Still activate SharePlay, but warn that timing might not be ideal + try await coordinator.startHosting(activity: activity) + } + + isStartingSession = false + print("[CoopHost] ========== Session started successfully! ==========") + } catch { + print("[CoopHost] ========== ERROR ==========") + print("[CoopHost] Error: \(error)") + print("[CoopHost] Error description: \(error.localizedDescription)") + errorMessage = "Failed: \(error.localizedDescription)" + isStartingSession = false + } + } + } + + /// Wait for the first frame notification with a timeout + /// Returns true if first frame was received, false if timeout + private func waitForFirstFrame(timeout: TimeInterval) async -> Bool { + await withCheckedContinuation { continuation in + var observer1: NSObjectProtocol? + var observer2: NSObjectProtocol? + var timeoutTask: DispatchWorkItem? + var resumed = false + + let cleanup = { + if let obs = observer1 { NotificationCenter.default.removeObserver(obs) } + if let obs = observer2 { NotificationCenter.default.removeObserver(obs) } + timeoutTask?.cancel() + } + + // Listen for RealityKit first frame (Curved Display) + observer1 = NotificationCenter.default.addObserver( + forName: Notification.Name("RKStreamFirstFrameShown"), + object: nil, + queue: .main + ) { _ in + guard !resumed else { return } + resumed = true + print("[CoopHost] Received RKStreamFirstFrameShown notification") + cleanup() + continuation.resume(returning: true) + } + + // Listen for UIKit first frame (Flat Display) + observer2 = NotificationCenter.default.addObserver( + forName: Notification.Name("StreamFirstFrameShownNotification"), + object: nil, + queue: .main + ) { _ in + guard !resumed else { return } + resumed = true + print("[CoopHost] Received StreamFirstFrameShownNotification") + cleanup() + continuation.resume(returning: true) + } + + // Timeout fallback + timeoutTask = DispatchWorkItem { + guard !resumed else { return } + resumed = true + print("[CoopHost] First frame wait timed out after \(timeout)s") + cleanup() + continuation.resume(returning: false) + } + DispatchQueue.main.asyncAfter(deadline: .now() + timeout, execute: timeoutTask!) + } + } + + // MARK: - Stream Launch + + @discardableResult + private func launchCoopStream(app: TemporaryApp, host: TemporaryHost) -> Bool { + // Configure the stream + guard let config = viewModel.stream(app: app) else { + errorMessage = "Failed to configure stream" + return false + } + + let renderer = viewModel.streamSettings.renderer + + // Dismiss any existing streaming windows + dismissWindow(id: "flatDisplayWindow") + dismissWindow(id: "classicStreamingWindow") + + print("[CoopHost] Opening stream with renderer: \(renderer), windowId: \(renderer.windowId)") + + if renderer == .curvedDisplay { + Task { + let result = try? await openImmersiveSpace(id: renderer.windowId, value: config) + print("[CoopHost] Immersive space result: \(String(describing: result))") + } + } else { + openWindow(id: renderer.windowId, value: config) + print("[CoopHost] Window opened: \(renderer.windowId)") + } + return true + } + + // MARK: - Remote Setup Help Sheet + + private var remoteSetupHelpSheet: some View { + VStack(spacing: 0) { + // Header + HStack { + Image(systemName: "network") + .font(.system(size: 24, weight: .semibold)) + .foregroundColor(brandOrange) + + Text("Remote Co-op Setup") + .font(.system(size: 24, weight: .bold)) + .foregroundColor(.white) + + Spacer() + + Button { + showRemoteSetupHelp = false + } label: { + Image(systemName: "xmark.circle.fill") + .font(.system(size: 24)) + .foregroundColor(.white.opacity(0.6)) + } + .buttonStyle(.plain) + .hoverEffect() + } + .padding(.horizontal, 28) + .padding(.top, 28) + .padding(.bottom, 20) + + Divider() + .background(Color.white.opacity(0.2)) + + ScrollView { + VStack(alignment: .leading, spacing: 20) { + // Warning message + HStack(alignment: .top, spacing: 12) { + Image(systemName: "exclamationmark.triangle.fill") + .font(.system(size: 20)) + .foregroundColor(.orange) + + VStack(alignment: .leading, spacing: 4) { + Text("Your router is blocking remote connections") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + + Text("Your guest needs to connect to your gaming PC from the internet.") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + } + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.orange.opacity(0.15)) + ) + + // Step 1: Automatic (UPnP) + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 8) { + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 20)) + .foregroundColor(.green) + + Text("Step 1: Try Automatic (UPnP)") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(.white) + } + + Text("Most modern routers handle this automatically.") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + + VStack(alignment: .leading, spacing: 8) { + helpStep(number: "1", text: "Open Sunshine Web UI on your PC") + helpStep(number: "2", text: "Go to Configuration → Network") + helpStep(number: "3", text: "Enable \"UPnP\" (if not already on)") + helpStep(number: "4", text: "Restart Sunshine") + helpStep(number: "5", text: "Return here and check if External IP shows ✅ green") + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.05)) + ) + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.green.opacity(0.1)) + ) + + // Expandable Manual Setup + VStack(alignment: .leading, spacing: 12) { + Button { + withAnimation(.easeInOut(duration: 0.3)) { + isHelpExpanded.toggle() + } + } label: { + HStack(spacing: 8) { + Image(systemName: "gearshape.fill") + .font(.system(size: 20)) + .foregroundColor(.orange) + + Text("Step 2: Manual Setup (If needed)") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(.white) + + Spacer() + + Image(systemName: isHelpExpanded ? "chevron.up" : "chevron.down") + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(.white.opacity(0.6)) + } + } + .buttonStyle(.plain) + + if isHelpExpanded { + VStack(alignment: .leading, spacing: 16) { + Text("Only if Step 1 didn't work:") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + + // Port forwarding info + VStack(alignment: .leading, spacing: 8) { + Text("Forward these ports on your router:") + .font(.system(size: 15, weight: .semibold)) + .foregroundColor(.white) + + portRangeRow(protocol: "TCP", ports: "47984-47990, 48000-48010") + portRangeRow(protocol: "UDP", ports: "47998-48010") + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.08)) + ) + + // How to forward ports + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "mappin.circle.fill") + .foregroundColor(brandBlue) + Text("How to forward ports:") + .font(.system(size: 15, weight: .semibold)) + .foregroundColor(.white) + } + + helpStep(number: "1", text: "Find your router IP (usually on a sticker on the router)") + + Text(" Common: 192.168.1.1 or 192.168.0.1") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.5)) + .padding(.leading, 28) + + helpStep(number: "2", text: "Log into router admin page in a web browser") + helpStep(number: "3", text: "Look for \"Port Forwarding\" section") + + if let localIP = host.localAddress { + HStack(alignment: .top, spacing: 8) { + Text("4") + .font(.system(size: 13, weight: .bold)) + .foregroundColor(brandBlue) + .frame(width: 20) + + VStack(alignment: .leading, spacing: 4) { + Text("Forward ports to your PC's local IP:") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.8)) + + Text(localIP) + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(brandOrange) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background( + RoundedRectangle(cornerRadius: 6) + .fill(brandOrange.opacity(0.15)) + ) + } + } + } else { + helpStep(number: "4", text: "Forward ports to your PC's local IP address") + } + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.05)) + ) + } + .transition(.opacity.combined(with: .move(edge: .top))) + } + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.orange.opacity(0.1)) + ) + + // Security tip + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "lock.shield.fill") + .foregroundColor(.purple) + Text("Security Tip") + .font(.system(size: 15, weight: .semibold)) + .foregroundColor(.white) + } + + Text("Consider using Tailscale or ZeroTier for a more secure connection instead of port forwarding.") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.7)) + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.purple.opacity(0.1)) + ) + } + .padding(28) + } + + // Close button + Button { + showRemoteSetupHelp = false + } label: { + Text("Close") + .font(.system(size: 17, weight: .semibold)) + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(brandOrange) + ) + } + .buttonStyle(.plain) + .padding(.horizontal, 28) + .padding(.vertical, 20) + } + .frame(width: 550, height: 700) + .background( + RoundedRectangle(cornerRadius: 24) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.98)) + ) + .overlay( + RoundedRectangle(cornerRadius: 24) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + } + + private func helpStep(number: String, text: String) -> some View { + HStack(alignment: .top, spacing: 8) { + Text(number) + .font(.system(size: 13, weight: .bold)) + .foregroundColor(brandBlue) + .frame(width: 20) + + Text(text) + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.8)) + } + } + + private func portRangeRow(protocol protocolName: String, ports: String) -> some View { + HStack(spacing: 12) { + Text(protocolName) + .font(.system(size: 13, weight: .bold)) + .foregroundColor(brandOrange) + .frame(width: 40, alignment: .leading) + + Text(ports) + .font(.system(size: 13, weight: .medium)) + .foregroundColor(.white) + } + } +} + +// MARK: - App Card Component + +private struct CoopAppCard: View { + let app: TemporaryApp + let isSelected: Bool + let onTap: () -> Void + + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + + var body: some View { + Button(action: onTap) { + HStack(spacing: 16) { + // App Icon/Thumbnail placeholder + ZStack { + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.1)) + .frame(width: 60, height: 60) + + Image(systemName: "gamecontroller.fill") + .font(.system(size: 28)) + .foregroundColor(.white.opacity(0.6)) + } + + VStack(alignment: .leading, spacing: 4) { + Text(app.name) + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white) + + Text(app.id ?? "Unknown ID") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.5)) + } + + Spacer() + + if isSelected { + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 28)) + .foregroundColor(brandViolet) + } + } + .padding(20) + .background( + RoundedRectangle(cornerRadius: 16) + .fill(isSelected ? brandViolet.opacity(0.15) : Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke(isSelected ? brandViolet : Color.white.opacity(0.1), lineWidth: isSelected ? 2 : 1) + ) + } + .buttonStyle(.plain) + .hoverEffect() + } +} diff --git a/Moonlight Vision/CoopJoinView.swift b/Moonlight Vision/CoopJoinView.swift new file mode 100644 index 000000000..788e3c0ca --- /dev/null +++ b/Moonlight Vision/CoopJoinView.swift @@ -0,0 +1,669 @@ +// +// CoopJoinView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import SwiftUI +import GroupActivities + +struct CoopJoinView: View { + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.openImmersiveSpace) private var openImmersiveSpace + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + @Environment(\.dismiss) private var dismiss + + @ObservedObject private var coordinator = CoopSessionCoordinator.shared + + @Binding var isPresented: Bool + @Binding var parentIsPresented: Bool // To dismiss the entire co-op flow + + @State private var availableSessions: [MoonlightCoopActivity] = [] + @State private var isJoining = false + @State private var errorMessage: String? + @State private var connectionProgress: String? + @State private var selectedCoopBitrate: Int32 = 30000 // Default 30 Mbps + + // Brand colors + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) + + var body: some View { + VStack(spacing: 32) { + // Header + VStack(spacing: 12) { + Image(systemName: "person.badge.plus.fill") + .font(.system(size: 64, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandBlue, brandBlue.opacity(0.7)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + Text("Join Co-op Session") + .font(.system(size: 36, weight: .bold)) + .foregroundColor(.white) + + Text("Select a session to join") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + } + .padding(.top, 48) + + Divider() + .background(Color.white.opacity(0.2)) + + // Session List or Empty State + if isJoining { + joiningView + } else if availableSessions.isEmpty { + emptyStateView + } else { + sessionListView + } + + Spacer() + + // Error Message + if let error = errorMessage { + Text(error) + .font(.system(size: 16, weight: .medium)) + .foregroundColor(.red) + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.red.opacity(0.1)) + ) + .padding(.bottom, 32) + } + } + .frame(width: 600, height: 800) + .background( + RoundedRectangle(cornerRadius: 32) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) + .shadow(color: .black.opacity(0.3), radius: 30, x: 0, y: 15) + ) + .overlay( + RoundedRectangle(cornerRadius: 32) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .overlay(alignment: .topLeading) { + // Back button in top-left corner + Button { + isPresented = false + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white.opacity(0.7)) + .padding(16) + .background( + Circle() + .fill(Color.white.opacity(0.1)) + ) + } + .buttonStyle(.plain) + .clipShape(Circle()) + .hoverEffect() + .padding(.leading, 24) + .padding(.top, 24) + } + .task { + await observeSessions() + } + .onAppear { + // Load last-used co-op bitrate from UserDefaults + let savedBitrate = UserDefaults.standard.integer(forKey: "lastCoopBitrateGuest") + if savedBitrate > 0 { + selectedCoopBitrate = Int32(savedBitrate) + print("[CoopJoin] Loaded saved co-op bitrate: \(selectedCoopBitrate / 1000) Mbps") + } else { + print("[CoopJoin] Using default co-op bitrate: 30 Mbps") + } + } + } + + // MARK: - Session List View + + private var sessionListView: some View { + ScrollView { + VStack(spacing: 16) { + // Bitrate picker at top + bitratePickerCard + + ForEach(availableSessions, id: \.sessionID) { session in + SessionCard( + session: session, + guestFrameRate: viewModel.streamSettings.framerate, + onJoin: { joinSession(session) }, + onChangeSettings: { openSettings() } + ) + } + } + .padding(.horizontal, 24) + } + .frame(height: 500) + } + + // MARK: - Bitrate Picker Card + + private var bitratePickerCard: some View { + HStack { + Text("Co-op Mode Bitrate") + .font(.system(size: 16)) + .foregroundColor(.white.opacity(0.8)) + + Spacer() + + Picker("", selection: $selectedCoopBitrate) { + Text("25 Mbps").tag(Int32(25000)) + Text("30 Mbps").tag(Int32(30000)) + Text("50 Mbps").tag(Int32(50000)) + Text("75 Mbps").tag(Int32(75000)) + Text("100 Mbps").tag(Int32(100000)) + Text("120 Mbps").tag(Int32(120000)) + Text("150 Mbps").tag(Int32(150000)) + } + .pickerStyle(.menu) + .contentShape(Rectangle()) + .hoverEffect() + .onChange(of: selectedCoopBitrate) { _, newValue in + UserDefaults.standard.set(Int(newValue), forKey: "lastCoopBitrateGuest") + print("[CoopJoin] Saved co-op bitrate: \(newValue / 1000) Mbps") + } + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke(Color.white.opacity(0.1), lineWidth: 1) + ) + } + + // MARK: - Empty State View + + private var emptyStateView: some View { + VStack(spacing: 24) { + Image(systemName: "antenna.radiowaves.left.and.right.slash") + .font(.system(size: 64)) + .foregroundColor(.white.opacity(0.3)) + + Text("No sessions available") + .font(.system(size: 22, weight: .semibold)) + .foregroundColor(.white) + + Text("Start a FaceTime call with a friend to join their co-op session.") + .font(.system(size: 16)) + .foregroundColor(.white.opacity(0.7)) + .multilineTextAlignment(.center) + .padding(.horizontal, 40) + } + .padding(40) + } + + // MARK: - Joining View + + private var joiningView: some View { + VStack(spacing: 24) { + ProgressView() + .progressViewStyle(.circular) + .scaleEffect(1.5) + .tint(brandBlue) + + Text(connectionProgress ?? "Connecting...") + .font(.system(size: 22, weight: .semibold)) + .foregroundColor(.white) + + Text("Host stream is ready!") + .font(.system(size: 16)) + .foregroundColor(.white.opacity(0.6)) + } + .padding(40) + } + + // MARK: - Actions + + private func observeSessions() async { + print("[CoopJoin] Starting to observe sessions...") + // Observe available SharePlay sessions + for await sessions in coordinator.observeAvailableSessions() { + print("[CoopJoin] Received \(sessions.count) sessions") + await MainActor.run { + availableSessions = sessions + } + } + print("[CoopJoin] Session observation ended") + } + + private func joinSession(_ session: MoonlightCoopActivity) { + guard !isJoining else { return } + + // Auto-match frame rate to host's if different + let guestFrameRate = viewModel.streamSettings.framerate + if guestFrameRate != session.hostFrameRate { + print("[CoopJoin] Auto-matching frame rate: \(guestFrameRate)fps -> \(session.hostFrameRate)fps") + viewModel.streamSettings.framerate = session.hostFrameRate + } + + isJoining = true + errorMessage = nil + connectionProgress = "Checking pairing status..." + + Task { + do { + // Join the SharePlay session first + try await coordinator.joinPendingSession(session) + + // Check if already paired with this PC + let existingHost = await checkIfAlreadyPaired( + address: session.hostPCAddress, + name: session.hostPCName + ) + + let host: TemporaryHost + + if let existingHost = existingHost { + // ✅ Already paired - update connection info from session + print("[CoopJoin] Already paired with \(session.hostPCName), updating connection info") + print("[CoopJoin] Mode: \(session.connectionMode), Address: \(session.hostPCAddress)") + + // Clean the address: Strip port if included (format: "IP:PORT") + let rawAddr = session.hostPCAddress + let cleanIP = rawAddr.components(separatedBy: ":").first ?? rawAddr + + // Use the cleaned IP for address fields + existingHost.address = cleanIP + existingHost.activeAddress = session.hostPCAddress // Keep original for HTTP calls + existingHost.httpsPort = session.hostPCPort + connectionProgress = "Already paired - launching stream..." + host = existingHost + } else { + // ❌ NOT paired - need PIN flow + print("[CoopJoin] Not paired - starting PIN flow") + connectionProgress = "Pairing with \(session.hostPCName)..." + + host = try await pairWithHostUsingPIN( + address: session.hostPCAddress, + name: session.hostPCName, + port: session.hostPCPort + ) + } + + // Create app reference + let app = TemporaryApp(id: session.appID, name: session.appName) + app.maybeHost = host + + // Update ViewModel with co-op state + viewModel.isCoopSession = true + viewModel.assignedControllerSlot = 1 // Guest is slot 1 (player 2) + + // Set co-op bitrate override before launching stream + viewModel.coopBitrateOverride = selectedCoopBitrate + print("[CoopJoin] Set co-op bitrate override: \(selectedCoopBitrate / 1000) Mbps") + + print("[CoopJoin] Launching stream...") + connectionProgress = "Launching stream..." + try await Task.sleep(for: .milliseconds(500)) + + // Clear any stale state from the guest's previous stream + // (cooldowns, stuck streamState, etc.) before launching + debugLog("[CoopJoin] Calling prepareForNewStream before launch") + viewModel.prepareForNewStream() + + debugLog("[CoopJoin] About to call launchCoopStream") + let launched = await launchCoopStream(app: app, host: host) + debugLog("[CoopJoin] launchCoopStream returned: \(launched)") + + if launched { + // launchCoopStream already waited for window to open + await MainActor.run { + isPresented = false + parentIsPresented = false + } + } else { + // Stream failed to launch - don't dismiss the UI so user + // can see the error and try again. Clean up co-op state. + viewModel.isCoopSession = false + viewModel.assignedControllerSlot = 0 + viewModel.coopBitrateOverride = nil + } + + isJoining = false + } catch CoopError.hostNotFound { + errorMessage = "Session not found. The host may have cancelled." + isJoining = false + connectionProgress = nil + } catch CoopError.connectionTimeout { + errorMessage = "Pairing timed out. Host did not enter PIN in time." + isJoining = false + connectionProgress = nil + } catch { + errorMessage = "Failed to join: \(error.localizedDescription)" + isJoining = false + connectionProgress = nil + } + } + } + + /// Check if guest is already paired with this PC + /// Returns host only if it has a valid serverCert (actually paired, not just discovered) + private func checkIfAlreadyPaired(address: String, name: String) async -> TemporaryHost? { + return await withCheckedContinuation { continuation in + // Check all saved hosts for matching address + let dataManager = DataManager() + guard let allHosts = dataManager.getHosts() else { + print("[CoopJoin] No hosts found in database") + continuation.resume(returning: nil) + return + } + + print("[CoopJoin] Checking \(allHosts.count) saved hosts for pairing") + + for host in allHosts { + print("[CoopJoin] Checking host: \(host.name), address: \(host.address ?? "nil"), localAddress: \(host.localAddress ?? "nil"), serverCert: \(host.serverCert != nil ? "YES" : "NO")") + + // Match by address or name + let addressMatch = host.address == address || + host.localAddress == address || + host.externalAddress == address || + host.name == name + + if addressMatch { + print("[CoopJoin] Address match found for \(name)") + + // Must have a valid serverCert to be considered "paired" + if host.serverCert != nil { + print("[CoopJoin] ✅ Host has valid serverCert - using existing pairing") + continuation.resume(returning: host) + return + } else { + print("[CoopJoin] ❌ Host has NO serverCert - not paired, will show PIN") + } + } + } + + print("[CoopJoin] No valid pairing found for \(name) - will show PIN prompt") + continuation.resume(returning: nil) + } + } + + /// Pair with host using PIN flow + private func pairWithHostUsingPIN(address: String, name: String, port: UInt16) async throws -> TemporaryHost { + // Strip port from address if it's included (format: "IP:PORT") + let cleanAddress = address.components(separatedBy: ":").first ?? address + + // HttpManager expects activeAddress in "IP:PORT" format for HTTP port (47989) + let httpPort: UInt16 = 47989 + let activeAddressWithPort = "\(cleanAddress):\(httpPort)" + + print("[CoopJoin] Starting PIN pairing with \(name) at \(cleanAddress)") + + // Create temporary host for pairing + let host = TemporaryHost() + host.name = name + host.address = cleanAddress + host.activeAddress = activeAddressWithPort // Format: "IP:47989" for HTTP + host.localAddress = activeAddressWithPort + host.httpsPort = port // HTTPS port (47984) + + // Add host to viewModel.hosts so updateHost can save serverCert to database after pairing + // This ensures the pairing persists and guest won't need PIN next time + await MainActor.run { + if !viewModel.hosts.contains(where: { $0.uuid == host.uuid }) { + viewModel.hosts.append(host) + } + viewModel.tryPairHost(host) + } + + // Wait for PIN to be generated (usually instant) + let pin = try await waitForPIN(timeout: 5.0) + + print("[CoopJoin] PIN generated: \(pin)") + connectionProgress = "PIN: \(pin)\n\nTell host to enter this PIN in Sunshine" + + // Poll for pairing approval (host enters PIN in Sunshine) + let approved = try await waitForPairingApproval(host: host, timeout: 120.0) + + if approved { + print("[CoopJoin] Pairing approved!") + connectionProgress = "Pairing successful!" + return host + } else { + print("[CoopJoin] Pairing timed out") + throw CoopError.connectionTimeout + } + } + + /// Wait for PIN to be generated by PairManager + private func waitForPIN(timeout: TimeInterval) async throws -> String { + let startTime = Date() + + while Date().timeIntervalSince(startTime) < timeout { + let pin = await MainActor.run { viewModel.currentPin } + if !pin.isEmpty { + return pin + } + try await Task.sleep(for: .milliseconds(100)) + } + + throw CoopError.connectionTimeout + } + + /// Poll Sunshine to check if pairing was approved + private func waitForPairingApproval(host: TemporaryHost, timeout: TimeInterval) async throws -> Bool { + let startTime = Date() + + while Date().timeIntervalSince(startTime) < timeout { + // Check if pairing completed successfully + let pairingComplete = await MainActor.run { + !viewModel.pairingInProgress && host.serverCert != nil + } + + if pairingComplete { + return true + } + + // Check if pairing failed + let pairingFailed = await MainActor.run { + !viewModel.pairingInProgress && host.serverCert == nil && viewModel.currentPin == nil + } + + if pairingFailed { + return false + } + + // Wait 1 second before checking again + try await Task.sleep(for: .seconds(1)) + } + + return false // Timeout + } + + private func openSettings() { + // Navigate to settings to change frame rate + // This opens the settings view + print("[CoopJoin] Opening settings to change frame rate") + } + + @discardableResult + private func launchCoopStream(app: TemporaryApp, host: TemporaryHost) async -> Bool { + // Configure the stream FIRST (creates new sessionUUID) + guard let config = viewModel.stream(app: app) else { + errorMessage = "Failed to configure stream" + return false + } + + let renderer = viewModel.streamSettings.renderer + debugLog("[CoopJoin] launchCoopStream - renderer: \(renderer), sessionUUID: \(config.sessionUUID)") + + + // Without this delay, the old view may still be alive when we open the new one, + // causing "ghost" views that fight over C-level resources (StreamManager, audio). + debugLog("[CoopJoin] Dismissing old windows...") + dismissWindow(id: "flatDisplayWindow") + dismissWindow(id: "classicStreamingWindow") + if viewModel.isImmersiveSpaceOpen { + await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false + } + + // Wait 500ms for OS to fully tear down old window and release resources + debugLog("[CoopJoin] Waiting 500ms for old window cleanup...") + try? await Task.sleep(for: .milliseconds(500)) + debugLog("[CoopJoin] Wait complete, opening fresh window") + + // Now open the new window with the new config + if renderer == .curvedDisplay { + let result = try? await openImmersiveSpace(id: renderer.windowId, value: config) + viewModel.isImmersiveSpaceOpen = true + debugLog("[CoopJoin] Immersive space result: \(String(describing: result))") + } else { + openWindow(id: renderer.windowId, value: config) + debugLog("[CoopJoin] Window opened: \(renderer.windowId)") + } + + return true + } +} + +// MARK: - Session Card Component + +private struct SessionCard: View { + let session: MoonlightCoopActivity + let guestFrameRate: Int32 + let onJoin: () -> Void + let onChangeSettings: () -> Void + + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + + private var hasFrameRateMismatch: Bool { + session.hostFrameRate != guestFrameRate + } + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + // Header + HStack(spacing: 12) { + Image(systemName: "gamecontroller.fill") + .font(.system(size: 28)) + .foregroundColor(brandBlue) + + VStack(alignment: .leading, spacing: 4) { + Text(session.hostPCName) + .font(.system(size: 20, weight: .bold)) + .foregroundColor(.white) + + Text(session.appName) + .font(.system(size: 16, weight: .medium)) + .foregroundColor(brandOrange) + } + + Spacer() + } + + Divider() + .background(Color.white.opacity(0.2)) + + // Connection Mode + HStack(spacing: 8) { + Text("Mode:") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.6)) + + Text(session.connectionMode) + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(session.connectionMode == "Online" ? brandViolet : brandBlue) + } + + // Frame Rate Info + HStack(spacing: 8) { + Text("Frame rate:") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.6)) + + Text("\(session.hostFrameRate)fps") + .font(.system(size: 14, weight: .medium)) + .foregroundColor(.white) + + // Green checkmark to indicate compatibility + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.green) + .font(.system(size: 16)) + } + + // Frame Rate Auto-Match Info + if hasFrameRateMismatch { + HStack(spacing: 10) { + Image(systemName: "arrow.triangle.2.circlepath") + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(brandBlue) + + Text("Your frame rate will be adjusted to \(session.hostFrameRate)fps") + .font(.system(size: 13)) + .foregroundColor(.white.opacity(0.7)) + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(brandBlue.opacity(0.1)) + ) + } + + // Join Button + Button { + onJoin() + } label: { + HStack(spacing: 8) { + Image(systemName: "play.fill") + .font(.system(size: 14)) + Text("Join Session") + .font(.system(size: 15, weight: .semibold)) + } + .foregroundColor(.white) + .padding(.horizontal, 24) + .padding(.vertical, 12) + .background( + RoundedRectangle(cornerRadius: 12) + .fill( + LinearGradient( + colors: [brandBlue, brandBlue.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + } + .buttonStyle(ScaleButtonStyle()) + } + .padding(20) + .background( + RoundedRectangle(cornerRadius: 16) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke( + hasFrameRateMismatch ? Color.orange.opacity(0.5) : Color.white.opacity(0.1), + lineWidth: hasFrameRateMismatch ? 2 : 1 + ) + ) + } +} diff --git a/Moonlight Vision/CoopModeSelectionView.swift b/Moonlight Vision/CoopModeSelectionView.swift new file mode 100644 index 000000000..83055c23a --- /dev/null +++ b/Moonlight Vision/CoopModeSelectionView.swift @@ -0,0 +1,481 @@ +// +// CoopModeSelectionView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import SwiftUI +import GroupActivities + +struct CoopModeSelectionView: View { + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.dismiss) private var dismiss + + @ObservedObject private var coordinator = CoopSessionCoordinator.shared + + @Binding var isPresented: Bool + + @State private var showHostView = false + @State private var showJoinView = false + @State private var selectedHost: TemporaryHost? + + // Brand colors + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) + + // FaceTime call detection - default to false to show reminder + // Users need to have an active FaceTime call for SharePlay to work + @State private var isInFaceTimeCall = false + + var body: some View { + VStack(spacing: 32) { + // Header + VStack(spacing: 12) { + Image(systemName: "person.2.fill") + .font(.system(size: 64, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.7)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + Text("Co-op Play") + .font(.system(size: 36, weight: .bold)) + .foregroundColor(.white) + + Text("Play local co-op games with a friend") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + } + .padding(.top, 32) + + Divider() + .background(Color.white.opacity(0.2)) + + // Upload Speed Warning Banner + HStack(spacing: 14) { + Image(systemName: "network") + .font(.system(size: 22, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandBlue, brandBlue.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + VStack(alignment: .leading, spacing: 4) { + Text("Upload Speed Required") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + Text("For remote co-op: Strong internet connection required (30+ Mbps recommended)") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.6)) + } + + Spacer() + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke( + LinearGradient( + colors: [brandBlue.opacity(0.4), brandBlue.opacity(0.2)], + startPoint: .leading, + endPoint: .trailing + ), + lineWidth: 1 + ) + ) + .padding(.horizontal, 32) + + // FaceTime Info Banner + if !isInFaceTimeCall { + HStack(spacing: 14) { + Image(systemName: "video.fill") + .font(.system(size: 22, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandViolet, brandBlue], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + VStack(alignment: .leading, spacing: 4) { + Text("FaceTime Call Required") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white) + Text("Start a FaceTime call with your friend first") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.6)) + } + + Spacer() + } + .padding(16) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 12) + .stroke( + LinearGradient( + colors: [brandViolet.opacity(0.4), brandBlue.opacity(0.2)], + startPoint: .leading, + endPoint: .trailing + ), + lineWidth: 1 + ) + ) + .padding(.horizontal, 32) + } + + // Mode Selection Buttons + VStack(spacing: 20) { + // Host Button + Button { + showHostView = true + } label: { + HStack(spacing: 16) { + Image(systemName: "play.circle.fill") + .font(.system(size: 32, weight: .semibold)) + + VStack(alignment: .leading, spacing: 4) { + Text("Host Session") + .font(.system(size: 24, weight: .bold)) + Text("Start a new co-op session") + .font(.system(size: 15)) + .opacity(0.7) + } + + Spacer() + + Image(systemName: "chevron.right") + .font(.system(size: 20, weight: .semibold)) + .opacity(0.5) + } + .foregroundColor(.white) + .padding(24) + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 16) + .fill( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .shadow(color: brandViolet.opacity(0.3), radius: 15, x: 0, y: 8) + } + .buttonStyle(.plain) + .hoverEffect() + .disabled(coordinator.sessionActive) + .opacity(coordinator.sessionActive ? 0.5 : 1.0) + + // Join Button + Button { + showJoinView = true + } label: { + HStack(spacing: 16) { + Image(systemName: "person.badge.plus.fill") + .font(.system(size: 32, weight: .semibold)) + + VStack(alignment: .leading, spacing: 4) { + Text("Join Session") + .font(.system(size: 24, weight: .bold)) + Text("Join an active co-op session") + .font(.system(size: 15)) + .opacity(0.7) + } + + Spacer() + + Image(systemName: "chevron.right") + .font(.system(size: 20, weight: .semibold)) + .opacity(0.5) + } + .foregroundColor(.white) + .padding(24) + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 16) + .fill( + LinearGradient( + colors: [brandBlue, brandBlue.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .shadow(color: brandBlue.opacity(0.3), radius: 15, x: 0, y: 8) + } + .buttonStyle(.plain) + .hoverEffect() + .disabled(coordinator.sessionActive) + .opacity(coordinator.sessionActive ? 0.5 : 1.0) + + // Status message if already in session + if coordinator.sessionActive { + Text("Already in an active co-op session") + .font(.system(size: 14, weight: .medium)) + .foregroundColor(.orange) + } + } + .padding(.horizontal, 32) + + Spacer() + } + .frame(width: 600, height: 800) + .background( + RoundedRectangle(cornerRadius: 32) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) + .shadow(color: .black.opacity(0.3), radius: 30, x: 0, y: 15) + ) + .overlay( + RoundedRectangle(cornerRadius: 32) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .overlay(alignment: .topLeading) { + // Back button in top-left corner + Button { + isPresented = false + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white.opacity(0.7)) + .padding(16) + .background( + Circle() + .fill(Color.white.opacity(0.1)) + ) + } + .buttonStyle(.plain) + .clipShape(Circle()) + .hoverEffect() + .padding(.leading, 24) + .padding(.top, 24) + } + .sheet(isPresented: $showHostView) { + if let host = selectedHost { + CoopHostView(host: host, isPresented: $showHostView, parentIsPresented: $isPresented) + .environmentObject(viewModel) + } else { + CoopHostSelectorView(selectedHost: $selectedHost, isPresented: $showHostView) + .environmentObject(viewModel) + } + } + .sheet(isPresented: $showJoinView) { + CoopJoinView(isPresented: $showJoinView, parentIsPresented: $isPresented) + .environmentObject(viewModel) + } + .onChange(of: selectedHost) { _, newHost in + // When a host is selected, automatically show the host view + if newHost != nil { + showHostView = true + } + } + } +} + +// MARK: - Co-op Host Selector View +struct CoopHostSelectorView: View { + @EnvironmentObject private var viewModel: MainViewModel + @Binding var selectedHost: TemporaryHost? + @Binding var isPresented: Bool + + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + + var body: some View { + VStack(spacing: 32) { + headerSection + hostListSection + } + .frame(width: 600, height: 700) + .background(backgroundView) + .overlay(borderOverlay) + .overlay(alignment: .topLeading) { backButton } + } + + private var headerSection: some View { + VStack(spacing: 12) { + Image(systemName: "desktopcomputer") + .font(.system(size: 48, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.7)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + Text("Select Your Gaming PC") + .font(.system(size: 28, weight: .bold)) + .foregroundColor(.white) + + Text("Choose which computer to host the co-op session") + .font(.system(size: 15)) + .foregroundColor(.white.opacity(0.7)) + .multilineTextAlignment(.center) + } + .padding(.top, 32) + } + + private var hostListSection: some View { + ScrollView { + VStack(spacing: 16) { + if viewModel.hostsWithPairState.isEmpty { + emptyStateView + } else { + ForEach(viewModel.hostsWithPairState, id: \.id) { host in + hostCardButton(for: host) + } + } + } + .padding(.horizontal, 24) + } + .frame(maxHeight: 400) + } + + private var emptyStateView: some View { + VStack(spacing: 16) { + Image(systemName: "exclamationmark.triangle.fill") + .font(.system(size: 48)) + .foregroundColor(brandOrange) + + Text("No Gaming PCs Found") + .font(.system(size: 20, weight: .bold)) + .foregroundColor(.white) + + Text("Make sure your gaming PC is:\n• Powered on\n• Connected to the network\n• Running Moonlight/Sunshine") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + .multilineTextAlignment(.center) + .padding(.horizontal, 32) + } + .padding(.vertical, 40) + } + + private func hostCardButton(for host: TemporaryHost) -> some View { + Button { + selectedHost = host + isPresented = false + } label: { + HStack(spacing: 16) { + Circle() + .fill(host.state == .online ? Color.green : Color.red) + .frame(width: 12, height: 12) + .shadow(color: (host.state == .online ? Color.green : Color.red).opacity(0.8), radius: 4) + + VStack(alignment: .leading, spacing: 4) { + Text(host.name) + .font(.system(size: 18, weight: .bold)) + .foregroundColor(.white) + + Text(host.state == .online ? "Online" : "Offline") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + } + + Spacer() + + Image(systemName: "chevron.right") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.white.opacity(0.4)) + } + .padding(20) + .background( + RoundedRectangle(cornerRadius: 16) + .fill(Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke(Color.white.opacity(0.1), lineWidth: 1) + ) + } + .buttonStyle(.plain) + .hoverEffect() + .disabled(host.state != .online || host.pairState != .paired) + .opacity((host.state == .online && host.pairState == .paired) ? 1.0 : 0.5) + } + + private var backgroundView: some View { + RoundedRectangle(cornerRadius: 32) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) + .shadow(color: .black.opacity(0.3), radius: 30, x: 0, y: 15) + } + + private var borderOverlay: some View { + RoundedRectangle(cornerRadius: 32) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + } + + private var backButton: some View { + Button { + isPresented = false + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white.opacity(0.7)) + .padding(16) + .background( + Circle() + .fill(Color.white.opacity(0.1)) + ) + } + .buttonStyle(.plain) + .clipShape(Circle()) + .hoverEffect() + .padding(.leading, 24) + .padding(.top, 24) + } +} diff --git a/Moonlight Vision/CoopSessionCoordinator.swift b/Moonlight Vision/CoopSessionCoordinator.swift new file mode 100644 index 000000000..aad8a670f --- /dev/null +++ b/Moonlight Vision/CoopSessionCoordinator.swift @@ -0,0 +1,567 @@ +// +// CoopSessionCoordinator.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import Foundation +import GroupActivities +import Combine + +@MainActor +class CoopSessionCoordinator: ObservableObject { + // MARK: - Published State + + @Published var isHosting: Bool = false + @Published var isGuest: Bool = false + @Published var assignedControllerSlot: Int = 0 + @Published var participants: [Participant] = [] + @Published var sessionActive: Bool = false + @Published var currentActivity: MoonlightCoopActivity? + @Published var friendJoinedNotification: Bool = false // Triggers notification UI + @Published var disconnectNotification: Bool = false // Triggers disconnect notification UI + @Published var disconnectMessage: String = "" // "Guest Disconnected" or "Host Disconnected" + + // MARK: - Private Properties + + private var groupSession: GroupSession? + private var subscriptions = Set() + private var sessionTask: Task? + + // Store pending sessions for the Join flow + private var pendingSessions: [String: GroupSession] = [:] + + // MARK: - Singleton + + static let shared = CoopSessionCoordinator() + + private init() { + observeGroupSessions() + } + + // MARK: - Session Management + + /// Start hosting a co-op session + func startHosting(activity: MoonlightCoopActivity) async throws { + print("[CoopCoordinator] ========== Starting host session ==========") + print("[CoopCoordinator] App: \(activity.appName)") + print("[CoopCoordinator] Session ID: \(activity.sessionID)") + + // Clear any existing session + await endSession() + print("[CoopCoordinator] Previous session ended") + + // Set as host and assign slot 0 + isHosting = true + isGuest = false + assignedControllerSlot = 0 // Host is slot 0 (player 1) + currentActivity = activity + print("[CoopCoordinator] State set: isHosting=true, slot=0") + + // IMPORTANT: Restart session observation BEFORE activating + // so we receive our own session back for participant tracking + observeGroupSessions() + print("[CoopCoordinator] Session observation restarted") + + // Check if SharePlay is available before activating + print("[CoopCoordinator] Checking if SharePlay is available...") + let prepareResult = await activity.prepareForActivation() + print("[CoopCoordinator] prepareForActivation() returned: \(prepareResult)") + + switch prepareResult { + case .activationDisabled: + print("[CoopCoordinator] ERROR: SharePlay is disabled - no FaceTime call") + throw CoopError.noFaceTimeCall + case .activationPreferred: + print("[CoopCoordinator] SharePlay is available and preferred!") + case .cancelled: + print("[CoopCoordinator] ERROR: SharePlay activation was cancelled") + throw CoopError.noFaceTimeCall + @unknown default: + print("[CoopCoordinator] Unknown prepareForActivation result") + } + + // Activate the GroupActivity + print("[CoopCoordinator] Calling activity.activate()...") + let result = try await activity.activate() + print("[CoopCoordinator] activity.activate() returned: \(result)") + + // Check if activation failed (no FaceTime call) + if !result { + print("[CoopCoordinator] ERROR: activity.activate() returned false - no FaceTime call detected") + throw CoopError.noFaceTimeCall + } + + print("[CoopCoordinator] Host session activated, waiting for guest...") + } + + /// End the current co-op session + func endSession() async { + // Guard against redundant calls - don't restart listeners if already cleaned up + guard sessionActive || groupSession != nil || isHosting || isGuest else { + debugLog("[CoopCoordinator] endSession() called but already inactive - skipping") + return + } + + debugLog("[CoopCoordinator] Ending co-op session - isHosting: \(isHosting), isGuest: \(isGuest)") + + groupSession?.leave() + debugLog("[CoopCoordinator] groupSession.leave() called") + groupSession = nil + + isHosting = false + isGuest = false + assignedControllerSlot = 0 + sessionActive = false + currentActivity = nil + participants = [] + subscriptions.removeAll() + + // ALWAYS clear pending sessions - they become invalid after leave() + // SharePlay will re-advertise active sessions when we start listening again + pendingSessions.removeAll() + print("[CoopCoordinator] Cleared pending sessions (session objects invalidated by leave())") + + // Restart background listener so we can discover sessions again + // observeGroupSessions() handles cancelling any existing listener internally + print("[CoopCoordinator] Restarting background session listener after disconnect") + observeGroupSessions() + } + + // MARK: - SharePlay Session Observation + + private func observeGroupSessions() { + // Cancel any existing listener first to avoid duplicates + sessionTask?.cancel() + sessionTask = nil + + print("[CoopCoordinator] observeGroupSessions() - Starting background session listener") + sessionTask = Task { + print("[CoopCoordinator] Background listener: waiting for sessions...") + for await session in MoonlightCoopActivity.sessions() { + print("[CoopCoordinator] Background listener: *** SESSION RECEIVED *** App: \(session.activity.appName)") + await handleNewSession(session) + } + print("[CoopCoordinator] Background listener: loop ended") + } + } + + private func handleNewSession(_ session: GroupSession) async { + print("[CoopCoordinator] New GroupSession received") + + let activity = session.activity + + // Determine if we're host or guest + if isHosting { + // We're the HOST - we started this session, join automatically + print("[CoopCoordinator] We are HOST - auto-joining our own session") + currentActivity = activity + await actuallyJoinSession(session) + } else { + // We're a potential GUEST - don't auto-join! + // Store the session for the Join UI to display + print("[CoopCoordinator] We are GUEST - storing session for UI (not auto-joining)") + print("[CoopCoordinator] Session available: \(activity.appName) on \(activity.hostPCName)") + + // Store in pendingSessions so CoopJoinView can display it + pendingSessions[activity.sessionID] = session + + // Don't set isGuest or sessionActive yet - wait for user to click Join + // But store the activity so UI can access it + currentActivity = activity + } + } + + // MARK: - Helper Methods + + /// Get the current frame rate from the activity (for guest to match) + func getRequiredFrameRate() -> Int32? { + return currentActivity?.hostFrameRate + } + + /// Check if frame rate matches requirement + func validateFrameRate(_ frameRate: Int32) -> Bool { + guard let required = currentActivity?.hostFrameRate else { return true } + return frameRate == required + } + + /// Get pairing data for guest auto-pairing + func getPairingData() -> Data? { + return currentActivity?.pairingData + } + + /// Get host PC connection info + func getHostInfo() -> (address: String, port: UInt16, name: String)? { + guard let activity = currentActivity else { return nil } + return (activity.hostPCAddress, activity.hostPCPort, activity.hostPCName) + } + + /// Get app info to launch + func getAppInfo() -> (id: String, name: String)? { + guard let activity = currentActivity else { return nil } + return (activity.appID, activity.appName) + } + + // MARK: - New Methods for Polished Flow + + /// Select the best address for connection (prefer local for fast same-network, external as fallback) + func selectBestAddress(for host: TemporaryHost) -> String { + // Prefer LOCAL address first - works instantly on same network + // Remote users will fail fast on local and use external fallback in Moonlight's connection logic + if let localAddr = host.localAddress, !localAddr.isEmpty { + print("[CoopCoordinator] Using local address (preferred): \(localAddr)") + return localAddr + } + + // Fall back to active address + if let activeAddr = host.activeAddress, !activeAddr.isEmpty { + print("[CoopCoordinator] Using active address: \(activeAddr)") + return activeAddr + } + + // Fall back to external address for remote connections + if let externalAddr = host.externalAddress, !externalAddr.isEmpty { + print("[CoopCoordinator] Using external address (fallback): \(externalAddr)") + return externalAddr + } + + // Last resort: use address field + print("[CoopCoordinator] Using fallback address: \(host.address ?? "unknown")") + return host.address ?? "" + } + + /// Check if host is internet accessible (has valid external IP) + func isInternetAccessible(host: TemporaryHost) -> Bool { + guard let externalAddr = host.externalAddress, !externalAddr.isEmpty else { + return false + } + + // Check if it's a valid external IP (not local) + let isLocal = externalAddr.starts(with: "192.168.") || + externalAddr.starts(with: "10.") || + externalAddr.starts(with: "172.16.") || + externalAddr == "127.0.0.1" + + return !isLocal + } + + /// Observe available SharePlay sessions (for join view) + func observeAvailableSessions() -> AsyncStream<[MoonlightCoopActivity]> { + print("[CoopCoordinator] observeAvailableSessions() called - starting to listen for sessions") + + // Cancel background listener to avoid competing for sessions + print("[CoopCoordinator] Cancelling background listener to avoid competition") + sessionTask?.cancel() + sessionTask = nil + + return AsyncStream { continuation in + // First, yield any sessions already stored by the background listener + Task { @MainActor [weak self] in + guard let self = self else { return } + if !self.pendingSessions.isEmpty { + print("[CoopCoordinator] Found \(self.pendingSessions.count) existing pending sessions, yielding them") + let activities = Array(self.pendingSessions.values.map { $0.activity }) + continuation.yield(activities) + } + } + + let task = Task { [weak self] in + print("[CoopCoordinator] Starting MoonlightCoopActivity.sessions() iteration...") + for await session in MoonlightCoopActivity.sessions() { + print("[CoopCoordinator] *** SESSION RECEIVED *** App: \(session.activity.appName)") + let activity = session.activity + + // Store the session so we can use it when user clicks Join + await MainActor.run { + self?.pendingSessions[activity.sessionID] = session + print("[CoopCoordinator] Stored pending session: \(activity.sessionID)") + } + + // Yield the activity for UI display + continuation.yield([activity]) + } + print("[CoopCoordinator] MoonlightCoopActivity.sessions() iteration ended") + } + + continuation.onTermination = { [weak self] _ in + print("[CoopCoordinator] Session observation terminated") + task.cancel() + + // Restart background listener when Join view closes + Task { @MainActor [weak self] in + guard let self = self else { return } + print("[CoopCoordinator] Restarting background listener after Join view closed") + self.observeGroupSessions() + } + } + } + } + + /// Join a stored pending session (called when user clicks Join) + func joinPendingSession(_ activity: MoonlightCoopActivity) async throws { + print("[CoopCoordinator] Attempting to join pending session: \(activity.sessionID)") + + guard let session = pendingSessions[activity.sessionID] else { + print("[CoopCoordinator] ERROR: No pending session found for ID: \(activity.sessionID)") + throw CoopError.hostNotFound + } + + // Remove from pending + pendingSessions.removeValue(forKey: activity.sessionID) + + // Set guest state + isGuest = true + isHosting = false + assignedControllerSlot = 1 // Guest is slot 1 (player 2) + currentActivity = activity + + // Actually join the session and set up observation + await actuallyJoinSession(session) + + print("[CoopCoordinator] Successfully joined pending session") + } + + /// Actually join a session and set up participant observation + /// Called by host (auto) and guest (explicit click) + private func actuallyJoinSession(_ session: GroupSession) async { + print("[CoopCoordinator] Actually joining session...") + + groupSession = session + session.join() + sessionActive = true + + // Observe participants + session.$activeParticipants + .sink { [weak self] activeParticipants in + guard let self = self else { return } + + let oldCount = self.participants.count + let newCount = activeParticipants.count + + // Protect against spurious 0-participant updates for hosts + // The host should always count as at least 1 participant + if self.isHosting && newCount == 0 && self.sessionActive { + print("[CoopCoordinator] Ignoring spurious 0-participant update for host") + return + } + + // Convert to our simple Participant struct + self.participants = activeParticipants.map { _ in Participant() } + print("[CoopCoordinator] Active participants: \(newCount)") + + // Trigger notification when guest joins (count goes from 1 to 2 and we're hosting) + if self.isHosting && oldCount == 1 && newCount == 2 { + print("[CoopCoordinator] Guest joined! Triggering notification") + self.friendJoinedNotification = true + + // Auto-dismiss notification after 3 seconds + Task { + try? await Task.sleep(for: .seconds(3)) + await MainActor.run { + self.friendJoinedNotification = false + } + } + + // AGGRESSIVE IDR FRAME REQUESTING FOR GUEST + // Request IDR frames repeatedly to help guest connect faster + print("[CoopCoordinator] Starting aggressive IDR frame requests for guest") + Task { + // Request immediately + LiRequestIdrFrame() + + // Then request every 2 seconds for 10 seconds + for i in 1...5 { + try? await Task.sleep(for: .seconds(2)) + print("[CoopCoordinator] IDR request #\(i) for guest") + LiRequestIdrFrame() + } + + print("[CoopCoordinator] Aggressive IDR requesting complete") + } + } + + // Trigger notification when someone disconnects (count goes from 2 to 1) + if oldCount == 2 && newCount == 1 { + if self.isHosting { + print("[CoopCoordinator] Guest disconnected! Host continues streaming as player 1/2") + self.disconnectMessage = "Guest Disconnected" + + // DO NOT activate a new activity here. The host should keep + // streaming normally on the existing session. Calling activate() + // on a new activity while already in an active SharePlay session + // triggers a system "Replace existing SharePlay activity?" dialog, + // which breaks the host's stream (frozen video on either choice). + // The host just keeps going as player 1 — the guest can rejoin + // via the existing FaceTime call's SharePlay session. + } else { + print("[CoopCoordinator] Host disconnected! Triggering notification") + self.disconnectMessage = "Host Disconnected" + } + + self.disconnectNotification = true + + // Auto-dismiss notification after 4 seconds (slightly longer for disconnect) + Task { + try? await Task.sleep(for: .seconds(4)) + await MainActor.run { + self.disconnectNotification = false + } + } + } + } + .store(in: &subscriptions) + + // Observe session state + session.$state + .sink { [weak self] state in + guard let self = self else { return } + print("[CoopCoordinator] Session state: \(state)") + if case .invalidated = state { + // Only auto-end session for guests + // Hosts should keep their session active so guests can rejoin + if self.isGuest { + print("[CoopCoordinator] Guest session invalidated - ending session") + Task { await self.endSession() } + } else if self.isHosting { + print("[CoopCoordinator] Host session invalidated - keeping session active for guest rejoin") + // Don't call endSession() - host can still invite/wait for guest + } + } + } + .store(in: &subscriptions) + + print("[CoopCoordinator] Session joined and observers set up") + } + + /// Join a session with timeout + func joinSessionWithTimeout(_ activity: MoonlightCoopActivity, timeout: TimeInterval) async throws { + print("[CoopCoordinator] Attempting to join session: \(activity.sessionID)") + + // Check if already in a session + if sessionActive { + throw CoopError.alreadyInSession + } + + // Set guest state + isGuest = true + isHosting = false + assignedControllerSlot = 1 // Guest is slot 1 (player 2) + currentActivity = activity + + // Create timeout task + let timeoutTask = Task { + try await Task.sleep(for: .seconds(timeout)) + throw CoopError.connectionTimeout + } + + // Create join task + let joinTask = Task { + // Wait for the session to be established + for await session in MoonlightCoopActivity.sessions() { + if session.activity.sessionID == activity.sessionID { + await handleNewSession(session) + return + } + } + } + + // Race between timeout and join + do { + try await withThrowingTaskGroup(of: Void.self) { group in + group.addTask { try await timeoutTask.value } + group.addTask { await joinTask.value } + + // Wait for first to complete + try await group.next() + + // Cancel the other task + timeoutTask.cancel() + joinTask.cancel() + } + } catch { + // Clean up on failure + await endSession() + throw error + } + + print("[CoopCoordinator] Successfully joined session") + } + + /// Check if we can start a new session (not already in one) + func canStartNewSession() -> Bool { + return !sessionActive + } + + /// Re-invite a guest by re-activating the existing activity. + /// We do NOT create a new activity/session ID because: + /// 1. Creating a new activity triggers "Replace existing session?" dialog + /// 2. Replacing tears down the SharePlay stack for everyone, causing crashes + /// 3. The guest's stale view state is already fixed by .id(sessionUUID) on the view + /// Re-activating the same activity just nudges SharePlay to re-broadcast it. + func reInviteGuest() async { + guard isHosting, let activity = currentActivity else { + print("[CoopCoordinator] reInviteGuest() - not hosting or no activity, skipping") + return + } + + print("[CoopCoordinator] Re-inviting guest (re-activating existing session: \(activity.sessionID))") + do { + let result = try await activity.activate() + print("[CoopCoordinator] Existing session re-activated: \(result)") + } catch { + print("[CoopCoordinator] Re-activation failed: \(error)") + } + } + + /// Suppress SharePlay system UI (call before activating) + func suppressSystemUI() async { + + print("[CoopCoordinator] System UI suppression requested (placeholder)") + } +} + +// MARK: - Participant Helper + +struct Participant: Identifiable, Hashable { + let id: UUID + + init(id: UUID = UUID()) { + self.id = id + } +} + +// MARK: - Error Types + +enum CoopError: LocalizedError { + case failedToExportPairing + case frameRateMismatch + case hostNotFound + case connectionTimeout + case hostUnreachable + case portForwardingRequired + case alreadyInSession + case noFaceTimeCall + + var errorDescription: String? { + switch self { + case .failedToExportPairing: + return "Failed to export pairing data" + case .frameRateMismatch: + return "Frame rate mismatch between host and guest" + case .hostNotFound: + return "Host not found" + case .connectionTimeout: + return "Pairing timed out. Host did not enter PIN within 2 minutes." + case .hostUnreachable: + return "Cannot reach host PC. Check network connection." + case .portForwardingRequired: + return "Port forwarding may be required for remote connections. Check ports 47984, 47989, 48010." + case .alreadyInSession: + return "Already in an active co-op session. Leave current session first." + case .noFaceTimeCall: + return "No Active FaceTime Call Detected." + } + } +} diff --git a/Moonlight Vision/CoopSetupView.swift b/Moonlight Vision/CoopSetupView.swift new file mode 100644 index 000000000..2a15cc6a7 --- /dev/null +++ b/Moonlight Vision/CoopSetupView.swift @@ -0,0 +1,457 @@ +// +// CoopSetupView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import SwiftUI +import GroupActivities + +struct CoopSetupView: View { + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.openWindow) private var openWindow + @Environment(\.openImmersiveSpace) private var openImmersiveSpace + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + @Environment(\.dismiss) private var dismiss + + @ObservedObject private var coordinator = CoopSessionCoordinator.shared + + let host: TemporaryHost + @Binding var isPresented: Bool + + @State private var selectedApp: TemporaryApp? + @State private var isStartingSession = false + @State private var errorMessage: String? + + // Brand colors + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + let brandBlue = Color(red: 0.5, green: 0.7, blue: 1.0) + + var body: some View { + VStack(spacing: 32) { + // Header + VStack(spacing: 12) { + Image(systemName: "person.2.fill") + .font(.system(size: 64, weight: .semibold)) + .foregroundStyle( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.7)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + + Text("Co-op Play") + .font(.system(size: 36, weight: .bold)) + .foregroundColor(.white) + + Text("Play local co-op games with a friend") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + } + .padding(.top, 32) + + Divider() + .background(Color.white.opacity(0.2)) + + // Status or App Selection + if coordinator.sessionActive && coordinator.isGuest { + guestJoiningView + } else if coordinator.sessionActive && coordinator.isHosting { + hostWaitingView + } else { + appSelectionView + } + + Spacer() + + // Error Message + if let error = errorMessage { + Text(error) + .font(.system(size: 16, weight: .medium)) + .foregroundColor(.red) + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(Color.red.opacity(0.1)) + ) + } + + // Close Button + Button { + dismiss() + } label: { + Text("Close") + .font(.system(size: 18, weight: .semibold)) + .foregroundColor(.white.opacity(0.7)) + .padding(.horizontal, 32) + .padding(.vertical, 16) + .background( + RoundedRectangle(cornerRadius: 16) + .fill(Color.white.opacity(0.1)) + ) + } + .buttonStyle(.plain) + .padding(.bottom, 32) + } + .frame(width: 700, height: 800) + .background( + RoundedRectangle(cornerRadius: 32) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) + .shadow(color: .black.opacity(0.3), radius: 30, x: 0, y: 15) + ) + .overlay( + RoundedRectangle(cornerRadius: 32) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .onAppear { + // If we're automatically joining as guest, handle it + if coordinator.isGuest && coordinator.sessionActive { + handleGuestAutoJoin() + } + } + } + + // MARK: - App Selection View (Host) + + private var appSelectionView: some View { + VStack(spacing: 24) { + Text("Select a co-op game to play") + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white) + + ScrollView { + VStack(spacing: 16) { + ForEach(host.appList.sorted(by: { $0.name ?? "" < $1.name ?? "" }), id: \.id) { app in + CoopAppCard( + app: app, + isSelected: selectedApp?.id == app.id, + onTap: { selectedApp = app } + ) + } + } + .padding(.horizontal, 24) + } + .frame(height: 400) + + Button { + startCoopSession() + } label: { + HStack(spacing: 12) { + if isStartingSession { + ProgressView() + .progressViewStyle(.circular) + .tint(.white) + } else { + Image(systemName: "person.2.fill") + .font(.system(size: 22, weight: .semibold)) + } + Text(isStartingSession ? "Starting..." : "Start Co-op Session") + .font(.system(size: 20, weight: .semibold)) + } + .foregroundColor(.white) + .padding(.horizontal, 32) + .padding(.vertical, 18) + .background( + RoundedRectangle(cornerRadius: 16) + .fill( + LinearGradient( + colors: [brandViolet, brandViolet.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .shadow(color: brandViolet.opacity(0.3), radius: 15, x: 0, y: 8) + ) + } + .buttonStyle(.plain) + .disabled(selectedApp == nil || isStartingSession) + .opacity(selectedApp == nil ? 0.5 : 1.0) + } + } + + // MARK: - Host Waiting View + + private var hostWaitingView: some View { + VStack(spacing: 24) { + ProgressView() + .progressViewStyle(.circular) + .scaleEffect(1.5) + .tint(brandViolet) + + Text("Waiting for friend to join...") + .font(.system(size: 22, weight: .semibold)) + .foregroundColor(.white) + + Text("Participants: \(coordinator.participants.count)/2") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + + if coordinator.participants.count >= 2 { + Text("Friend joined! Starting game...") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(brandViolet) + .padding() + .background( + RoundedRectangle(cornerRadius: 12) + .fill(brandViolet.opacity(0.1)) + ) + } + } + .padding(40) + } + + // MARK: - Guest Joining View + + private var guestJoiningView: some View { + VStack(spacing: 24) { + ProgressView() + .progressViewStyle(.circular) + .scaleEffect(1.5) + .tint(brandViolet) + + if let activity = coordinator.currentActivity { + Text("Joining co-op session") + .font(.system(size: 22, weight: .semibold)) + .foregroundColor(.white) + + Text(activity.appName) + .font(.system(size: 20, weight: .medium)) + .foregroundColor(brandOrange) + + Text("on \(activity.hostPCName)") + .font(.system(size: 18)) + .foregroundColor(.white.opacity(0.7)) + } + } + .padding(40) + } + + // MARK: - Actions + + private func startCoopSession() { + guard let app = selectedApp else { return } + guard !isStartingSession else { return } + + isStartingSession = true + errorMessage = nil + + Task { + do { + // Force 90 FPS for co-op compatibility (M2 Vision Pro max) + let frameRate: Int32 = 90 + print("[CoopSetup] Co-op frame rate locked to 90 FPS for M2 compatibility") + + // Export pairing data for sharing + let dataManager = DataManager() + guard let pairingData = dataManager.exportPairingData(for: host) else { + throw CoopError.failedToExportPairing + } + + // Create activity + let activity = MoonlightCoopActivity( + hostPCAddress: host.activeAddress ?? host.address ?? "", + hostPCName: host.name, + hostPCPort: host.httpsPort, + isInternetAccessible: coordinator.isInternetAccessible(host: host), + connectionMode: "Local", + appID: app.id ?? app.name, + appName: app.name, + sessionID: UUID().uuidString, + hostFrameRate: frameRate, + pairingData: pairingData + ) + + // Start hosting + try await coordinator.startHosting(activity: activity) + + // Update ViewModel with co-op state + viewModel.isCoopSession = true + viewModel.assignedControllerSlot = 0 // Host is slot 0 (player 1) + + // Small delay to let SharePlay UI appear + try await Task.sleep(for: .milliseconds(500)) + + // Now launch the stream normally + await MainActor.run { + // Close this setup view + isPresented = false + + // Start the stream + launchCoopStream(app: app, host: host) + } + + isStartingSession = false + } catch { + errorMessage = "Failed to start co-op session: \(error.localizedDescription)" + isStartingSession = false + print("[CoopSetup] Error starting session: \(error)") + } + } + } + + private func handleGuestAutoJoin() { + print("[CoopSetup] Guest auto-join triggered") + + Task { + // Give SharePlay a moment to fully establish + try await Task.sleep(for: .milliseconds(300)) + + guard let activity = coordinator.currentActivity else { + errorMessage = "No session activity found" + return + } + + // Validate frame rate + let guestFrameRate = viewModel.streamSettings.framerate + if !coordinator.validateFrameRate(guestFrameRate) { + let required = coordinator.getRequiredFrameRate() ?? 0 + errorMessage = "Frame rate mismatch! Host: \(required)fps, Yours: \(guestFrameRate)fps. Change your settings to match." + return + } + + // Import pairing data + let dataManager = DataManager() + guard let host = dataManager.importPairingData( + activity.pairingData, + address: activity.hostPCAddress, + name: activity.hostPCName, + coopTag: "Friend" + ) else { + errorMessage = "Failed to import host pairing data" + return + } + + // Find the app + // If the host has apps, try to find matching app + let app = TemporaryApp(id: activity.appID, name: activity.appName) + app.maybeHost = host + + // Update ViewModel with co-op state + viewModel.isCoopSession = true + viewModel.assignedControllerSlot = 1 // Guest is slot 1 (player 2) + + // Small delay + try await Task.sleep(for: .milliseconds(500)) + + // Launch the stream + await MainActor.run { + isPresented = false + launchCoopStream(app: app, host: host) + } + } + } + + // MARK: - Stream Launch + + private func launchCoopStream(app: TemporaryApp, host: TemporaryHost) { + // Configure the stream + guard let config = viewModel.stream(app: app) else { + errorMessage = "Failed to configure stream" + return + } + + let renderer = viewModel.streamSettings.renderer + + // Dismiss any existing streaming windows + dismissWindow(id: "flatDisplayWindow") + dismissWindow(id: "classicStreamingWindow") + + if renderer == .curvedDisplay { + // Curved Display + dismissWindow(id: "mainView") + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + Task { + print("[CoopSetup] Opening curved display for co-op...") + _ = try await self.openImmersiveSpace(id: renderer.windowId, value: config) + self.viewModel.isImmersiveSpaceOpen = true + } + } + } else { + // Flat Display or Classic Display + Task { + if viewModel.isImmersiveSpaceOpen { + await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false + } + await MainActor.run { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + self.openWindow(id: renderer.windowId, value: config) + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + self.dismissWindow(id: "mainView") + } + } + } + } + } +} + +// MARK: - Co-op App Card + +private struct CoopAppCard: View { + let app: TemporaryApp + let isSelected: Bool + let onTap: () -> Void + + let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) + + var body: some View { + Button(action: onTap) { + HStack(spacing: 16) { + // App Icon/Thumbnail placeholder + ZStack { + RoundedRectangle(cornerRadius: 12) + .fill(Color.white.opacity(0.1)) + .frame(width: 60, height: 60) + + Image(systemName: "gamecontroller.fill") + .font(.system(size: 28)) + .foregroundColor(.white.opacity(0.6)) + } + + VStack(alignment: .leading, spacing: 4) { + Text(app.name) + .font(.system(size: 20, weight: .semibold)) + .foregroundColor(.white) + + Text(app.id ?? "Unknown ID") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.5)) + } + + Spacer() + + if isSelected { + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 28)) + .foregroundColor(brandViolet) + } + } + .padding(20) + .background( + RoundedRectangle(cornerRadius: 16) + .fill(isSelected ? brandViolet.opacity(0.15) : Color.white.opacity(0.05)) + ) + .overlay( + RoundedRectangle(cornerRadius: 16) + .stroke(isSelected ? brandViolet : Color.white.opacity(0.1), lineWidth: isSelected ? 2 : 1) + ) + } + .buttonStyle(.plain) + } +} + +// MARK: - Error Types + diff --git a/Moonlight Vision/CurvedDisplayStreamView+Mesh.swift b/Moonlight Vision/CurvedDisplayStreamView+Mesh.swift new file mode 100644 index 000000000..95dbc0033 --- /dev/null +++ b/Moonlight Vision/CurvedDisplayStreamView+Mesh.swift @@ -0,0 +1,46 @@ +// +// CurvedDisplayStreamView+Mesh.swift +// Neo Moonlight +// +// UV / hit helpers for the curved panel. Core mesh generation lives in CurvedDisplayStreamView.swift +// (`generateCurvedRoundedPlane`, `makeChromosphereMesh`, `fallbackChromospherePlaneMesh`). +// + +import SwiftUI +import RealityKit + +extension _CurvedDisplayStreamView { + + // MARK: - Inverse UV Calculation (3D hit point → screen coordinates) + + /// Converts a 3D local position on the curved mesh to UV coordinates (0-1 range) + func convertPositionToUV( + localPosition: SIMD3, + width: Float, + aspectRatio: Float, + curveMagnitude: Float + ) -> SIMD2 { + let height = width * aspectRatio + let maxCurveAngle: Float = CURVED_MAX_ANGLE + let currentAngle = maxCurveAngle * max(0.0, min(curveMagnitude, 2.0)) + + let u: Float + + if currentAngle < 0.0001 { + u = (localPosition.x / width) + 0.5 + } else { + let radius = width / currentAngle + let sinTheta = localPosition.x / radius + let cosTheta = (radius - localPosition.z) / radius + let theta = atan2(sinTheta, cosTheta) + u = (theta / currentAngle) + 0.5 + } + + let v = 1.0 - ((localPosition.y / height) + 0.5) + + return SIMD2( + max(0, min(1, u)), + max(0, min(1, v)) + ) + } +} diff --git a/Moonlight Vision/CurvedDisplayStreamView.swift b/Moonlight Vision/CurvedDisplayStreamView.swift index 1c0aa132d..5d5d59828 100644 --- a/Moonlight Vision/CurvedDisplayStreamView.swift +++ b/Moonlight Vision/CurvedDisplayStreamView.swift @@ -7,8 +7,9 @@ import UIKit import AVFoundation import QuartzCore import ImageIO +import os + -// Existing code... final class ThreadSafeHDRSettings: @unchecked Sendable { private var params: HDRParams @@ -20,17 +21,55 @@ final class ThreadSafeHDRSettings: @unchecked Sendable { } } +/// SBS 3D confirmation card — proportional sizing (default × 0.8 = −20%). +private enum SBSConfirmPanelMetrics { + static let scale: CGFloat = 0.8 + static func pt(_ base: CGFloat) -> CGFloat { base * scale } +} + +class HeadPositionStorage { + var positionInScreenSpace: SIMD3 = .zero + var lastHeadWorldPos: SIMD3 = .zero + var lastDragTime: CFTimeInterval = 0 + var lastGeneratedCurve: Float? + var lastGeneratedAspect: Float? + var statsScaleInitialized: Bool = false + + // Entity references (set during RealityView make/update, stored here to avoid @State warnings) + var headAnchor: AnchorEntity? + var controlsEntity: Entity? + var menuEntity: Entity? + var dimmerDome: ModelEntity? + var dimmerDomePurple: ModelEntity? + var environmentDome: ModelEntity? + var chromosphereHaloEntity: ModelEntity? + + // Initialization tracking + var hasInitializedPosition: Bool = false + var menuScaleInitialized: Bool = false + var inputScaleInitialized: Bool = false + var tutorialScaleInitialized: Bool = false + + // Optimization tracking (to avoid redundant updates during RealityView update closure) + var lastAppliedDimLevel: Int = -1 + var lastEnvironmentSphereLevelApplied: Int = 0 +} + struct InputCaptureView: UIViewRepresentable { let controllerSupport: ControllerSupport @Binding var showKeyboard: Bool + var isControllerMode: Bool // True only when inputMode == .controller var curvature: Float var streamConfig: StreamConfiguration + let headStorage: HeadPositionStorage func makeUIView(context: Context) -> InputCaptureUIView { let view = InputCaptureUIView() view.curvature = curvature view.controllerSupport = controllerSupport view.streamConfig = streamConfig + view.headStorage = headStorage + view.allowTouchPassthrough = !showKeyboard && !isControllerMode view.isMultipleTouchEnabled = true view.isUserInteractionEnabled = true @@ -42,12 +81,9 @@ struct InputCaptureView: UIViewRepresentable { func updateUIView(_ uiView: InputCaptureUIView, context: Context) { uiView.curvature = curvature uiView.streamConfig = streamConfig - - if showKeyboard && !uiView.isFirstResponder { - uiView.becomeFirstResponder() - } else if !showKeyboard && uiView.isFirstResponder { - uiView.resignFirstResponder() - } + uiView.headStorage = headStorage + uiView.allowTouchPassthrough = !showKeyboard && !isControllerMode + uiView.showVirtualKeyboard = showKeyboard } } @@ -55,96 +91,69 @@ class InputCaptureUIView: UIView, UIKeyInput { var controllerSupport: ControllerSupport? var curvature: Float = 0.0 var streamConfig: StreamConfiguration? + var headStorage: HeadPositionStorage? + var allowTouchPassthrough: Bool = true + var firstResponderCheckTimer: Timer? + var showVirtualKeyboard: Bool = false { + didSet { + if oldValue != showVirtualKeyboard { + reloadInputViews() + } + } + } private let maxCurveAngle: Float = 1.3 + // Suppress software keyboard if showVirtualKeyboard is false, but still allow hardware input + override var inputView: UIView? { + return showVirtualKeyboard ? nil : UIView() + } + override init(frame: CGRect) { super.init(frame: frame) setupGestures() + startFirstResponderMonitoring() } required init?(coder: NSCoder) { super.init(coder: coder) setupGestures() + startFirstResponderMonitoring() } - private func setupGestures() { - let hover = UIHoverGestureRecognizer(target: self, action: #selector(handleHover(_:))) - self.addGestureRecognizer(hover) - - DispatchQueue.main.async { - self.controllerSupport?.attachGCEventInteraction(to: self) + private func startFirstResponderMonitoring() { + // Periodically check and reclaim first responder if lost (needed for controller input) + firstResponderCheckTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in + guard let self = self else { return } + if !self.isFirstResponder { + _ = self.becomeFirstResponder() + } } } - @objc private func handleHover(_ gesture: UIHoverGestureRecognizer) { - let location = gesture.location(in: self) - sendMousePosition(x: location.x, y: location.y) - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - if let touch = touches.first { - let loc = touch.location(in: self) - sendMousePosition(x: loc.x, y: loc.y) - } - NotificationCenter.default.post(name: .curvedScreenWakeRequested, object: nil) - - LiSendMouseButtonEvent(0, 1) + deinit { + firstResponderCheckTimer?.invalidate() } - override func touchesMoved(_ touches: Set, with event: UIEvent?) { - if let touch = touches.first { - let loc = touch.location(in: self) - sendMousePosition(x: loc.x, y: loc.y) + private func setupGestures() { + // From commit 12250ee: Attach GCEventInteraction for reliable controller input + DispatchQueue.main.async { + self.controllerSupport?.attachGCEventInteraction(to: self) } } - override func touchesEnded(_ touches: Set, with event: UIEvent?) { - LiSendMouseButtonEvent(1, 1) - } - - override func touchesCancelled(_ touches: Set, with event: UIEvent?) { - LiSendMouseButtonEvent(1, 1) - } - - private func sendMousePosition(x: CGFloat, y: CGFloat) { - guard let config = streamConfig else { return } - - var finalX = x - - let c = max(0.0, min(curvature, 1.0)) - if c > 0.001 { - let width = bounds.width - let normalizedX = x / width - let relativeX = normalizedX - 0.5 - - let angle = maxCurveAngle * c - let sinTheta = Float(relativeX) * 2.0 * sin(angle / 2.0) - let clampedSin = max(-1.0, min(1.0, sinTheta)) - let theta = asin(clampedSin) - - let u = (theta / angle) + 0.5 - finalX = CGFloat(u) * width + // CRITICAL: Override hitTest to allow touches to pass through to RealityKit when needed + // Controller input still works because it's handled via first responder status + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + // When keyboard is shown, handle touches. Otherwise, pass through. + if allowTouchPassthrough { + return nil // Touches pass through to RealityKit } - - let streamWidth = CGFloat(config.width) - let streamHeight = CGFloat(config.height) - - let hostX = (finalX / bounds.width) * streamWidth - let hostY = (y / bounds.height) * streamHeight - - let clampedX = min(max(hostX, 0), streamWidth) - let clampedY = min(max(hostY, 0), streamHeight) - - let clampedXInt16 = Int16(clampedX) - let clampedYInt16 = Int16(clampedY) - let streamWidthInt16 = Int16(streamWidth) - let streamHeightInt16 = Int16(streamHeight) - - LiSendMousePositionEvent(clampedXInt16, clampedYInt16, streamWidthInt16, streamHeightInt16) + return super.hitTest(point, with: event) } override var canBecomeFocused: Bool { true } + override var canBecomeFirstResponder: Bool { true } var hasText: Bool { true } func insertText(_ text: String) { @@ -161,10 +170,40 @@ class InputCaptureUIView: UIView, UIKeyInput { usleep(50 * 1000) LiSendKeyboardEvent(0x08, 0x04, 0) } + + // Handle special keys like Return/Enter + override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { + var handled = false + + for press in presses { + if KeyboardSupport.sendKeyEvent(for: press, down: true) { + handled = true + } + } + + if !handled { + super.pressesBegan(presses, with: event) + } + } + + override func pressesEnded(_ presses: Set, with event: UIPressesEvent?) { + var handled = false + + for press in presses { + if KeyboardSupport.sendKeyEvent(for: press, down: false) { + handled = true + } + } + + if !handled { + super.pressesEnded(presses, with: event) + } + } } let CURVED_MAX_WIDTH_METERS: Float = 2.0 let CURVED_MAX_ANGLE: Float = 1.3 +let GAZE_VERTICAL_OFFSET: Float = 0.015 // Small upward offset to compensate for eye-to-cursor alignment extension CollisionGroup { static let screenEntity = CollisionGroup(rawValue: 1 << 0) @@ -204,6 +243,320 @@ enum CurvaturePreset: Int, CaseIterable { } } +// MARK: - Input Mode for Curved Display + +enum InputMode: Int, CaseIterable { + case screenMove = 0 + case controller = 1 + case gazeControl = 2 + + var displayName: String { + switch self { + case .screenMove: return "Screen Adjust Mode" + case .controller: return "Controller Mode" + case .gazeControl: return "Gaze Control Mode" + } + } + + var icon: String { + switch self { + case .screenMove: return "arrow.up.and.down.and.arrow.left.and.right" + case .controller: return "gamecontroller.fill" + case .gazeControl: return "eye.fill" + } + } + + func next() -> InputMode { + let allCases = InputMode.allCases + let idx = allCases.firstIndex(of: self) ?? 0 + return allCases[(idx + 1) % allCases.count] + } +} + +// MARK: - Gaze Input Controller +// Created by NeoVectorX - January 2025 +// Implements raycast-to-UV mapping and gesture handling for curved screen geometry. +// +// "Shoot First" Logic: Matches FlatInputCaptureUIView behavior exactly. +// Click happens on pinch START (not release), making interactions feel instant. + +class GazeInputController { + // Timing constants (Matching FlatInputCaptureUIView) + private let longPressActivationDelay: TimeInterval = 0.650 + private let doubleTapDeadZoneDelay: TimeInterval = 0.250 // 250ms + private let doubleTapDeadZoneDelta: Float = 0.025 // 2.5% of screen (normalized) + // Threshold to cancel long press (roughly size of a button in UV space) + private let movementTolerance: Float = 0.015 + + // State + private(set) var pinchActive = false + private var longPressTimer: Timer? + private var startUV: SIMD2 = .zero + private var isRightClickMode = false // Track if we swapped to right-click + private var lastClickTime: TimeInterval = 0 // Track last click for double-tap detection + private var lastClickUV: SIMD2 = .zero // Track last click position + + var streamConfig: StreamConfiguration? + + // Button Constants (matching moonlight-common-c) + private let ACTION_PRESS: Int8 = 0x07 + private let ACTION_RELEASE: Int8 = 0x08 + private let BUTTON_LEFT: Int32 = 0x01 + private let BUTTON_RIGHT: Int32 = 0x03 + + func onPinchBegan(at uv: SIMD2) { + guard !pinchActive else { return } + pinchActive = true + startUV = uv + isRightClickMode = false + + // Check if we're in the double-tap dead zone + let now = CACurrentMediaTime() + let timeSinceLastClick = now - lastClickTime + + // Calculate distance from last click + let dx = uv.x - lastClickUV.x + let dy = uv.y - lastClickUV.y + let distance = sqrt(dx * dx + dy * dy) + + // Don't reposition mouse for clicks within the double-tap deadzone + // This is critical for double-clicking to work properly + if timeSinceLastClick > doubleTapDeadZoneDelay || distance > doubleTapDeadZoneDelta { + sendMousePosition(uv: uv) + } + + // Press Left Button Immediately ("Shoot First") + // This makes clicks instant and drags seamless. + sendMouseButton(action: ACTION_PRESS, button: BUTTON_LEFT) + + // Start Long Press Timer (for Right Click) + // Always start the timer - it will be cancelled if we're dragging + longPressTimer?.invalidate() + longPressTimer = Timer.scheduledTimer(withTimeInterval: longPressActivationDelay, repeats: false) { [weak self] _ in + self?.triggerLongPress() + } + + lastClickTime = now + lastClickUV = uv + } + + func onPinchChanged(at uv: SIMD2) { + // Always update position (Dragging happens naturally because Left is already Down) + sendMousePosition(uv: uv) + + // Check distance to see if we should cancel the "Right Click" timer + if longPressTimer != nil { + let dx = uv.x - startUV.x + let dy = uv.y - startUV.y + let dist = sqrt(dx*dx + dy*dy) + + if dist > movementTolerance { + // Moved too far, user is dragging. Cancel Right Click timer. + longPressTimer?.invalidate() + longPressTimer = nil + } + } + } + + func onPinchEnded() { + guard pinchActive else { return } + pinchActive = false + + // Cancel timer if it hasn't fired yet + longPressTimer?.invalidate() + longPressTimer = nil + + // Release buttons based on what mode we're in + if isRightClickMode { + // Release Right Button + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_RIGHT) + } else { + // Release Left Button (Standard Click / Drag End) + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_LEFT) + } + + isRightClickMode = false + } + + private func triggerLongPress() { + // User held still! Swap Left Click for Right Click. + isRightClickMode = true + + // 1. Release Left (Cancel the click/drag we started) + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_LEFT) + + // 2. Press Right + sendMouseButton(action: ACTION_PRESS, button: BUTTON_RIGHT) + } + + private func sendMousePosition(uv: SIMD2) { + guard let config = streamConfig else { return } + let x = Int16(uv.x * Float(config.width)) + let y = Int16(uv.y * Float(config.height)) + LiSendMousePositionEvent(x, y, Int16(config.width), Int16(config.height)) + } + + // MARK: - Touch Mode (Relative Mouse Movement) + // For trackpad-style cursor control + // Works like a real trackpad: + // - Drag = move cursor only (no click) + // - Quick tap = click + // - Tap + hold + drag = click and drag + + private var lastTouchPosition: SIMD3? = nil + private var touchStartPosition: SIMD3? = nil + private var touchStartTime: TimeInterval = 0 + private var hasMovedInTouch = false + private var touchClickTimer: Timer? = nil + private var touchModeInitialized = false // Track if cursor has been centered + private let touchTapThreshold: Float = 0.01 // 1cm movement = drag, not tap + private let touchTapTimeThreshold: TimeInterval = 0.2 // 200ms = quick tap + + func onTouchDragBegan(at worldPos: SIMD3) { + guard !pinchActive else { return } + pinchActive = true + lastTouchPosition = worldPos + touchStartPosition = worldPos + touchStartTime = CACurrentMediaTime() + hasMovedInTouch = false + isRightClickMode = false + + // On first touch in Touch mode, center the cursor + if !touchModeInitialized { + forceCursorToCenter() + touchModeInitialized = true + } + + // DON'T press any button yet - wait to see if it's a tap or drag + // Start a timer to detect "tap and hold" for click-drag + touchClickTimer?.invalidate() + touchClickTimer = Timer.scheduledTimer(withTimeInterval: touchTapTimeThreshold, repeats: false) { [weak self] _ in + guard let self = self else { return } + // If still holding after 200ms and haven't moved much, it's a click-drag + if !self.hasMovedInTouch { + self.sendMouseButton(action: self.ACTION_PRESS, button: self.BUTTON_LEFT) + } + } + } + + func onTouchDragChanged(at worldPos: SIMD3) { + guard let lastPos = lastTouchPosition, + let startPos = touchStartPosition else { return } + + // Calculate delta in world space + let delta = worldPos - lastPos + + // Check if we've moved significantly from start + let totalDelta = worldPos - startPos + let totalDist = simd_length(totalDelta) + + if totalDist > touchTapThreshold { + hasMovedInTouch = true + // Cancel the click timer - this is a drag, not a tap + touchClickTimer?.invalidate() + touchClickTimer = nil + } + + // Convert 3D delta to 2D screen movement + // Scale factor: adjust sensitivity (higher = more sensitive) + let sensitivity: Float = 800.0 + let deltaX = delta.x * sensitivity + let deltaY = -delta.y * sensitivity // Invert Y for natural movement + + // Send relative mouse movement (cursor moves, no button pressed) + sendRelativeMouseMovement(dx: deltaX, dy: deltaY) + + lastTouchPosition = worldPos + } + + func onTouchDragEnded() { + guard pinchActive else { return } + pinchActive = false + + let now = CACurrentMediaTime() + let holdDuration = now - touchStartTime + + // Cancel timers + touchClickTimer?.invalidate() + touchClickTimer = nil + longPressTimer?.invalidate() + longPressTimer = nil + + // Determine what kind of gesture this was + if !hasMovedInTouch && holdDuration < touchTapTimeThreshold { + // Quick tap without movement = CLICK + sendMouseButton(action: ACTION_PRESS, button: BUTTON_LEFT) + // Release after a tiny delay + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [weak self] in + self?.sendMouseButton(action: self?.ACTION_RELEASE ?? 0x08, button: self?.BUTTON_LEFT ?? 0x01) + } + } else if !hasMovedInTouch && holdDuration >= touchTapTimeThreshold { + // Held still for a while = click was already sent by timer, now release + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_LEFT) + } else { + // Movement happened = just cursor movement, no click needed + // (unless click timer fired for click-drag, in which case release it) + if holdDuration >= touchTapTimeThreshold { + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_LEFT) + } + } + + lastTouchPosition = nil + touchStartPosition = nil + hasMovedInTouch = false + isRightClickMode = false + } + + private var currentMouseX: Int16 = 0 + private var currentMouseY: Int16 = 0 + + private func sendRelativeMouseMovement(dx: Float, dy: Float) { + guard let config = streamConfig else { return } + + // Update internal cursor position + currentMouseX = Int16(max(0, min(Float(config.width), Float(currentMouseX) + dx))) + currentMouseY = Int16(max(0, min(Float(config.height), Float(currentMouseY) + dy))) + + LiSendMousePositionEvent(currentMouseX, currentMouseY, Int16(config.width), Int16(config.height)) + } + + func forceCursorToCenter() { + guard let config = streamConfig else { return } + + // Calculate exact center pixels + let centerX = Int16(config.width / 2) + let centerY = Int16(config.height / 2) + + // Update internal tracking + currentMouseX = centerX + currentMouseY = centerY + + print("🎯 Forcing Mouse to Center: \(centerX), \(centerY)") + LiSendMousePositionEvent(centerX, centerY, Int16(config.width), Int16(config.height)) + } + + private func sendMouseButton(action: Int8, button: Int32) { + LiSendMouseButtonEvent(action, button) + } + + func cleanup() { + longPressTimer?.invalidate() + longPressTimer = nil + touchClickTimer?.invalidate() + touchClickTimer = nil + lastTouchPosition = nil + touchStartPosition = nil + touchModeInitialized = false // Reset for next time + if pinchActive { + // Safety release both buttons + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_LEFT) + sendMouseButton(action: ACTION_RELEASE, button: BUTTON_RIGHT) + } + pinchActive = false + isRightClickMode = false + } +} + struct CurvedDisplayStreamView: View { @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace @Environment(\.openWindow) private var openWindow @@ -215,25 +568,61 @@ struct CurvedDisplayStreamView: View { var body: some View { if let config = streamConfig { - _CurvedDisplayStreamView( - streamConfig: Binding( - get: { config }, - set: { streamConfig = $0 } - ), - needsHdr: needsHdr, - swapAction: { - Task { - await viewModel.performRendererSwap( - openWindow: openWindow, - openImmersiveSpace: openImmersiveSpace, - dismissWindow: dismissWindow, - dismissImmersiveSpace: dismissImmersiveSpace - ) + // SESSION TOKEN GUARD: If this view's sessionUUID doesn't match the + // ViewModel's activeSessionToken, this is a "ghost" view from a dying + // window. Render black and skip all logic to prevent resource collision. + if config.sessionUUID == viewModel.activeSessionToken { + _CurvedDisplayStreamView( + streamConfig: Binding( + get: { config }, + set: { streamConfig = $0 } + ), + needsHdr: needsHdr, + swapAction: { + Task { + await viewModel.performRendererSwap( + openWindow: openWindow, + openImmersiveSpace: openImmersiveSpace, + dismissWindow: dismissWindow, + dismissImmersiveSpace: dismissImmersiveSpace + ) + } } - } - ) + ) + // CRITICAL SAFETY NET: Force SwiftUI to destroy the inner view (which holds + // all @State including streamMan) when sessionUUID changes. This prevents + // "ghost" views from persisting with stale state after a session change. + .id(config.sessionUUID) + } else { + // Ghost view detected - render black and do nothing + Color.black + .ignoresSafeArea() + .onAppear { + debugLog("👻 Ghost view detected (UUID \(config.sessionUUID) != active \(viewModel.activeSessionToken)). Suppressing.") + recoverFromStaleWindow() + } + } } else { - Color.clear + // During window transition (dismiss -> wait -> open), config may be nil. + // Show black screen to prevent zombie view from initializing. + Color.black + .ignoresSafeArea() + .onAppear { + recoverFromStaleWindow() + } + } + } + + private func recoverFromStaleWindow() { + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + if !viewModel.activelyStreaming && viewModel.streamState == .idle { + print("[CurvedDisplay] Stale window detected - dismissing and opening mainView") + openWindow(id: "mainView") + Task { + await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false + } + } } } } @@ -254,6 +643,7 @@ struct _CurvedDisplayStreamView: View { @State private var streamMan: StreamManager? @State private var controllerSupport: ControllerSupport? @ObservedObject var connectionCallbacks: ObservableConnectionManager = .init() + @ObservedObject private var coopCoordinator = CoopSessionCoordinator.shared @State private var texture: TextureResource @State private var screen: ModelEntity = ModelEntity() @@ -263,42 +653,72 @@ struct _CurvedDisplayStreamView: View { @State private var curveAnimationMultiplier: Float = 1.0 @State private var animationTimer: Timer? - @State private var curvaturePreset: CurvaturePreset = .curved - @State private var tiltAngle: Float = 0.0 + @State private var curvaturePreset: CurvaturePreset = CurvaturePreset(rawValue: UserDefaults.standard.integer(forKey: "curved.curvaturePreset")) ?? .curved + @AppStorage("curved.curvaturePreset") private var savedCurvaturePreset: Int = CurvaturePreset.curved.rawValue + @State private var tiltAngle: Float = Float(UserDefaults.standard.double(forKey: "curved.tiltAngle")) + @AppStorage("curved.tiltAngle") private var savedTiltAngle: Double = 0.0 @State private var tiltDirection: Int = 1 - @State private var screenPosition: SIMD3 = SIMD3(0, 1.1, -2.0) + @State private var screenPosition: SIMD3 = SIMD3(0, 1.1, -1.0) @State private var screenScale: Float = 1.8 @State private var isLocked: Bool = false @State private var startDragPosition: SIMD3? = nil - @State private var hasInitializedPosition = false + // hasInitializedPosition moved to headStorage to avoid "Modifying state during view update" @State private var safeHDRSettings = ThreadSafeHDRSettings( - params: HDRParams(boost: 1.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, mode: 0) + params: HDRParams(boost: 1.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, pqExposure: 1.0, mode: 0) ) @StateObject private var hdrParams = HDRTestParams() - + @StateObject private var hdrPanelSettings = HDRSettings() + @State private var showVirtualKeyboard = false @State private var hideControls: Bool = false + @State private var controlsExpanded: Bool = false + /// Drives the stagger animation; when expanded view appears we go false→true so icons animate in. On collapse we go true→false then hide after delay. + @State private var expandedContentRevealed: Bool = false + + // Star distance preset persistence + @AppStorage("starfield.distancePreset") private var starDistancePresetRawValue: Int = StarDistancePreset.close.rawValue + @AppStorage("removeRoundedCorners") private var removeRoundedCorners: Bool = false + @AppStorage("darkControlsMode") private var darkControlsMode: Bool = false + + private var starDistancePreset: StarDistancePreset { + get { StarDistancePreset(rawValue: starDistancePresetRawValue) ?? .close } + } + + // Particle Manager for Nebula preset + @State private var particleManager = ParticleManager() + + // Reference to the video decoder for controlling reactive dimming + @State private var videoDecoder: DrawableVideoDecoder? + + // Keyboard Override State + @State private var keyboardInput: String = "" + @State private var previousKeyboardInput: String = "" + @FocusState private var isKeyboardFocused: Bool + @State private var hideTimer: Timer? - @State private var controlsEntity: Entity? + // controlsEntity moved to headStorage to avoid "Modifying state during view update" @State private var shouldClose = false @State private var hasPerformedTeardown = false @State private var needsResume = false @State private var spatialAudioMode: Bool = true + @State private var soundStageSize: SoundStageSize = .medium @State private var statsOverlayText: String = "" @State private var statsTimer: Timer? @State private var showScaleHUD: Bool = false @State private var showModeLabel: Bool = false @State private var modeLabelTimer: Timer? @State private var controlsHighlighted: Bool = false + /// Incremented on each control tap so sensoryFeedback fires (avoids quiet spatialized system sound in curved mode). + @State private var controlTapFeedbackTrigger: Int = 0 @State private var immersiveSpaceSceneID: String? @State private var theaterEnvironmentEnabled = false @State private var showMenuPanel = false - @State private var menuEntity: Entity? - @State private var menuScaleInitialized = false + // menuEntity moved to headStorage to avoid "Modifying state during view update" + // menuScaleInitialized moved to headStorage to avoid "Modifying state during view update" @State private var menuBaseWidth: Float = 0 - @State private var inputScaleInitialized = false + // inputScaleInitialized moved to headStorage to avoid "Modifying state during view update" @State private var inputBaseWidth: Float = 0 @State private var swapInProgress = false @State private var menuPanelInstanceID = UUID() @@ -306,14 +726,23 @@ struct _CurvedDisplayStreamView: View { @State private var showSwapConfirm = false @State private var show3DConfirm = false + @State private var showEnvironmentPicker = false + @State private var showDimmingPicker = false + @State private var showHDRPanel = false + @State private var inputMode: InputMode = .gazeControl // Three-mode input toggle (default: gaze control) + @State private var isHandGazeInputDisabled = false // Long press on control mode button to disable hand/gaze input + @State private var gazeController = GazeInputController() + + @State private var headStorage = HeadPositionStorage() + @State private var renderGateOpen: Bool = true // Stats attachment sizing in meters (fixed width target) - @State private var statsScaleInitialized = false + // Note: statsScaleInitialized moved to headStorage to avoid "Modifying state during view update" @State private var statsBaseWidth: Float = 0 - private let statsCardWidthMeters: Float = 0.55 + private let statsCardWidthMeters: Float = 0.12 - @State private var tutorialScaleInitialized = false + // tutorialScaleInitialized moved to headStorage to avoid "Modifying state during view update" @State private var tutorialBaseWidth: Float = 0 private let tutorialCardWidthMeters: Float = 1.110 @@ -321,9 +750,10 @@ struct _CurvedDisplayStreamView: View { @State private var gestureInitialScale: Float? = nil @State private var targetScale: Float = 1.8 @State private var scaleHUDFadeTimer: Timer? + @State private var environmentFadeTimer: Timer? - @State private var dimmerDome: ModelEntity? - @State private var dimmerDomePurple: ModelEntity? + // dimmerDome moved to headStorage to avoid "Modifying state during view update" + // dimmerDomePurple moved to headStorage to avoid "Modifying state during view update" @State private var purpleGradientTextureColors: TextureResource? @State private var purpleGradientTexturePurpleBlack: TextureResource? @State private var eclipseGradientTexture: TextureResource? @@ -337,6 +767,20 @@ struct _CurvedDisplayStreamView: View { @State private var moonlightCyclePhase: CGFloat = 0.0 private let dimAlphas: [CGFloat] = [0.0, 0.82] @State private var dimLevel: Int = 0 + + // Preset brightness values (user-adjustable via long-press) + // Keys are dimLevels: 1=Night, 5=Midnight, 6=Twilight, 7=Dawn, 8=Sunrise, 9=Woodland, 14=Desert + @State private var presetBrightness: [Int: Double] = [:] + private let defaultPresetBrightness: [Int: Double] = [ + 1: 0.82, // Night + 5: 0.95, // Midnight + 6: 0.90, // Twilight + 7: 0.90, // Dawn + 8: 0.90, // Sunrise + 9: 0.90, // Woodland + 14: 0.90 // Desert + ] + // lastAppliedDimLevel moved to headStorage to avoid "Modifying state during view update" @State private var environmentSphereLevel: Int = 0 @State private var environmentUSDZLevel: Int = 0 @State private var moonlightMaterial: UnlitMaterial? @@ -347,7 +791,7 @@ struct _CurvedDisplayStreamView: View { private let moonlightColorDeltaThresholdLowPower: Float = 0.03 private let moonlightAlphaLowPower: CGFloat = 0.78 - @State private var lastEnvironmentSphereLevelApplied: Int = 0 + // lastEnvironmentSphereLevelApplied moved to headStorage to avoid "Modifying state during view update" @State private var modeBannerText: String = "" @State private var modeBannerIcon: String = "slider.horizontal.3" @@ -356,11 +800,21 @@ struct _CurvedDisplayStreamView: View { @State private var presetOverlayText: String = "" @State private var presetOverlayIcon: String = "camera.filters" @State private var presetOverlayTimer: Timer? + @State private var presetCooldownUntil: Date? = nil + + // Co-op invite button state + @State private var inviteButtonSent: Bool = false + @State private var showDisconnectConfirm: Bool = false @State private var isHDRTexture: Bool = false @State private var currentAmbientColor: UIColor = .black - + @State private var targetReactiveColor: UIColor = .black + @State private var reactiveLerpTimer: Timer? + // ChromaHalo / Chromosphere edge bloom — Reactive 1 only (dimLevel == 2) + @State private var chromosphereMeshEntity: ModelEntity? = nil + @State private var chromosphereTexture: TextureResource? = nil + let brandPurple = Color(red: 0.7, green: 0.3, blue: 0.9) let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) @@ -368,7 +822,7 @@ struct _CurvedDisplayStreamView: View { @State private var isMenuOpen1: Bool = false - @State private var environmentDome: ModelEntity? + // environmentDome moved to headStorage to avoid "Modifying state during view update" @State private var usdzAboveTheClouds: Entity? @State private var usdzAnime: Entity? @State private var usdzJustSky: Entity? @@ -383,95 +837,26 @@ struct _CurvedDisplayStreamView: View { @State private var extraSkyboxTextures: [TextureResource] = [] @State private var extraSkyboxNames: [String] = [] - @State private var builtinSkyboxNames: [String] = [ - "2", "13", "15", "23", "i", "11", "5", "16", - "22", "f", "a", "25", "17", "d", "t", "21", "8", "7", "1", - "26", "3" - ] @State private var builtinSkyboxTextures: [String: TextureResource] = [:] - @State private var skyboxRotations: [String: Float] = [ - "3": Float(530.0 * .pi / 180.0), - "5": -2.478, - "8": Float(115.0 * .pi / 180.0), - "11": 0.175, - "15": -0.105, - "16": Float(-50.0 * .pi / 180.0), - "17": 1.867, - "21": -1.921, - "23": -2.007, - "26": -0.524, - "a": Float(150.0 * .pi / 180.0), - "b": Float(145.0 * .pi / 180.0), - "c": Float(125.0 * .pi / 180.0), - "d": Float(-280.0 * .pi / 180.0), - "f": Float(5.0 * .pi / 180.0), - "i": Float(-90.0 * .pi / 180.0), - "w": Float(-160.0 * .pi / 180.0), - "y": Float(-15.0 * .pi / 180.0) - ] - - @State private var skyboxDisplayNames: [String: String] = [ - "1": "Loft", - "2": "Moonlight", - "3": "Full Moon", - "5": "Moondaze", - "7": "Trackday", - "8": "Atlantis", - "11": "Inked", - "13": "Jungle", - "15": "Monolith", - "16": "Meadow", - "17": "Fireflies", - "21": "Reach", - "22": "Mistfire", - "23": "Apocalypse", - "25": "Rubble", - "26": "Zenith", - "a": "Metro", - "b": "Stalked", - "c": "Stalked", - "d": "Stalked", - "f": "Foundry", - "i": "Station", - "t": "Moonrise", - "w": "NeoCity", - "x": "Outpost", - "y": "Outpost" - ] - - @State private var newsetSkyboxNames: [String] = [ - "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", - "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", - "u", "v", "w", "x", "y", "z" - ] @State private var newsetSkyboxTextures: [String: TextureResource] = [:] @State private var newsetLevel: Int = 0 - @State private var newsetSkyboxRotations: [String: Float] = [ - "a": Float(150.0 * .pi / 180.0), - "b": Float(180.0 * .pi / 180.0), - "c": Float(15.0 * .pi / 180.0), - "d": Float(-160.0 * .pi / 180.0), - "e": Float(-90.0 * .pi / 180.0), - "f": Float(5.0 * .pi / 180.0), - "g": Float(-100.0 * .pi / 180.0), - "h": Float(-100.0 * .pi / 180.0), - "i": Float(-90.0 * .pi / 180.0), - "j": Float(-10.0 * .pi / 180.0), - "k": Float(115.0 * .pi / 180.0), - "l": Float(-50.0 * .pi / 180.0), - "n": Float(30.0 * .pi / 180.0), - "u": Float(180.0 * .pi / 180.0), - "z": Float(20.0 * .pi / 180.0) - ] var isSBSVideo: Bool { let ratio = Float(streamConfig.width) / Float(streamConfig.height) return abs(ratio - (32.0 / 9.0)) < 0.01 } - - var allowedScaleMax: Float { 6.0 } - var cornerRadiusFraction: Float { 0.018 } + + @State private var firstFrameReceived = false + @State private var idrWatchdogTimer1: Timer? + @State private var idrWatchdogTimer2: Timer? + @State private var postFirstFrameRebindTimer: Timer? + @State private var guestAggressiveIDRTimer: Timer? + + var allowedScaleMax: Float { 8.0 } + var cornerRadiusFraction: Float { removeRoundedCorners ? 0.0 : 0.018 } var swapCardWidthMeters: Float { 0.55 } + /// SBS confirmation card only — −20% vs swap/disconnect dialogs (matches ``SBSConfirmPanelMetrics``). + var sbsConfirmCardWidthMeters: Float { swapCardWidthMeters * Float(SBSConfirmPanelMetrics.scale) } var screenAspect: Float { if let (w, h) = correctedResolution { @@ -488,15 +873,20 @@ struct _CurvedDisplayStreamView: View { } } } - + @State private var correctedResolution: (Int, Int)? = nil - + + // Note: lastGeneratedCurve and lastGeneratedAspect moved to headStorage + // to avoid "Modifying state during view update" warnings + var body: some View { let baseView = mainContent .overlay(alignment: .bottom) { scaleHUDOverlay } .overlay { swapOverlay } .overlay { swapConfirmAttachment } .overlay { sbsConfirmAttachment } + .overlay { disconnectConfirmAttachment } + .overlay { presetPopupOverlay } let lifecycleApplied = baseView .task { await setupMaterial() } @@ -504,12 +894,68 @@ struct _CurvedDisplayStreamView: View { .onDisappear(perform: teardownScene) .onChange(of: viewModel.shouldCloseStream) { _, shouldClose in if shouldClose && !hasPerformedTeardown { - triggerCloseSequence() + DispatchQueue.main.async { triggerCloseSequence() } + } + } + .onChange(of: scenePhase) { oldValue, newValue in + if newValue == .background { + if viewModel.activelyStreaming, streamMan != nil { + print("Suspending stream due to background") + needsResume = true + viewModel.isSuspendingForBackground = true + streamMan?.stopStream() + streamMan = nil + controllerSupport?.cleanup() + controllerSupport = nil + } + } else if newValue == .active { + if needsResume { + print("Resuming stream from background") + viewModel.isSuspendingForBackground = false + needsResume = false + self.renderGateOpen = true + self.hasPerformedTeardown = false + controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + connectionCallbacks.controllerSupport = controllerSupport + startStreamIfNeeded() + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + self.refreshAfterResume() + } + } else if viewModel.activelyStreaming { + // Health check: If stream should be running but isn't, restart it + if streamMan == nil { + print("[CurvedDisplay] Stream died while inactive - restarting") + self.renderGateOpen = true + self.hasPerformedTeardown = false + controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + connectionCallbacks.controllerSupport = controllerSupport + startStreamIfNeeded() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { self.refreshAfterResume() } + } } } - .onChange(of: scenePhase) { oldValue, newValue in handleScenePhaseChange(oldValue: oldValue, newValue: newValue) } .onReceive(NotificationCenter.default.publisher(for: .curvedScreenWakeRequested)) { _ in - guard viewModel.activelyStreaming && !showMenuPanel && !showSwapConfirm && !showCurvedTutorial else { return } + guard viewModel.activelyStreaming && !showMenuPanel && !showSwapConfirm && !showDisconnectConfirm && !showCurvedTutorial else { return } + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + fixAudioForCurrentMode() + } + .onReceive(NotificationCenter.default.publisher(for: .resumeStreamFromMenu)) { _ in + guard viewModel.activelyStreaming else { return } + dismissWindow(id: "mainView") + isMenuOpen = false withAnimation(.easeInOut(duration: 0.3)) { hideControls = false controlsHighlighted = true @@ -520,22 +966,67 @@ struct _CurvedDisplayStreamView: View { .onReceive(NotificationCenter.default.publisher(for: .mainViewWindowClosed)) { _ in self.handleWindowClose() } - .onReceive(NotificationCenter.default.publisher(for: .forceStopRendering)) { _ in - self.renderGateOpen = false + .onReceive(NotificationCenter.default.publisher(for: .chromaHaloColorsUpdated)) { notification in + // Reactive 1 (Chromosphere): keep zone payloads in sync with decoder analysis. + // Reactive 2 + Starfield: dome tint / particles from center samples. + guard dimLevel == 2 || dimLevel == 10 || dimLevel == 12 else { return } + + func uiColor(_ key: String) -> UIColor? { + guard let v = notification.userInfo?[key] as? SIMD3 else { return nil } + let boost: Float = 1.35 + return UIColor(red: CGFloat(min(1, v.x * boost)), + green: CGFloat(min(1, v.y * boost)), + blue: CGFloat(min(1, v.z * boost)), + alpha: 1.0) + } + + if let c = uiColor("center") { targetReactiveColor = c } + + // Starfield compatibility + if dimLevel == 12, + let center = notification.userInfo?["center"] as? SIMD3 { + let brightness = max(center.x, max(center.y, center.z)) + let uiColor = UIColor(red: CGFloat(center.x), green: CGFloat(center.y), blue: CGFloat(center.z), alpha: 1.0) + particleManager.update(color: uiColor, brightness: brightness) + } } - let stateChangesApplied = lifecycleApplied - .onChange(of: viewModel.streamSettings.statsOverlay) { oldValue, newValue in + let dimChangesApplied = lifecycleApplied + .onChange(of: dimLevel) { oldValue, newValue in + // Decoder zone analyzer — include Reactive V1 (dim 2) so Chromosphere matches pre-regression cadence. + videoDecoder?.isReactiveDimmingEnabled = (newValue == 2 || newValue == 10 || newValue == 12) + + updateChromosphereMesh() + updateDimmerDomesState() + + // Reactive 2 uses the legacy translucent dome (no solid-sphere “dial-in” intro). + if oldValue == 10 || newValue == 10 { + cancelReactiveSphereEnvelopeIntro(resetDomeVisuals: true) + } + } + .onChange(of: viewModel.streamSettings.statsOverlay) { oldValue, newValue in handleStatsOverlay(oldValue: oldValue, newValue: newValue) } - .onChange(of: viewModel.activelyStreaming) { oldValue, newValue in + .onChange(of: viewModel.activelyStreaming) { oldValue, newValue in + self.renderGateOpen = true handleActiveStreaming(oldValue: oldValue, newValue: newValue) } .onChange(of: videoMode) { _, _ in updateScreenMaterial() } + + let stateChangesApplied = dimChangesApplied .onChange(of: showMenuPanel) { _, _ in updateScreenInteractivity() } .onChange(of: showSwapConfirm) { _, _ in updateScreenInteractivity() } .onChange(of: show3DConfirm) { _, _ in updateScreenInteractivity() } - .onChange(of: hideControls) { _, _ in updateScreenInteractivity() } + .onChange(of: showDisconnectConfirm) { _, _ in updateScreenInteractivity() } + .onChange(of: inputMode) { _, _ in updateScreenInteractivity() } + .onChange(of: viewModel.streamSettings.swapABXYButtons) { _, newValue in + controllerSupport?.setSwapABXYButtons(newValue) + } + .onChange(of: hdrPanelSettings.brightness) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.contrast) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.saturation) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.pqExposure) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.referenceHDR) { _, _ in updateHDRParamsFromPanel() } return stateChangesApplied } @@ -575,6 +1066,11 @@ struct _CurvedDisplayStreamView: View { } } + @ViewBuilder + private var presetPopupOverlay: some View { + EmptyView() + } + @ViewBuilder private var controlsHint: some View { if hideControls { @@ -612,27 +1108,125 @@ struct _CurvedDisplayStreamView: View { Attachment(id: "inputOverlay") { inputCaptureAttachment } Attachment(id: "swapConfirm") { swapConfirmAttachment } Attachment(id: "sbsConfirm") { sbsConfirmAttachment } + Attachment(id: "disconnectConfirm") { disconnectConfirmAttachment } + Attachment(id: "envPicker") { environmentPickerAttachment } + Attachment(id: "dimPicker") { dimmingPickerAttachment } + Attachment(id: "hdrPanel") { hdrPanelAttachment } Attachment(id: "stats") { statsAttachment } Attachment(id: "tutorial") { tutorialAttachment } Attachment(id: "presetPopup") { - CenterPresetPopup(text: presetOverlayText, icon: presetOverlayIcon) - .opacity(showInlinePresetOverlay ? 1.0 : 0.0) + if showInlinePresetOverlay { + CenterPresetPopup( + text: presetOverlayText, + icon: presetOverlayIcon, + width: presetOverlayText.contains("Input Disabled") || presetOverlayText.contains("Input Enabled") ? 713 : 713 + ) + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + Attachment(id: "coopJoinNotification") { + if coopCoordinator.friendJoinedNotification { + CenterPresetPopup(text: "Guest Joined!", icon: "person.badge.plus.fill") + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + Attachment(id: "coopDisconnectNotification") { + if coopCoordinator.disconnectNotification { + CenterPresetPopup(text: coopCoordinator.disconnectMessage, icon: "person.badge.minus.fill") + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + Attachment(id: "coopConnectingOverlay") { + // Show for co-op guests while waiting for video stream + if viewModel.isCoopSession && + viewModel.assignedControllerSlot == 1 && + viewModel.streamState == .starting { + CoopConnectingPopup() + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + Attachment(id: "keyboardTextField") { + if showVirtualKeyboard { + TextField("", text: $keyboardInput) + .focused($isKeyboardFocused) + .font(.system(size: 11)) + .foregroundColor(.white) + .textFieldStyle(.plain) + .multilineTextAlignment(.center) + .padding(12) + .frame(width: 180) + .background( + Capsule() + .fill(.ultraThinMaterial) + .opacity(0.7) + ) + .onAppear { + // Force focus when TextField appears + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + isKeyboardFocused = true + } + } + .onSubmit { + // When user hits return, send Return key to PC, then close keyboard + print("[Keyboard] Submit detected, sending Return key and closing keyboard") + + // Send Return key (keycode 0x0D = 13) + LiSendKeyboardEvent(0x0D, 0x03, 0) // Key down + usleep(50 * 1000) + LiSendKeyboardEvent(0x0D, 0x04, 0) // Key up + + showVirtualKeyboard = false + isKeyboardFocused = false + keyboardInput = "" + previousKeyboardInput = "" + } + .onChange(of: keyboardInput) { oldValue, newValue in + handleKeyboardInput(newValue) + } + .onChange(of: isKeyboardFocused) { oldValue, newValue in + if !newValue && showVirtualKeyboard { + print("[Keyboard] Focus lost, closing keyboard") + showVirtualKeyboard = false + keyboardInput = "" + previousKeyboardInput = "" + } + } + } else { + Color.clear.frame(width: 1, height: 1) + } + } + Attachment(id: "micButton") { + if viewModel.streamSettings.showMicButton { + FloatingMicButton() + .frame(width: 200, height: 80) + } else { + Color.clear.frame(width: 1, height: 1) + } } } - .gesture(dragGesture) - .gesture(magnifyGesture) + .upperLimbVisibility(shouldHideHands ? .hidden : .automatic) + // Unified drag handles both Screen Move and Gaze Drag to prevent conflicts + // Magnify and drag run simultaneously to allow pinch-to-zoom + .gesture(magnifyGesture.simultaneously(with: unifiedDragGesture)) + // NOTE: gazeTapGesture disabled - DragGesture(minimumDistance: 0) handles all pinch + // interactions including quick taps. Having both gestures causes conflicts. + // .gesture(gazeTapGesture, isEnabled: inputMode == .gazeControl) .onTapGesture { - guard viewModel.activelyStreaming && !showMenuPanel && !showSwapConfirm && !showCurvedTutorial else { return } + guard viewModel.activelyStreaming && !showMenuPanel && !showSwapConfirm && !showDisconnectConfirm && !showCurvedTutorial else { return } withAnimation(.easeInOut(duration: 0.3)) { hideControls = false controlsHighlighted = true } startHighlightTimer() - if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } + fixAudioForCurrentMode() } } @@ -791,14 +1385,13 @@ struct _CurvedDisplayStreamView: View { .allowsHitTesting(true) } } - + @ViewBuilder - private var sbsConfirmAttachment: some View { - if show3DConfirm { + private var disconnectConfirmAttachment: some View { + if showDisconnectConfirm { let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) - let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) - let babyBlue = Color(red: 0.72, green: 0.85, blue: 1.0) - + let brandRed = Color(red: 0.9, green: 0.3, blue: 0.3) + VStack(spacing: 24) { ZStack { Circle() @@ -810,17 +1403,17 @@ struct _CurvedDisplayStreamView: View { ) ) .frame(width: 64, height: 64) - .shadow(color: brandOrange.opacity(0.5), radius: 18, x: 0, y: 10) - Image(systemName: "view.3d") + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) + Image(systemName: "rectangle.portrait.and.arrow.right") .font(.system(size: 28, weight: .bold)) .foregroundStyle(.white) } VStack(spacing: 8) { - Text("Enable SBS 3D") + Text("Leave Co-op Session?") .font(.system(size: 22, weight: .bold)) .foregroundStyle(.white) - Text("Use software such as ReShade + Depth3D on your host PC to utilize SBS mode.") + Text("This will disconnect you from the session and end the stream.") .font(.system(size: 15, weight: .regular)) .foregroundStyle(.white.opacity(0.75)) .multilineTextAlignment(.center) @@ -829,12 +1422,13 @@ struct _CurvedDisplayStreamView: View { VStack(spacing: 12) { Button { - show3DConfirm = false - videoMode = .sideBySide3D - updateScreenMaterial() + showDisconnectConfirm = false + // userDidRequestDisconnect sets shouldCloseStream, which triggers + // triggerCloseSequence() — that handles openWindow + dismissImmersiveSpace + viewModel.userDidRequestDisconnect() } label: { HStack(spacing: 10) { - Text("Enable SBS 3D") + Text("Leave Session") .font(.system(size: 17, weight: .semibold)) } .foregroundStyle(.white) @@ -844,7 +1438,7 @@ struct _CurvedDisplayStreamView: View { RoundedRectangle(cornerRadius: 16, style: .continuous) .fill( LinearGradient( - colors: [brandOrange, brandOrange.opacity(0.85)], + colors: [brandRed, brandRed.opacity(0.85)], startPoint: .topLeading, endPoint: .bottomTrailing ) @@ -861,12 +1455,12 @@ struct _CurvedDisplayStreamView: View { lineWidth: 1.5 ) ) - .shadow(color: brandOrange.opacity(0.5), radius: 18, x: 0, y: 10) + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) } .buttonStyle(.plain) Button { - show3DConfirm = false + showDisconnectConfirm = false } label: { Text("Cancel") .font(.system(size: 17, weight: .medium)) @@ -875,7 +1469,7 @@ struct _CurvedDisplayStreamView: View { .padding(.vertical, 14) .background( RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(.ultraThinMaterial) + .fill(brandNavy.opacity(0.6)) .overlay( RoundedRectangle(cornerRadius: 16, style: .continuous) .stroke( @@ -914,6 +1508,127 @@ struct _CurvedDisplayStreamView: View { } } + @ViewBuilder + private var sbsConfirmAttachment: some View { + if show3DConfirm { + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + + VStack(spacing: SBSConfirmPanelMetrics.pt(24)) { + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandNavy, brandNavy.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: SBSConfirmPanelMetrics.pt(64), height: SBSConfirmPanelMetrics.pt(64)) + .shadow(color: brandOrange.opacity(0.5), radius: SBSConfirmPanelMetrics.pt(18), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + Image(systemName: "view.3d") + .font(.system(size: SBSConfirmPanelMetrics.pt(28), weight: .bold)) + .foregroundStyle(.white) + } + + VStack(spacing: SBSConfirmPanelMetrics.pt(8)) { + Text("Enable SBS 3D") + .font(.system(size: SBSConfirmPanelMetrics.pt(22), weight: .bold)) + .foregroundStyle(.white) + Text("Use software such as ReShade + Depth3D on your host PC to utilize SBS mode.") + .font(.system(size: SBSConfirmPanelMetrics.pt(15), weight: .regular)) + .foregroundStyle(.white.opacity(0.75)) + .multilineTextAlignment(.center) + .padding(.horizontal, SBSConfirmPanelMetrics.pt(8)) + } + + VStack(spacing: SBSConfirmPanelMetrics.pt(12)) { + Button { + show3DConfirm = false + videoMode = .sideBySide3D + updateScreenMaterial() + } label: { + HStack(spacing: SBSConfirmPanelMetrics.pt(10)) { + Text("Enable SBS 3D") + .font(.system(size: SBSConfirmPanelMetrics.pt(17), weight: .semibold)) + } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, SBSConfirmPanelMetrics.pt(14)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .fill( + LinearGradient( + colors: [brandOrange, brandOrange.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1.5) + ) + ) + .shadow(color: brandOrange.opacity(0.5), radius: SBSConfirmPanelMetrics.pt(18), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + } + .buttonStyle(.plain) + + Button { + show3DConfirm = false + } label: { + Text("Cancel") + .font(.system(size: SBSConfirmPanelMetrics.pt(17), weight: .medium)) + .foregroundStyle(.white.opacity(0.75)) + .frame(maxWidth: .infinity) + .padding(.vertical, SBSConfirmPanelMetrics.pt(14)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .fill(.ultraThinMaterial) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.15), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1) + ) + ) + ) + } + .buttonStyle(.plain) + } + } + .padding(SBSConfirmPanelMetrics.pt(28)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(24), style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: SBSConfirmPanelMetrics.pt(20), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + ) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(24), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1.5) + ) + ) + .frame(width: SBSConfirmPanelMetrics.pt(420)) + .allowsHitTesting(true) + } + } + // MARK: - Scene Setup & Teardown private func setupScene() { @@ -921,16 +1636,24 @@ struct _CurvedDisplayStreamView: View { Task { @MainActor in viewModel.userDidRequestDisconnect() await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false } return } - // Add: Re-open render gate at setup to ensure frames are not dropped - self.renderGateOpen = true + + print("[CurvedDisplay] Re-initializing ControllerSupport with slotOffset: \(streamConfig.controllerSlotOffset)") + self.controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + connectionCallbacks.controllerSupport = self.controllerSupport + + hasPerformedTeardown = false + renderGateOpen = true + viewModel.isStreamViewAlive = true dismissWindow(id: "mainView") dismissWindow(id: "dummy") + isMenuOpen = false viewModel.streamSettings.statsOverlay = false @@ -941,8 +1664,27 @@ struct _CurvedDisplayStreamView: View { dimLevel = 0 viewModel.streamSettings.dimPassthrough = false + // Tell the decoder whether it needs to run the ambient light engine + videoDecoder?.isReactiveDimmingEnabled = false + self.targetScale = self.screenScale + // Initialize input mode from user preference + let defaultMode = UserDefaults.standard.integer(forKey: "curved.defaultControlMode") + inputMode = InputMode(rawValue: defaultMode) ?? .gazeControl + print("[CurvedDisplay] Initialized input mode from settings: \(inputMode.displayName)") + + // Load saved preset brightness values from UserDefaults + for dimLevelKey in defaultPresetBrightness.keys { + let savedValue = UserDefaults.standard.double(forKey: "preset.brightness.\(dimLevelKey)") + if savedValue > 0 { + presetBrightness[dimLevelKey] = savedValue + } + } + + // Initialize gaze controller with stream config + gazeController.streamConfig = streamConfig + startStreamIfNeeded() spatialAudioMode = true @@ -956,16 +1698,11 @@ struct _CurvedDisplayStreamView: View { if needsHdr { hdrParams.mode = 1 - safeHDRSettings.value = HDRParams( - boost: 1.35, - contrast: 1.1, - saturation: 1.08, - brightness: 0.0, - mode: 1 - ) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { LiRequestIdrFrame() } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) { LiRequestIdrFrame() } - startHideTimer() + var p = safeHDRSettings.value + p.mode = 1 + safeHDRSettings.value = p + updateHDRParamsFromPanel() + ensureHDRTextureMatchesSetting() } if let sceneID = UIApplication.shared.connectedScenes.first?.session.persistentIdentifier { @@ -973,7 +1710,9 @@ struct _CurvedDisplayStreamView: View { } restoreSavedTransform() - self.isLocked = UserDefaults.standard.bool(forKey: kCurvedLockedKey) + // Force unlock - lock feature is not currently implemented in UI + self.isLocked = false + UserDefaults.standard.set(false, forKey: kCurvedLockedKey) hideTimer?.invalidate() hideTimer = nil @@ -994,6 +1733,9 @@ struct _CurvedDisplayStreamView: View { statsTimer?.invalidate() statsTimer = nil stopMoonlightCycle() + stopReactiveLerp() + cancelReactiveSphereEnvelopeIntro(resetDomeVisuals: true) + viewModel.isStreamViewAlive = false if !hasPerformedTeardown { performCompleteTeardown() @@ -1003,30 +1745,6 @@ struct _CurvedDisplayStreamView: View { // MARK: - onChange Handlers - private func handleScenePhaseChange(oldValue: ScenePhase, newValue: ScenePhase) { - handleScenePhaseChange(newValue) - if newValue == .active && viewModel.activelyStreaming { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - fixAudioForCurrentMode() - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { self.refreshAfterResume() } - } else if newValue == .background && viewModel.activelyStreaming { - viewModel.userDidRequestDisconnect() - } - } - - private func handleScenePhaseChange(_ phase: ScenePhase) { - switch phase { - case .background: - viewModel.activelyStreaming = false - streamMan?.stopStream() - streamMan = nil - controllerSupport?.cleanup() - default: - break - } - } - private func handleStatsOverlay(oldValue: Bool, newValue: Bool) { if newValue { startStatsTimer() } else { statsTimer?.invalidate(); statsTimer = nil; statsOverlayText = "" } } @@ -1036,6 +1754,10 @@ struct _CurvedDisplayStreamView: View { showMenuPanel = false } if newValue { + // FIX: Defer state modification to prevent "Modifying state during view update" warnings + DispatchQueue.main.async { + self.renderGateOpen = true + } ensureStreamStartedIfNeeded() dismissWindow(id: "mainView") let hasSeen = UserDefaults.standard.bool(forKey: tutorialSeenKey) @@ -1057,23 +1779,73 @@ struct _CurvedDisplayStreamView: View { } // MARK: - Gestures - - var dragGesture: some Gesture { - DragGesture() + + /// Unified drag gesture to prevent conflict between Screen Move and Gaze Control + /// Both modes use drag, so we combine them into a single gesture that routes based on inputMode + var unifiedDragGesture: some Gesture { + DragGesture(minimumDistance: 0) // 0 for instant gaze response .targetedToEntity(screen) .onChanged { value in - guard !isLocked && !hideControls else { return } - hideTimer?.invalidate() - if startDragPosition == nil { startDragPosition = screenPosition } - let translation = value.convert(value.translation3D, from: .local, to: .scene) - var proposed = startDragPosition! + simd_float3(translation.x, translation.y, translation.z) - proposed.x = min(max(proposed.x, -allowedLateralMax), allowedLateralMax) - screenPosition = proposed - lastDragTime = CACurrentMediaTime() + // DISPATCHER: Route logic based on active mode + switch inputMode { + case .screenMove: + // --- SCREEN MOVE LOGIC --- + guard !hideControls else { return } + hideTimer?.invalidate() + if startDragPosition == nil { startDragPosition = screenPosition } + let translation = value.convert(value.translation3D, from: .local, to: .scene) + var proposed = startDragPosition! + simd_float3(translation.x, translation.y, translation.z) + proposed.x = min(max(proposed.x, -allowedLateralMax), allowedLateralMax) + screenPosition = proposed + headStorage.lastDragTime = CACurrentMediaTime() + + case .gazeControl: + // --- GAZE CONTROL LOGIC --- + guard !isHandGazeInputDisabled else { return } + // Check if using Touch mode (hand drag) or Gaze mode (eye tracking) + if viewModel.streamSettings.curvedGazeUseTouchMode { + // TOUCH MODE: Relative mouse movement (trackpad style) + let worldPos = value.convert(value.location3D, from: .local, to: .scene) + if !gazeController.pinchActive { + gazeController.onTouchDragBegan(at: worldPos) + } else { + gazeController.onTouchDragChanged(at: worldPos) + } + } else { + // GAZE MODE: Eye tracking (current implementation) + let uv = hitToUV(value) + if !gazeController.pinchActive { + gazeController.onPinchBegan(at: uv) + } else { + gazeController.onPinchChanged(at: uv) + } + } + + case .controller: + break // Let input fall through to InputCaptureView + } } .onEnded { _ in - startDragPosition = nil - startHideTimer() + // CLEANUP DISPATCHER + switch inputMode { + case .screenMove: + startDragPosition = nil + controlsHighlighted = false + startHighlightTimer() + + case .gazeControl: + // Always cleanup gaze state + if gazeController.pinchActive { + if viewModel.streamSettings.curvedGazeUseTouchMode { + gazeController.onTouchDragEnded() + } else { + gazeController.onPinchEnded() + } + } + + case .controller: + break + } } } @@ -1081,7 +1853,8 @@ struct _CurvedDisplayStreamView: View { MagnifyGesture() .targetedToEntity(screen) .onChanged { value in - guard !isLocked && !hideControls else { return } + // Allow screen scaling when controls are visible + guard !hideControls else { return } hideTimer?.invalidate() if gestureInitialScale == nil { gestureInitialScale = screenScale @@ -1097,8 +1870,10 @@ struct _CurvedDisplayStreamView: View { scaleHUDFadeTimer?.invalidate() scaleHUDFadeTimer = Timer.scheduledTimer(withTimeInterval: 0.6, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.25)) { - showScaleHUD = false + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.25)) { + self.showScaleHUD = false + } } } } @@ -1106,17 +1881,118 @@ struct _CurvedDisplayStreamView: View { gestureInitialScale = nil scaleHUDFadeTimer?.invalidate() scaleHUDFadeTimer = Timer.scheduledTimer(withTimeInterval: 0.6, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.25)) { - showScaleHUD = false + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.25)) { + self.showScaleHUD = false + } } } - startHideTimer() + controlsHighlighted = false + startHighlightTimer() } } + + // MARK: - Gaze Control Gestures + + var gazeTapGesture: some Gesture { + SpatialTapGesture() + .targetedToEntity(screen) + .onEnded { value in + guard inputMode == .gazeControl else { + print("[Gaze] Tap ignored - not in gaze control mode (current: \(inputMode))") + return + } + let uv = hitToUV(value) + print("[Gaze] Tap detected at UV: \(uv)") + gazeController.onPinchBegan(at: uv) + gazeController.onPinchEnded() + } + } + + + + + // MARK: - "World Space" Gaze Calculation + // Bypasses local coordinate glitches by calculating vector projection in absolute room space. + + private func hitToUV(_ value: EntityTargetValue) -> SIMD2 { + // 1. Get Touch in World Space + // We bypass local coordinate confusion entirely. + let touchWorld = value.convert(value.location3D, from: .local, to: .scene) + + return calculateUV(touchWorld: touchWorld) + } + + private func hitToUV(_ value: EntityTargetValue) -> SIMD2 { + // 1. Get Touch in World Space + // We bypass local coordinate confusion entirely. + let touchWorld = value.convert(value.location3D, from: .local, to: .scene) + + return calculateUV(touchWorld: touchWorld) + } + + private func calculateUV(touchWorld: SIMD3) -> SIMD2 { + // 1. GET SCREEN BASIS VECTORS (Orientation) + // This handles rotation/tilt. + let screenTransform = screen.transformMatrix(relativeTo: nil) + let rightDir = simd_normalize(SIMD3(screenTransform.columns.0.x, screenTransform.columns.0.y, screenTransform.columns.0.z)) + let upDir = simd_normalize(SIMD3(screenTransform.columns.1.x, screenTransform.columns.1.y, screenTransform.columns.1.z)) + let center = SIMD3(screenTransform.columns.3.x, screenTransform.columns.3.y, screenTransform.columns.3.z) + + // 2. PROJECT TOUCH (Get Distance in Meters) + let delta = touchWorld - center + let meterX = simd_dot(delta, rightDir) // e.g., 4.0 meters + let meterY = simd_dot(delta, upDir) + + + let globalScale = screen.scale(relativeTo: nil).x + let safeScale = globalScale > 0 ? globalScale : 1.0 + + + let baseWidth = CURVED_MAX_WIDTH_METERS // 2.0 + let physicalWidth = baseWidth * safeScale + let physicalHeight = physicalWidth * screenAspect + + + let curveMagnitude = curvaturePreset.value * curveAnimationMultiplier + let maxAngle = CURVED_MAX_ANGLE + let currentAngle = maxAngle * max(0.0, min(curveMagnitude, 2.0)) + + var u: Float = 0.5 + + + if currentAngle < 0.001 { + // Flat Mode + u = (meterX / physicalWidth) + 0.5 + } else { + + let scaledRadius = physicalWidth / currentAngle + let maxTheoreticalX = scaledRadius * sin(currentAngle / 2.0) + + let clampedX = max(-maxTheoreticalX, min(maxTheoreticalX, meterX)) + let theta = asin(clampedX / scaledRadius) + + u = (theta / currentAngle) + 0.5 + } + + + let v = 0.5 - (meterY / physicalHeight) - GAZE_VERTICAL_OFFSET + + + let offsetX = Float(viewModel.streamSettings.gazeCursorOffsetX) / Float(streamConfig.width) + let offsetY = -Float(viewModel.streamSettings.gazeCursorOffsetY) / Float(streamConfig.height) + + let calibratedU = u + offsetX + let calibratedV = v + offsetY + + return SIMD2( + max(0, min(1, calibratedU)), + max(0, min(1, calibratedV)) + ) + } - @State private var headAnchor: AnchorEntity? - @State private var lastHeadWorldPos: SIMD3 = .zero - @State private var lastDragTime: CFTimeInterval = 0 + // headAnchor, lastHeadWorldPos, and lastDragTime moved to headStorage + // to avoid "Modifying state during view update" warnings private let allowedLateralMax: Float = 3.0 @@ -1128,33 +2004,213 @@ struct _CurvedDisplayStreamView: View { InputCaptureView( controllerSupport: support, showKeyboard: $showVirtualKeyboard, + isControllerMode: inputMode == .controller, curvature: curvaturePreset.value * curveAnimationMultiplier, - streamConfig: streamConfig + streamConfig: streamConfig, + headStorage: headStorage ) .frame(width: 1920, height: 1920 / CGFloat(screenAspect)) .opacity(0.01) - .allowsHitTesting(viewModel.activelyStreaming && !showMenuPanel && hideControls && !isMenuOpen && !showCurvedTutorial) + // Input Mode handling: + // - Controller mode: allowsHitTesting(true) → Controller works + // - Other modes: allowsHitTesting(false) → RealityKit gestures work + .allowsHitTesting(showVirtualKeyboard || inputMode == .controller) + } + } + + @ViewBuilder + private var environmentPickerAttachment: some View { + if showEnvironmentPicker { + EnvironmentPickerView( + environmentSphereLevel: Binding( + get: { environmentSphereLevel }, + set: { val in + environmentSphereLevel = val + // Side effects when selection changes + dimLevel = 0 + environmentUSDZLevel = 0 + withAnimation(.easeInOut(duration: 0.25)) { viewModel.streamSettings.dimPassthrough = (val != 0) } + updateEnvironmentState() + updateDimmerDomesState() + } + ), + newsetLevel: Binding( + get: { newsetLevel }, + set: { val in + newsetLevel = val + // Side effects when selection changes + dimLevel = 0 + environmentUSDZLevel = 0 + withAnimation(.easeInOut(duration: 0.25)) { viewModel.streamSettings.dimPassthrough = (val != 0) } + updateNewsetState() + updateDimmerDomesState() + } + ), + isPresented: $showEnvironmentPicker, + dimLevel: Binding( + get: { dimLevel }, + set: { val in + dimLevel = val + viewModel.streamSettings.dimPassthrough = (val != 0) + UserDefaults.standard.set(val, forKey: "ambient.dimming.level") + updateDimmerDomesState() + } + ), + extraSkyboxNames: extraSkyboxNames + ) + .transition(.identity) + } else { + Color.clear.frame(width: 1, height: 1).allowsHitTesting(false) + } + } + + @ViewBuilder + private var hdrPanelAttachment: some View { + if showHDRPanel { + HDRControlPanel( + settings: hdrPanelSettings, + isPresented: $showHDRPanel, + onLiveUpdate: { updateHDRParamsFromPanel() }, + dimInactiveGradingControlsWhenReferenceHDR: true + ) + .transition(.identity) + } else { + Color.clear.frame(width: 1, height: 1).allowsHitTesting(false) + } + } + + @ViewBuilder + private var dimmingPickerAttachment: some View { + if showDimmingPicker { + DimmingPickerView( + dimLevel: Binding( + get: { dimLevel }, + set: { val in + dimLevel = val + viewModel.streamSettings.dimPassthrough = (val != 0) + UserDefaults.standard.set(val, forKey: "ambient.dimming.level") + + // Don't enable dimmer if environment is active - let environment binding handle it after fade + if headStorage.environmentDome?.isEnabled != true { + updateDimmerDomesState() + } + + stopMoonlightCycle() + if val == 10 || val == 12 { + startReactiveLerp() + } else { + stopReactiveLerp() + } + } + ), + isPresented: $showDimmingPicker, + environmentSphereLevel: Binding( + get: { environmentSphereLevel }, + set: { newValue in + environmentSphereLevel = newValue + + // If disabling environment while dimming is active, wait for fade before enabling dimmer + if newValue == 0 && dimLevel != 0 { + updateEnvironmentState() + + // Wait for environment fade to complete (0.5s + small buffer) + Task { + try? await Task.sleep(for: .milliseconds(600)) + await MainActor.run { + updateDimmerDomesState() + } + } + } else { + updateEnvironmentState() + } + } + ), + newsetLevel: Binding( + get: { newsetLevel }, + set: { newValue in + newsetLevel = newValue + updateNewsetState() + } + ), + presetBrightness: Binding( + get: { presetBrightness }, + set: { newValue in + presetBrightness = newValue + updateDimmerDomesState() + } + ), + defaultPresetBrightness: defaultPresetBrightness, + onStarfieldTapCycle: { + let nextPreset = starDistancePreset.next() + starDistancePresetRawValue = nextPreset.rawValue + particleManager.updateDistancePreset(nextPreset) + presetOverlayText = "STAR DISTANCE: \(nextPreset.displayName.uppercased())" + presetOverlayIcon = "moon.stars.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + }, + onReactive1TapCycle: { + Reactive1ChromosphereReach.advanceWrappedAndSave() + applySavedReactive1ReachToChromospherePipeline() + } + ) + .transition(.identity) + } else { + Color.clear.frame(width: 1, height: 1).allowsHitTesting(false) + } + } + + private func handleKeyboardInput(_ newValue: String) { + let oldValue = previousKeyboardInput + + if newValue.count > oldValue.count { + // Character(s) added - send the new characters + let newChars = String(newValue.suffix(newValue.count - oldValue.count)) + for char in newChars { + let text = String(char) + let cString = text.cString(using: .utf8) + cString?.withUnsafeBufferPointer { ptr in + if let base = ptr.baseAddress { + LiSendUtf8TextEvent(base, UInt32(text.utf8.count)) + } + } + } + } else if newValue.count < oldValue.count { + // Character(s) removed - send backspace for each removed character + let removedCount = oldValue.count - newValue.count + for _ in 0..(index: Int, @ViewBuilder content: () -> Content) -> some View { + content() + } + + private func reactive1UsesExpandedReachChromeBoost() -> Bool { + dimLevel == 2 && Reactive1ChromosphereReach.clampedSavedIndex() >= 1 + } + + /// Wide / Expanded / Maximum: strong Chromosphere wash — idle and auto-hidden toolbar never dim below this (Standard & other dim modes unchanged). + private let reactiveV1ExpandedReachMinFadedBarOpacity: CGFloat = 0.75 + + private func clampBarOpacityForReactive1WidePlusChromosphere(_ opacity: CGFloat) -> CGFloat { + guard reactive1UsesExpandedReachChromeBoost() else { return opacity } + return max(opacity, reactiveV1ExpandedReachMinFadedBarOpacity) + } + + /// Wide = 0, Expanded = 1, Maximum = 2 (only meaningful when `reactive1UsesExpandedReachChromeBoost()`). + private func reactiveV1ExpandedReachWashStep() -> Int { + guard reactive1UsesExpandedReachChromeBoost() else { return 0 } + return min(2, max(0, Reactive1ChromosphereReach.clampedSavedIndex() - 1)) + } + + private func reactiveV1ExpandedReachInactiveBarOpacityFloorEffective() -> CGFloat { + min(1.0, reactiveV1ExpandedReachInactiveBarOpacityFloor + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.024) + } + + private func reactiveV1ExpandedReachDormantBarOpacityFloorEffective() -> CGFloat { + min(1.0, reactiveV1ExpandedReachDormantBarOpacityFloor + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.085) + } + + private func reactiveV1ExpandedReachDormantCapsuleOpacityFloorEffective() -> CGFloat { + min(1.0, reactiveV1ExpandedReachDormantCapsuleOpacityFloor + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.075) + } + + private func reactiveV1ExpandedReachUltraThinCapsuleLightEffective() -> CGFloat { + min(1.0, reactiveV1ExpandedReachUltraThinCapsuleLight + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.014) + } + + private func reactiveV1ExpandedReachUltraThinCapsuleDarkEffective() -> CGFloat { + min(1.0, reactiveV1ExpandedReachUltraThinCapsuleDark + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.09) + } + + private func reactiveV1ExpandedReachChromeMulEffective() -> CGFloat { + guard reactive1UsesExpandedReachChromeBoost() else { return 1.0 } + return min(1.45, reactiveV1ExpandedReachChromeMul + CGFloat(reactiveV1ExpandedReachWashStep()) * 0.07) + } + + /// Reactive V1 (Chromosphere) or V2 (translucent dome): wash periphery → same stronger top chrome as Chromosphere tier 1. + private func usesReactiveAmbientControlChromeLift() -> Bool { + dimLevel == 2 || dimLevel == 10 + } + + /// Reactive V2 uses a translucent world-space dome (`Unlit transparent`) that can composite poorly with Attachment UI — keep bars nearer full opacity. + private func reactiveV2TranslucentDomeInactiveBarOpacityFloor() -> CGFloat { 0.93 } + private func reactiveV2TranslucentDomeDormantBarOpacityFloor() -> CGFloat { 0.55 } + private func reactiveV2TranslucentDomeDormantCapsuleOpacityFloor() -> CGFloat { 0.62 } + + private func applyReactiveV2TopChromeFloors(barOpacity: CGFloat) -> CGFloat { + guard dimLevel == 10 else { return barOpacity } + return min(1.0, max(barOpacity, reactiveV2TranslucentDomeInactiveBarOpacityFloor())) + } + + private func applyReactiveV2DormantBarFloor(_ opacity: CGFloat) -> CGFloat { + guard dimLevel == 10 else { return opacity } + return min(1.0, max(opacity, reactiveV2TranslucentDomeDormantBarOpacityFloor())) + } + + private func applyReactiveV2DormantCapsuleFloor(_ opacity: CGFloat) -> CGFloat { + guard dimLevel == 10 else { return opacity } + return min(1.0, max(opacity, reactiveV2TranslucentDomeDormantCapsuleOpacityFloor())) + } + + /// Strong top-bar opacity when Reactive V1 Chromosphere is at reach tier 2+ (indexed ≥ 1). + private func applyReactiveV1ExpandedReachTopChromeFloors(barOpacity: CGFloat) -> CGFloat { + guard reactive1UsesExpandedReachChromeBoost() else { return barOpacity } + return min(1.0, max(barOpacity, reactiveV1ExpandedReachInactiveBarOpacityFloorEffective())) + } + + private func applyReactiveV1ExpandedReachDormantBarFloor(_ opacity: CGFloat) -> CGFloat { + guard reactive1UsesExpandedReachChromeBoost() else { return opacity } + return min(1.0, max(opacity, reactiveV1ExpandedReachDormantBarOpacityFloorEffective())) + } + + private func applyReactiveV1ExpandedReachDormantCapsuleFloor(_ opacity: CGFloat) -> CGFloat { + guard reactive1UsesExpandedReachChromeBoost() else { return opacity } + return min(1.0, max(opacity, reactiveV1ExpandedReachDormantCapsuleOpacityFloorEffective())) + } + + /// `ultraThinMaterial` capsule behind the toolbar when controls are visible (not the faded-dormant state). + private func topControlsUltraThinCapsuleOpacityWhenChromeVisible() -> CGFloat { + if hideControls { + return topControlsCapsuleBackgroundDormantOpacity() + } + if reactive1UsesExpandedReachChromeBoost() { + let raw = darkControlsMode ? reactiveV1ExpandedReachUltraThinCapsuleDarkEffective() : reactiveV1ExpandedReachUltraThinCapsuleLightEffective() + return clampBarOpacityForReactive1WidePlusChromosphere(raw) + } + if darkControlsMode { + return dimLevel == 10 ? 0.58 : 0.15 + } + return dimLevel == 10 ? 0.94 : 0.7 + } + + /// Drives `.animation` when cycling Reactive V1 reach so bar opacity snaps smoothly per tier. + private var reactiveV1TopChromeAnimationAnchor: Int { + dimLevel == 2 ? Reactive1ChromosphereReach.clampedSavedIndex() : -1 + } + + /// Top bar when visible but idle (Reactive V1 / V2 peripheral wash → lift faded chrome vs default 0.5). + private func fadedTopControlsInactiveOpacity() -> CGFloat { + if darkControlsMode { + if usesReactiveAmbientControlChromeLift() { + var o = min(1, 0.12 + reactiveV1ControlOpacityInactiveBoost * (0.12 / 0.5)) + if reactive1UsesExpandedReachChromeBoost() { o = min(1, o * reactiveV1ExpandedReachChromeMulEffective()) } + let v2 = applyReactiveV2TopChromeFloors(barOpacity: o) + return clampBarOpacityForReactive1WidePlusChromosphere(applyReactiveV1ExpandedReachTopChromeFloors(barOpacity: v2)) + } + return 0.12 + } + if usesReactiveAmbientControlChromeLift() { + var o = min(1, 0.5 + reactiveV1ControlOpacityInactiveBoost) + if reactive1UsesExpandedReachChromeBoost() { o = min(1, o * reactiveV1ExpandedReachChromeMulEffective()) } + let v2 = applyReactiveV2TopChromeFloors(barOpacity: o) + return clampBarOpacityForReactive1WidePlusChromosphere(applyReactiveV1ExpandedReachTopChromeFloors(barOpacity: v2)) + } + return 0.5 + } + + /// Top bar almost hidden (Reactive peripheral wash: dormant floor lifted; Chromosphere tiers 2–4 multiply further). + private func fadedTopControlsDormantOpacity() -> CGFloat { + if darkControlsMode { + if usesReactiveAmbientControlChromeLift() { + var o = min(1, 0.01 + reactiveV1ControlOpacityDormantFloor) + if reactive1UsesExpandedReachChromeBoost() { o = min(1, o * reactiveV1ExpandedReachChromeMulEffective()) } + let v2 = applyReactiveV2DormantBarFloor(o) + return clampBarOpacityForReactive1WidePlusChromosphere(applyReactiveV1ExpandedReachDormantBarFloor(v2)) + } + return 0.01 + } + switch dimLevel { + case 4, 12: return 0.005 + case 2, 10: + var o = min(1, 0.015 + reactiveV1ControlOpacityDormantFloor) + if reactive1UsesExpandedReachChromeBoost() { o = min(1, o * reactiveV1ExpandedReachChromeMulEffective()) } + let v2 = applyReactiveV2DormantBarFloor(o) + return clampBarOpacityForReactive1WidePlusChromosphere(applyReactiveV1ExpandedReachDormantBarFloor(v2)) + default: return 0.05 + } + } + + /// Glass pill behind icons when dormant — match bar floor so glyphs don’t flatten before the capsule. + private func topControlsCapsuleBackgroundDormantOpacity() -> CGFloat { + switch dimLevel { + case 4, 12: return 0.005 + case 2, 10: + var o = min(1, 0.015 + reactiveV1ControlOpacityDormantFloor) + if reactive1UsesExpandedReachChromeBoost() { o = min(1, o * reactiveV1ExpandedReachChromeMulEffective()) } + let v2 = applyReactiveV2DormantCapsuleFloor(o) + return clampBarOpacityForReactive1WidePlusChromosphere(applyReactiveV1ExpandedReachDormantCapsuleFloor(v2)) + default: return 0 + } + } + + var topControlsBar: some View { + Group { + if viewModel.streamSettings.useCollapsedControlsMenu { + curvedDynamicControlsBar + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : fadedTopControlsInactiveOpacity()) : fadedTopControlsDormantOpacity()) + .animation(Animation.easeInOut(duration: 0.35), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.35), value: hideControls) + .animation(Animation.easeInOut(duration: 0.35), value: reactiveV1TopChromeAnimationAnchor) + .animation(Animation.easeInOut(duration: 0.35), value: dimLevel) + .sensoryFeedback(.impact(weight: .medium), trigger: controlTapFeedbackTrigger) + .allowsHitTesting(true) + } else { + curvedOriginalControlsBar + } + } + } + + /// Center button: tap to expand the dynamic menu. + private var curvedCenterButton: some View { + Button { + if hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true } - - if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() + startHighlightTimer() + } + withAnimation(.easeInOut(duration: 0.3)) { + controlsExpanded = true + } + startHideTimer() + controlTapFeedbackTrigger += 1 + } label: { + Image(systemName: "ellipsis.circle.fill") + .font(.system(size: 24.07)) + .frame(width: 50, height: 50) + } + .buttonStyle(.plain) + } + + /// Dynamic bar: collapsed = center only (no pill); expanded = full bar with pill. Both branches animate opacity/scale for smooth expand and collapse. + private var curvedDynamicControlsBar: some View { + ZStack { + curvedCenterButton + .padding(.horizontal, 24) + .padding(.vertical, 12) + .opacity(controlsExpanded ? 0 : 1) + .scaleEffect(controlsExpanded ? 0.88 : 1) + .allowsHitTesting(!controlsExpanded) + curvedControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .background { + Capsule() + .fill(.ultraThinMaterial) + .opacity(topControlsUltraThinCapsuleOpacityWhenChromeVisible()) + } + .opacity(controlsExpanded ? 1 : 0) + .scaleEffect(controlsExpanded ? 1 : 0.88) + .allowsHitTesting(controlsExpanded) + } + .animation(.spring(response: 0.38, dampingFraction: 0.82), value: controlsExpanded) + } + + private var curvedIconHome: some View { + LongPressControlBtn( + label: "Home", + systemImage: "house.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + if isMenuOpen { + dismissWindow(id: "mainView") + isMenuOpen = false } else { - AudioHelpers.fixAudioForDirectStereo() + pushWindow(id: "mainView") + isMenuOpen = true + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { positionMenuWindow() } + } + guard viewModel.activelyStreaming && !showMenuPanel else { return } + if hideControls { + withAnimation(.easeInOut(duration: 0.3)) { hideControls = false; controlsHighlighted = true } + startHighlightTimer() + fixAudioForCurrentMode() + } + fixAudioForCurrentMode() + }, + longPressAction: { handleWindowClose() }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + private var curvedIconSpatialAudio: some View { + LongPressControlBtn( + label: spatialAudioMode ? "Spatial Audio" : "Direct Audio", + systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + spatialAudioMode.toggle() + fixAudioForCurrentMode() + presetOverlayText = spatialAudioMode ? "Audio: Spatial" : "Audio: Stereo" + presetOverlayIcon = spatialAudioMode ? "person.spatialaudio.fill" : "headphones" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { withAnimation(.easeOut(duration: 0.15)) { self.showInlinePresetOverlay = false } } + } + }, + longPressAction: { + guard spatialAudioMode else { return } + soundStageSize = soundStageSize.next() + fixAudioForCurrentMode() + presetOverlayText = "Sound Stage: \(soundStageSize.rawValue)" + presetOverlayIcon = "person.spatialaudio.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + private var curvedIconCurvature: some View { + LongPressControlBtn( + label: curvaturePreset.displayName, + systemImage: curvaturePreset.icon, + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + curvaturePreset = curvaturePreset.next() + savedCurvaturePreset = curvaturePreset.rawValue + presetOverlayText = curvatureText(for: curvaturePreset.displayName) + presetOverlayIcon = curvaturePreset.icon + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { withAnimation(.easeOut(duration: 0.15)) { self.showInlinePresetOverlay = false } } + } + startHideTimer() + }, + longPressAction: { + curvaturePreset = .curved + savedCurvaturePreset = CurvaturePreset.curved.rawValue + presetOverlayText = curvatureText(for: curvaturePreset.displayName) + presetOverlayIcon = curvaturePreset.icon + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + @ViewBuilder + private var curvedIconTilt: some View { + LongPressControlBtn( + label: "\(Int(tiltAngle))°", + systemImage: "bed.double.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + cycleTiltAngle() + presetOverlayText = "TILT: \(Int(tiltAngle))°" + presetOverlayIcon = "bed.double.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { withAnimation(.easeOut(duration: 0.15)) { self.showInlinePresetOverlay = false } } + } + startHideTimer() + }, + longPressAction: { + tiltAngle = 0.0 + savedTiltAngle = 0.0 + presetOverlayText = "TILT: \(Int(tiltAngle))°" + presetOverlayIcon = "bed.double.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + @ViewBuilder + private var curvedIconStarDistance: some View { + if dimLevel == 12 { + LongPressControlBtn( + label: starDistancePreset.displayName, + systemImage: "moon.stars.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + let nextPreset = starDistancePreset.next() + starDistancePresetRawValue = nextPreset.rawValue + particleManager.updateDistancePreset(nextPreset) + presetOverlayText = "STAR DISTANCE: \(nextPreset.displayName.uppercased())" + presetOverlayIcon = "moon.stars.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + startHideTimer() + }, + longPressAction: { + starDistancePresetRawValue = StarDistancePreset.close.rawValue + particleManager.updateDistancePreset(.close) + presetOverlayText = "STAR DISTANCE: CLOSE" + presetOverlayIcon = "moon.stars.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + } + + private var curvedIconDim: some View { + LongPressControlBtn( + label: dimButtonTitle, + systemImage: dimButtonIcon, + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + showDimmingPicker.toggle() + if showDimmingPicker { + showEnvironmentPicker = false + stopMoonlightCycle() + stopReactiveLerp() + } + }, + longPressAction: { + dimLevel = 0 + videoDecoder?.isReactiveDimmingEnabled = false + viewModel.streamSettings.dimPassthrough = false + updateDimmerDomesState() + stopMoonlightCycle() + stopReactiveLerp() + showDimPresetOverlay() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + private var curvedIconPreset: some View { + makeControlButton(label: "Preset", systemImage: "camera.filters", action: { + guard canChangePreset() else { return } + let allowed: [Int32] = [0, 1, 2, 3] + let cur = viewModel.streamSettings.uikitPreset + let idx = allowed.firstIndex(of: cur) ?? 0 + let next = allowed[(idx + 1) % allowed.count] + viewModel.streamSettings.uikitPreset = next + applyCurvedUIKitPreset(next) + presetCooldownUntil = Date().addingTimeInterval(0.3) + presentFilterPresetCenterPopup(selectedPreset: next) + startHideTimer() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + + private var curvedIcon3D: some View { + makeControlButton(label: videoMode == .standard2D ? "Standard Display" : "3D", systemImage: "view.3d", action: { + if videoMode == .standard2D { show3DConfirm = true } + else { videoMode = .standard2D; updateScreenMaterial() } + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + + private var curvedIconEnvironment: some View { + LongPressControlBtn( + label: environmentSphereButtonTitle, + systemImage: "photo", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + showEnvironmentPicker.toggle() + if showEnvironmentPicker { + showDimmingPicker = false + stopMoonlightCycle() + stopReactiveLerp() + } + startHideTimer() + }, + longPressAction: { + environmentSphereLevel = 0 + newsetLevel = 0 + showEnvironmentPicker = false + updateEnvironmentState() + updateNewsetState() + withAnimation(.easeInOut(duration: 0.25)) { viewModel.streamSettings.dimPassthrough = false } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + private var curvedIconStats: some View { + makeControlButton(label: viewModel.streamSettings.statsOverlay ? "Hide Stats" : "Show Stats", systemImage: "wifi", action: { + viewModel.streamSettings.statsOverlay.toggle() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + + @ViewBuilder + private var curvedIconTaskManager: some View { + if viewModel.streamSettings.showTaskManagerButton { + makeControlButton(label: "Task Manager", systemImage: "list.bullet.circle", action: { + sendTaskManager() + startHighlightTimer() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + } + + private var curvedIconKeyboard: some View { + makeControlButton( + label: showVirtualKeyboard ? "Hide Keyboard" : "Show Keyboard", + systemImage: showVirtualKeyboard ? "keyboard.fill" : "keyboard", + action: { + if inputMode == .controller && !showVirtualKeyboard { + gazeController.cleanup() + inputMode = .screenMove + updateScreenInteractivity() + presetOverlayText = "Switched to Screen Adjust Mode" + presetOverlayIcon = "arrow.up.and.down.and.arrow.left.and.right" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) { _ in + DispatchQueue.main.async { withAnimation(.easeOut(duration: 0.15)) { self.showInlinePresetOverlay = false } } + } + } + showVirtualKeyboard.toggle() + if showVirtualKeyboard { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { isKeyboardFocused = true } + } else { isKeyboardFocused = false } + startHighlightTimer() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + @ViewBuilder + private var curvedIconBattery: some View { + if viewModel.streamSettings.showControllerBattery { + BatteryIndicatorView( + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer + ) + } + } + + private var curvedIconInputMode: some View { + LongPressControlBtn( + label: { + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { return "Touch Control Mode" } + return inputMode.displayName + }(), + systemImage: { + if isHandGazeInputDisabled { return "lock.fill" } + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { return "hand.point.up.left.fill" } + return inputMode.icon + }(), + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + gazeController.cleanup() + inputMode = inputMode.next() + if inputMode == .controller { + showVirtualKeyboard = false + isKeyboardFocused = false + } + if inputMode == .gazeControl { gazeController.streamConfig = streamConfig } + presetOverlayText = inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode ? "Touch Control Mode" : inputMode.displayName + presetOverlayIcon = inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode ? "hand.point.up.left.fill" : inputMode.icon + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + longPressAction: { + isHandGazeInputDisabled.toggle() + presetOverlayText = isHandGazeInputDisabled ? "Screen Input Disabled" : "Screen Input Enabled" + presetOverlayIcon = isHandGazeInputDisabled ? "lock.fill" : (inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode ? "hand.point.up.left.fill" : inputMode.icon) + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + @ViewBuilder + private var curvedIconCoopIndicator: some View { + if viewModel.isCoopSession { + HStack(spacing: 6) { + Image(systemName: "person.2.fill").font(.system(size: 16, weight: .semibold)) + Text("2P").font(.system(size: 14, weight: .bold)) + Text("(\(CoopSessionCoordinator.shared.participants.count)/2)") + .font(.system(size: 12, weight: .medium)) + .foregroundColor(.white.opacity(0.8)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background(RoundedRectangle(cornerRadius: 8).fill(Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.3))) + } + } + + @ViewBuilder + private var curvedIconCoopInvite: some View { + if viewModel.isCoopSession { + let coordinator = CoopSessionCoordinator.shared + if coordinator.isHosting && coordinator.participants.count < 2 { + coopInviteButton + } + } + } + + @ViewBuilder + private var curvedIconCoopDisconnect: some View { + if viewModel.isCoopSession { + coopDisconnectButton + } + } + + private var curvedControlsBarContent: some View { + HStack(spacing: 16) { + // 1. Home + staggeredControl(index: 0) { + LongPressControlBtn( + label: "Home", + systemImage: "house.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + if isMenuOpen { + dismissWindow(id: "mainView") + isMenuOpen = false + } else { + pushWindow(id: "mainView") + isMenuOpen = true + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + positionMenuWindow() + } + } + + guard viewModel.activelyStreaming && !showMenuPanel else { return } + + if hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + fixAudioForCurrentMode() } + + fixAudioForCurrentMode() + }, + longPressAction: { + handleWindowClose() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } // 2. Spatial Audio - makeControlButton(label: spatialAudioMode ? "Spatial Audio" : "Direct Audio", systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") { + staggeredControl(index: 1) { + LongPressControlBtn( + label: spatialAudioMode ? "Spatial Audio" : "Direct Audio", + systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { spatialAudioMode.toggle() fixAudioForCurrentMode() + presetOverlayText = spatialAudioMode ? "Audio: Spatial" : "Audio: Stereo" + presetOverlayIcon = spatialAudioMode ? "person.spatialaudio.fill" : "headphones" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + }, + longPressAction: { + // Only cycle sound stage when spatial audio is enabled + guard spatialAudioMode else { return } + + soundStageSize = soundStageSize.next() + fixAudioForCurrentMode() + presetOverlayText = "Sound Stage: \(soundStageSize.rawValue)" + presetOverlayIcon = "person.spatialaudio.fill" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } // 3. Curvature - makeControlButton(label: curvaturePreset.displayName, systemImage: curvaturePreset.icon) { + staggeredControl(index: 2) { + LongPressControlBtn( + label: curvaturePreset.displayName, + systemImage: curvaturePreset.icon, + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { curvaturePreset = curvaturePreset.next() - presetOverlayText = curvaturePreset.displayName + savedCurvaturePreset = curvaturePreset.rawValue + presetOverlayText = curvatureText(for: curvaturePreset.displayName) presetOverlayIcon = curvaturePreset.icon showInlinePresetOverlay = true presetOverlayTimer?.invalidate() presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } } } - startHideTimer() + startHideTimer() + }, + longPressAction: { + curvaturePreset = .curved + savedCurvaturePreset = CurvaturePreset.curved.rawValue + presetOverlayText = curvatureText(for: curvaturePreset.displayName) + presetOverlayIcon = curvaturePreset.icon + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } // 4. Tilt - makeControlButton(label: "\(Int(tiltAngle))°", systemImage: "bed.double.fill") { + staggeredControl(index: 3) { + LongPressControlBtn( + label: "\(Int(tiltAngle))°", + systemImage: "bed.double.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { cycleTiltAngle() - presetOverlayText = "\(Int(tiltAngle))°" + presetOverlayText = "TILT: \(Int(tiltAngle))°" presetOverlayIcon = "bed.double.fill" showInlinePresetOverlay = true presetOverlayTimer?.invalidate() presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } } } - startHideTimer() + startHideTimer() + }, + longPressAction: { + tiltAngle = 0.0 + savedTiltAngle = 0.0 + presetOverlayText = "TILT: \(Int(tiltAngle))°" + presetOverlayIcon = "bed.double.fill" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } - - // 5. Dim - makeControlButton(label: dimButtonTitle, systemImage: dimButtonIcon) { - if dimInteractionLocked { return } - dimInteractionLocked = true - DispatchQueue.main.asyncAfter(deadline: .now() + 0.22) { - dimInteractionLocked = false + + // 5. Star Distance (only visible in Starfield mode) + if dimLevel == 12 { + staggeredControl(index: 4) { + LongPressControlBtn( + label: starDistancePreset.displayName, + systemImage: "moon.stars.fill", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + let nextPreset = starDistancePreset.next() + starDistancePresetRawValue = nextPreset.rawValue + particleManager.updateDistancePreset(nextPreset) + presetOverlayText = "STAR DISTANCE: \(nextPreset.displayName.uppercased())" + presetOverlayIcon = "moon.stars.fill" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + startHideTimer() + }, + longPressAction: { + starDistancePresetRawValue = StarDistancePreset.close.rawValue + particleManager.updateDistancePreset(.close) + presetOverlayText = "STAR DISTANCE: CLOSE" + presetOverlayIcon = "moon.stars.fill" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } + } - if environmentSphereLevel != 0 || environmentUSDZLevel != 0 { - environmentSphereLevel = 0 - environmentUSDZLevel = 0 - updateEnvironmentState() - withAnimation(.easeInOut(duration: 0.25)) { - viewModel.streamSettings.dimPassthrough = false - } + // 5. Dim + staggeredControl(index: 5) { + LongPressControlBtn( + label: dimButtonTitle, + systemImage: dimButtonIcon, + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + // Short press: toggle dimming picker + showDimmingPicker.toggle() + if showDimmingPicker { + showEnvironmentPicker = false + showHDRPanel = false + stopMoonlightCycle() + stopReactiveLerp() } - - var txn = Transaction() - txn.disablesAnimations = true - withTransaction(txn) { - let newLevel = nextDimLevel(from: dimLevel) - dimLevel = newLevel - viewModel.streamSettings.dimPassthrough = (newLevel == 1) + }, + longPressAction: { + // Long press: reset to Off + dimLevel = 0 + + // Tell the decoder whether it needs to run the ambient light engine + videoDecoder?.isReactiveDimmingEnabled = false + + viewModel.streamSettings.dimPassthrough = false updateDimmerDomesState() - } - - if dimLevel == 11 { startMoonlightCycle() } else { stopMoonlightCycle() } - - presetOverlayText = dimButtonTitle - presetOverlayIcon = dimButtonIcon - showInlinePresetOverlay = true - - presetOverlayTimer?.invalidate() - presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false - } - } + stopMoonlightCycle() + stopReactiveLerp() + showDimPresetOverlay() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } // 6. Preset - makeControlButton(label: "Preset", systemImage: "camera.filters") { + staggeredControl(index: 6) { + makeControlButton(label: "Preset", systemImage: "camera.filters", action: { + guard canChangePreset() else { + print("[CurvedDisplay] Preset change on cooldown, ignoring") + return + } + let allowed: [Int32] = [0, 1, 2, 3] let cur = viewModel.streamSettings.uikitPreset let idx = allowed.firstIndex(of: cur) ?? 0 let next = allowed[(idx + 1) % allowed.count] viewModel.streamSettings.uikitPreset = next - presetOverlayText = "Preset: \(presetName(for: next))" - presetOverlayIcon = "camera.filters" - showInlinePresetOverlay = true + applyCurvedUIKitPreset(next) - presetOverlayTimer?.invalidate() - presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false - } - } + presetCooldownUntil = Date().addingTimeInterval(0.3) + presentFilterPresetCenterPopup(selectedPreset: next) startHideTimer() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + + // 7. HDR + if viewModel.streamSettings.enableHdr { + staggeredControl(index: 7) { + makeControlButton( + label: showHDRPanel ? "Close HDR" : "HDR", + systemImage: "wand.and.stars", + action: { + showHDRPanel.toggle() + if showHDRPanel { + showDimmingPicker = false + showEnvironmentPicker = false + updateHDRParamsFromPanel() + } + startHideTimer() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } } - // 7. 3D - makeControlButton(label: videoMode == .standard2D ? "Standard Display" : "3D", systemImage: "view.3d") { + + // 8. 3D + staggeredControl(index: 8) { + makeControlButton(label: videoMode == .standard2D ? "Standard Display" : "3D", systemImage: "view.3d", action: { if videoMode == .standard2D { show3DConfirm = true } else { videoMode = .standard2D updateScreenMaterial() } + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) } - // 8. Sphere Environment (360 JPEGs) - makeControlButton(label: environmentSphereButtonTitle, systemImage: "photo") { - environmentSphereLevel = nextEnvironmentLevel(from: environmentSphereLevel) - dimLevel = 0 - environmentUSDZLevel = 0 - withAnimation(.easeInOut(duration: 0.25)) { - viewModel.streamSettings.dimPassthrough = (environmentSphereLevel != 0) - } - stopMoonlightCycle() - updateEnvironmentState() - - updateDimmerDomesState() + // 9. Sphere Environment (Picker) + staggeredControl(index: 10) { + LongPressControlBtn( + label: environmentSphereButtonTitle, + systemImage: "photo", + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + showEnvironmentPicker.toggle() + if showEnvironmentPicker { + showDimmingPicker = false + showHDRPanel = false + stopMoonlightCycle() + stopReactiveLerp() + } + + startHideTimer() + }, + longPressAction: { + // Long press still clears the environment + environmentSphereLevel = 0 + newsetLevel = 0 + showEnvironmentPicker = false + updateEnvironmentState() + updateNewsetState() + withAnimation(.easeInOut(duration: 0.25)) { viewModel.streamSettings.dimPassthrough = false } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } - presetOverlayText = environmentSphereButtonTitle - presetOverlayIcon = "photo" - showInlinePresetOverlay = true + // 10. Stats + staggeredControl(index: 11) { + makeControlButton(label: viewModel.streamSettings.statsOverlay ? "Hide Stats" : "Show Stats", systemImage: "wifi", action: { + viewModel.streamSettings.statsOverlay.toggle() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + + // 10.5. Task Manager Button (if enabled) + if viewModel.streamSettings.showTaskManagerButton { + staggeredControl(index: 11) { + makeControlButton(label: "Task Manager", systemImage: "list.bullet.circle", action: { + sendTaskManager() + startHighlightTimer() + }, onTapFeedback: { controlTapFeedbackTrigger += 1 }) + } + } + + // 11. Keyboard Toggle + staggeredControl(index: 12) { + makeControlButton( + label: showVirtualKeyboard ? "Hide Keyboard" : "Show Keyboard", + systemImage: showVirtualKeyboard ? "keyboard.fill" : "keyboard", + action: { + // If opening keyboard while in controller mode, automatically switch to screen adjust mode + if inputMode == .controller && !showVirtualKeyboard { + print("[Keyboard] Auto-switching from Controller Mode to Screen Adjust Mode for keyboard") + gazeController.cleanup() + inputMode = .screenMove + updateScreenInteractivity() + + presetOverlayText = "Switched to Screen Adjust Mode" + presetOverlayIcon = "arrow.up.and.down.and.arrow.left.and.right" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + } - presetOverlayTimer?.invalidate() - presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false + showVirtualKeyboard.toggle() + + // Delay focus to ensure TextField is rendered + if showVirtualKeyboard { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + isKeyboardFocused = true } + } else { + isKeyboardFocused = false } - startHideTimer() + + print("[Keyboard] Toggle pressed, showVirtualKeyboard is now: \(showVirtualKeyboard)") + startHighlightTimer() + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) } - - // 9. Stats - makeControlButton(label: viewModel.streamSettings.statsOverlay ? "Hide Stats" : "Show Stats", systemImage: "wifi") { - viewModel.streamSettings.statsOverlay.toggle() + + if viewModel.streamSettings.showControllerBattery { + staggeredControl(index: 13) { + BatteryIndicatorView( + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer + ) + } + } + + // 12. Input Mode Toggle (Screen Adjust / Controller / Gaze Control) + // Long press to disable/enable hand & gaze input + staggeredControl(index: 14) { + LongPressControlBtn( + label: { + // Use Touch label if in Gaze Control mode and Touch mode is enabled + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { + return "Touch Control Mode" + } + return inputMode.displayName + }(), + systemImage: { + if isHandGazeInputDisabled { + return "lock.fill" + } + // Use Touch icon if in Gaze Control mode and Touch mode is enabled + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { + return "hand.point.up.left.fill" + } + return inputMode.icon + }(), + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + gazeController.cleanup() // Reset gaze state on mode change + inputMode = inputMode.next() + print("[InputMode] Changed to: \(inputMode) (\(inputMode.displayName))") + + // CRITICAL FIX: When switching to Controller mode, ensure keyboard is closed + // and first responder is properly reclaimed for controller input + if inputMode == .controller { + showVirtualKeyboard = false + isKeyboardFocused = false + print("[InputMode] Switched to Controller mode - keyboard closed, first responder will be reclaimed") + + // Force first responder reclaim after a brief delay to ensure TextField releases it + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + // The InputCaptureUIView timer will reclaim first responder + print("[InputMode] Controller mode delay complete - first responder should be active") + } + } + + // Update gaze controller with current stream config + if inputMode == .gazeControl { + gazeController.streamConfig = streamConfig + } + + presetOverlayText = { + // Use Touch label if in Gaze Control mode and Touch mode is enabled + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { + return "Touch Control Mode" + } + return inputMode.displayName + }() + presetOverlayIcon = { + // Use Touch icon if in Gaze Control mode and Touch mode is enabled + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { + return "hand.point.up.left.fill" + } + return inputMode.icon + }() + showInlinePresetOverlay = true + + // Update gaze controller with current stream config + gazeController.streamConfig = streamConfig + print("[InputMode] GazeController streamConfig set: \(streamConfig != nil)") + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + longPressAction: { + isHandGazeInputDisabled.toggle() + presetOverlayText = isHandGazeInputDisabled ? "Screen Input Disabled" : "Screen Input Enabled" + presetOverlayIcon = isHandGazeInputDisabled ? "lock.fill" : { + if inputMode == .gazeControl && viewModel.streamSettings.curvedGazeUseTouchMode { + return "hand.point.up.left.fill" + } + return inputMode.icon + }() + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + }, + onTapFeedback: { controlTapFeedbackTrigger += 1 } + ) + } + + // 13. Co-op Indicator (if in co-op session) + if viewModel.isCoopSession { + staggeredControl(index: 15) { + HStack(spacing: 6) { + Image(systemName: "person.2.fill") + .font(.system(size: 16, weight: .semibold)) + Text("2P") + .font(.system(size: 14, weight: .bold)) + + // Participant counter + let coordinator = CoopSessionCoordinator.shared + let participantCount = coordinator.participants.count + Text("(\(participantCount)/2)") + .font(.system(size: 12, weight: .medium)) + .foregroundColor(.white.opacity(0.8)) + } + .foregroundColor(.white ) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.3)) + ) + } + } + + // 14. Co-op Invite Button (only when hosting and guest is missing) + if viewModel.isCoopSession { + let coordinator = CoopSessionCoordinator.shared + if coordinator.isHosting && coordinator.participants.count < 2 { + staggeredControl(index: 16) { + coopInviteButton + } + } + } + + // 15. Co-op Disconnect Button (always show when in co-op) + if viewModel.isCoopSession { + staggeredControl(index: 17) { + coopDisconnectButton + } } } - .padding(12) - .background(Color.white.opacity(0.001)) - .opacity(!hideControls ? (controlsHighlighted ? 1.0 : 0.5) : 0.05) - .conditionalGlass(!hideControls) - .animation(.easeInOut(duration: 0.25), value: controlsHighlighted) - .animation(.easeInOut(duration: 0.25), value: hideControls) + } + + private var curvedExpandedControlsContent: some View { + curvedControlsBarContent + } + + private var curvedOriginalControlsBar: some View { + curvedControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .background { + Capsule() + .fill(.ultraThinMaterial) + .opacity(topControlsUltraThinCapsuleOpacityWhenChromeVisible()) + } + // Dynamic opacity floor: lower for black modes (Eclipse, Starfield); Reactive V1 gets a readability lift vs glow + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : fadedTopControlsInactiveOpacity()) : fadedTopControlsDormantOpacity()) + .animation(Animation.easeInOut(duration: 0.35), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.35), value: hideControls) + .animation(Animation.easeInOut(duration: 0.35), value: reactiveV1TopChromeAnimationAnchor) + .animation(Animation.easeInOut(duration: 0.35), value: dimLevel) + .sensoryFeedback(.impact(weight: .medium), trigger: controlTapFeedbackTrigger) .allowsHitTesting(true) } - private func makeControlButton(label: String, systemImage: String, action: @escaping () -> Void) -> some View { + private func makeControlButton(label: String, systemImage: String, action: @escaping () -> Void, onTapFeedback: (() -> Void)? = nil) -> some View { Button { if !controlsHighlighted { withAnimation(.easeInOut(duration: 0.3)) { @@ -1369,8 +3458,10 @@ struct _CurvedDisplayStreamView: View { startHighlightTimer() return } - controlsHighlighted = false + // Keep controlsHighlighted = true during action execution + // This prevents state flicker that breaks drag gesture recognition hideControls = false + onTapFeedback?() action() startHideTimer() } label: { @@ -1385,34 +3476,136 @@ struct _CurvedDisplayStreamView: View { @State private var dimInteractionLocked: Bool = false + private var coopInviteButton: some View { + Button { + if !controlsHighlighted { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlTapFeedbackTrigger += 1 + + // Create a fresh activity with a new session ID and broadcast it. + // We can't just re-activate the existing activity because the guest + // already leave()'d that session -- SharePlay won't let them re-join it. + // A fresh session ID forces a new GroupSession object on the guest side. + let coordinator = CoopSessionCoordinator.shared + Task { + await coordinator.reInviteGuest() + } + + // Show "Sent" feedback for 3 seconds + inviteButtonSent = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + inviteButtonSent = false + } + + startHideTimer() + } label: { + HStack(spacing: 6) { + Image(systemName: inviteButtonSent ? "checkmark" : "paperplane") + .font(.system(size: 14, weight: .medium)) + Text(inviteButtonSent ? "Sent" : "Invite") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + .animation(.easeInOut(duration: 0.2), value: inviteButtonSent) + } + + private var coopDisconnectButton: some View { + Button { + print("[Leave] Button tapped - controlsHighlighted: \(controlsHighlighted)") + if !controlsHighlighted { + print("[Leave] Controls not highlighted, highlighting now") + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlTapFeedbackTrigger += 1 + + print("[Leave] Setting showDisconnectConfirm = true") + showDisconnectConfirm = true + print("[Leave] showDisconnectConfirm is now: \(showDisconnectConfirm)") + } label: { + HStack(spacing: 6) { + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.system(size: 14, weight: .medium)) + Text("Leave") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + } + + private func sendTaskManager() { + DispatchQueue.global(qos: .userInteractive).async { + let MODIFIER_CTRL: Int8 = 0x02 + let MODIFIER_SHIFT: Int8 = 0x01 + let modifiers = MODIFIER_CTRL | MODIFIER_SHIFT + let ESC_KEY: Int16 = 0x1B + + // Send Ctrl+Shift+Esc to open Task Manager + // Note: We use Ctrl+Shift+Esc instead of Ctrl+Alt+Delete because Windows blocks + // Ctrl+Alt+Delete as a Secure Attention Sequence (SAS) that cannot be triggered remotely. + // The 0x8000 flag is required for proper key code handling in the Moonlight protocol. + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x03, modifiers) // Key Down + usleep(50 * 1000) + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x04, modifiers) // Key Up + } + } + private var dimButtonTitle: String { switch dimLevel { - case 0: "Off" + case 0: "Dimming Off" case 1: "Night" - case 2: "Eclipse" - case 4: "Midnight" - case 5: "Twilight" - case 6: "Dawn" - case 7: "Sunrise" - case 8: "Woodland" - case 9: "Desert" - case 10: "Dusk" - case 12: "Reactive" - default: "Off" + case 2: "Reactive 1" + case 4: "Eclipse" + case 5: "Midnight" + case 6: "Twilight" + case 7: "Dawn" + case 8: "Sunrise" + case 9: "Woodland" + case 10: "Reactive 2" + case 12: "Starfield" + case 14: "Desert" + default: "Dimming Off" } } private var dimButtonIcon: String { - (dimLevel == 0) ? "moon" : "moon.fill" + "lightbulb.fill" } private var environmentSphereButtonTitle: String { if environmentSphereLevel == 0 { return "Environment Off" } - let builtinNames = builtinSkyboxNames + let builtinNames = SkyboxCatalog.builtinNames let idx = environmentSphereLevel - 1 if idx < builtinNames.count { let id = builtinNames[idx] - return skyboxDisplayNames[id] ?? id.uppercased() + return SkyboxCatalog.displayNames[id] ?? id.uppercased() } let extraIdx = idx - builtinNames.count if extraIdx >= 0 && extraIdx < extraSkyboxNames.count { @@ -1425,30 +3618,34 @@ struct _CurvedDisplayStreamView: View { "photo" } + private var shouldHideHands: Bool { + environmentSphereLevel > 0 && viewModel.streamSettings.hideHandsIn360Environment + } + private var newsetButtonTitle: String { if newsetLevel == 0 { return "Newset Off" } let idx = newsetLevel - 1 - let newsetNames = newsetSkyboxNames + let newsetNames = SkyboxCatalog.newsetNames let name = newsetNames[idx] return name.uppercased() } private func nextNewsetLevel(from current: Int) -> Int { - let total = newsetSkyboxNames.count + let total = SkyboxCatalog.newsetNames.count if total <= 0 { return 0 } if current >= total { return 0 } return current + 1 } private func nextEnvironmentLevel(from current: Int) -> Int { - let total = builtinSkyboxNames.count + extraSkyboxNames.count + let total = SkyboxCatalog.builtinNames.count + extraSkyboxNames.count if total <= 0 { return 0 } if current >= total { return 0 } return current + 1 } private func nextDimLevel(from current: Int) -> Int { - let order = [0, 1, 2, 4, 5, 6, 7, 8, 9] + let order = [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12] if let idx = order.firstIndex(of: current) { return order[(idx + 1) % order.count] } @@ -1507,6 +3704,12 @@ struct _CurvedDisplayStreamView: View { } // MARK: - HDR & Material + + /// Pushes persisted HDR panel values into `safeHDRSettings` right before `DrawableVideoDecoder` is created, + /// ensuring the first frame matches UserDefaults even if lifecycle ordering was off. + private func syncHDRSettingsForStreamStart() { + applyCurvedUIKitPreset(viewModel.streamSettings.uikitPreset) + } private func applyCurvedUIKitPreset(_ preset: Int32) { var params = safeHDRSettings.value @@ -1514,53 +3717,89 @@ struct _CurvedDisplayStreamView: View { if viewModel.streamSettings.enableHdr { switch preset { case 1: - hdrParams.mode = 1 - params.boost = 1.0 - params.saturation = 0.95 - params.contrast = 1.15 + hdrParams.mode = 1 + params.boost = 1.0 + params.saturation = 1.05 + params.contrast = 1.005 + params.brightness = 0.0 + case 2: + hdrParams.mode = 1 + params.boost = 1.05 + params.saturation = 1.15 + params.contrast = 1.01 + params.brightness = 0.0 + case 3: + hdrParams.mode = 2 + params.boost = 0.99 + params.saturation = 0.87 + params.contrast = 1.005 + params.brightness = 0.01 + default: + hdrParams.mode = 1 + params.boost = 1.00 + params.saturation = 1.00 + params.contrast = 1.00 + params.brightness = 0.00 + } + let hrBoost = hdrHeadroomBoost() + params.boost = Swift.min(Swift.max(params.boost * hrBoost, 1.0), 1.50) + params.contrast = Swift.min(Swift.max(params.contrast, 1.00), 1.20) + params.saturation = Swift.min(Swift.max(params.saturation, 0.85), 1.15) + params.brightness = 0.0 + } else { + switch preset { + case 1: + params.boost = 0.98 + params.saturation = 1.05 + params.contrast = 1.002 params.brightness = 0.0 + params.mode = 1 case 2: - hdrParams.mode = 1 params.boost = 1.05 - params.saturation = 1.13 - params.contrast = 1.08 + params.saturation = 1.15 + params.contrast = 1.005 params.brightness = 0.0 + params.mode = 1 case 3: - hdrParams.mode = 2 - params.boost = 1.0 - params.saturation = 1.05 - params.contrast = 0.95 - params.brightness = 0.02 + params.boost = 1.02 + params.saturation = 0.90 + params.contrast = 1.005 + params.brightness = 0.0 + params.mode = 1 default: - hdrParams.mode = 1 params.boost = 1.00 params.saturation = 1.00 - params.contrast = 1.1 + params.contrast = 1.00 params.brightness = 0.00 + params.mode = 0 } - let hrBoost = hdrHeadroomBoost() - params.boost = Swift.min(Swift.max(params.boost * hrBoost, 1.0), 2.50) - params.contrast = Swift.min(Swift.max(params.contrast, 1.00), 1.65) - params.saturation = Swift.min(Swift.max(params.saturation, 1.00), 1.50) - params.brightness = 0.0 - } else { - switch preset { - case 1: params.boost = 0.95; params.saturation = 1.15; params.contrast = 1.03; params.brightness = 0.0 - case 2: params.boost = 1.15; params.saturation = 1.13; params.contrast = 1.10; params.brightness = 0.0 - case 3: params.boost = 1.05; params.saturation = 0.95; params.contrast = 1.06; params.brightness = 0.0 - default: params.boost = 1.00; params.saturation = 1.00; params.contrast = 1.00; params.brightness = 0.00 + } + // FILTER: Default — Enhanced HDR panel wins for brightness/sat/contrast. Without this, + // bootstrap applies preset scaffold (e.g. SDR boost 1.0) after sync and the image flashes correct then dips dark. + if preset == 0 { + params.boost = hdrPanelSettings.brightness + params.contrast = hdrPanelSettings.contrast + params.saturation = hdrPanelSettings.saturation + params.brightness = 0.0 + if viewModel.streamSettings.enableHdr { + let hrB = hdrHeadroomBoost() + params.boost = Swift.min(Swift.max(params.boost * hrB, 1.0), 1.50) + params.contrast = Swift.min(Swift.max(params.contrast, 1.00), 1.20) + params.saturation = Swift.min(Swift.max(params.saturation, 0.85), 1.15) } } - - params.mode = hdrParams.mode + if viewModel.streamSettings.enableHdr { + params.mode = hdrParams.mode + } + params.pqExposure = hdrPanelSettings.pqExposure + params.hdrGradeFlags = hdrPanelSettings.referenceHDR ? 1 : 0 safeHDRSettings.value = params - updateScreenMaterial() - LiRequestIdrFrame() - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) { LiRequestIdrFrame() } + + // HDR params are applied via hdrSettingsProvider on every frame - no IDR needed } - private func hdrHeadroomBoost() -> Float { 1.52 } + private func hdrHeadroomBoost() -> Float { 1.40 } private func updateHDRParams() { var params = HDRParams( @@ -1568,15 +3807,36 @@ struct _CurvedDisplayStreamView: View { contrast: viewModel.streamSettings.gamma, saturation: viewModel.streamSettings.saturation, brightness: 0.0, - mode: hdrParams.mode + pqExposure: hdrPanelSettings.pqExposure, + mode: hdrParams.mode, + hdrGradeFlags: hdrPanelSettings.referenceHDR ? 1 : 0 ) if viewModel.streamSettings.enableHdr { let hrBoost = hdrHeadroomBoost() - params.boost = Swift.min(Swift.max(params.boost * hrBoost, 1.0), 2.25) + params.boost = Swift.min(Swift.max(params.boost * hrBoost, 1.0), 1.50) params.brightness = 0.0 } safeHDRSettings.value = params } + + // Live update from HDR panel sliders — must match stream start logic for Custom preset (uikitPreset == 0) + // to prevent image "snap" when opening HDR panel + private func updateHDRParamsFromPanel() { + if viewModel.streamSettings.uikitPreset == 0 { + // Custom preset: use same HDR headroom/clamps as stream start + applyCurvedUIKitPreset(0) + } else { + // Non-custom presets: raw copy from panel (legacy behavior for non-zero presets) + var params = safeHDRSettings.value + params.boost = hdrPanelSettings.brightness + params.contrast = hdrPanelSettings.contrast + params.saturation = hdrPanelSettings.saturation + params.pqExposure = hdrPanelSettings.pqExposure + params.brightness = 0.0 + params.hdrGradeFlags = hdrPanelSettings.referenceHDR ? 1 : 0 + safeHDRSettings.value = params + } + } private func updateScreenMaterial() { if videoMode == .sideBySide3D { @@ -1604,37 +3864,130 @@ struct _CurvedDisplayStreamView: View { } } + // MARK: - Debug Calibration + + /// Adds colored spheres at known UV positions for calibration + private func addDebugCalibrationSpheres(to parent: Entity) { + let sphereRadius: Float = 0.02 // 2cm spheres + + // Dynamic Z offset based on curvature (less offset for extreme curves) + let currentCurveMagnitude = curvaturePreset.value * curveAnimationMultiplier + let zOffset: Float = 0.05 * (1.0 - currentCurveMagnitude * 0.5) // Reduced at high curvature + + // Standard calibration positions (disabled by default) + let calibrationPoints: [(SIMD2, UIColor, String)] = [ + (SIMD2(0.15, 0.15), .red, "TOP-LEFT"), + (SIMD2(0.85, 0.15), .green, "TOP-RIGHT"), + (SIMD2(0.5, 0.5), .blue, "CENTER"), + (SIMD2(0.15, 0.85), .yellow, "BOTTOM-LEFT"), + (SIMD2(0.85, 0.85), .magenta, "BOTTOM-RIGHT") + ] + + for (uv, color, name) in calibrationPoints { + // Convert UV to 3D position on curved mesh + let position3D = uvTo3DPosition(uv: uv) + + // Create sphere + let sphere = ModelEntity( + mesh: .generateSphere(radius: sphereRadius), + materials: [UnlitMaterial(color: color)] + ) + + sphere.position = position3D + SIMD3(0, 0, zOffset) + sphere.name = "DEBUG_\(name)" + + parent.addChild(sphere) + + print("[DEBUG] Added \(name) sphere at UV \(uv) → 3D position \(position3D)") + } + } + + /// Convert UV coordinates (0-1) to 3D position on the curved mesh (in mesh-local space) + private func uvTo3DPosition(uv: SIMD2) -> SIMD3 { + let width = CURVED_MAX_WIDTH_METERS + let height = width * screenAspect + let curveMagnitude = curvaturePreset.value * curveAnimationMultiplier + let maxCurveAngle: Float = CURVED_MAX_ANGLE + let currentAngle = maxCurveAngle * max(0.0, min(curveMagnitude, 2.0)) + + // Convert UV to mesh coordinates + // U: 0 = left edge, 1 = right edge + // V: 0 = top edge, 1 = bottom edge + + var x: Float + var z: Float + + if currentAngle < 0.0001 { + // Flat mode + x = (uv.x - 0.5) * width + z = 0 + } else { + // Curved mode + let radius = width / currentAngle + let theta = (uv.x - 0.5) * currentAngle + + x = radius * sin(theta) + z = radius * (1.0 - cos(theta)) + } + + // Y is straightforward (flipped because V=0 is top) + let y = (0.5 - uv.y) * height + + return SIMD3(x, y, z) + } + // MARK: - RealityView Setup func setupRealityView(content: RealityViewContent, attachments: RealityViewAttachments) { - let mesh = try! generateCurvedRoundedPlane( - width: CURVED_MAX_WIDTH_METERS, - aspectRatio: screenAspect, - resolution: (512, 512), - curveMagnitude: curvaturePreset.value * curveAnimationMultiplier, - cornerRadiusFraction: cornerRadiusFraction - ) + // Safe mesh generation with fallback + let mesh: MeshResource + do { + mesh = try generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS, + aspectRatio: screenAspect, + resolution: (256, 256), + curveMagnitude: curvaturePreset.value * curveAnimationMultiplier, + cornerRadiusFraction: cornerRadiusFraction + ) + } catch { + print("⚠️ Failed to generate curved mesh: \(error). Using flat fallback.") + mesh = .generatePlane(width: CURVED_MAX_WIDTH_METERS, height: CURVED_MAX_WIDTH_METERS * screenAspect) + } if videoMode == .standard2D { screen = ModelEntity(mesh: mesh, materials: [UnlitMaterial(texture: texture)]) } else { - let material = UnlitMaterial(texture: texture) - screen = ModelEntity(mesh: mesh, materials: [material]) + screen = ModelEntity(mesh: mesh, materials: [UnlitMaterial(texture: texture)]) } - let thinCollisionShape = ShapeResource.generateBox( - width: CURVED_MAX_WIDTH_METERS, - height: CURVED_MAX_WIDTH_METERS * screenAspect, - depth: 0.01 // Very thin - just 1cm depth - ) - - screen.components.set(CollisionComponent( - shapes: [thinCollisionShape], - filter: CollisionFilter( - group: .screenEntity, - mask: .all + // Generate curved collision mesh that matches visual geometry + let collisionMesh: MeshResource + do { + collisionMesh = try generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS, + aspectRatio: screenAspect, + resolution: (64, 64), + curveMagnitude: curvaturePreset.value * curveAnimationMultiplier, + cornerRadiusFraction: 0 ) - )) + } catch { + print("⚠️ Failed to generate collision mesh: \(error). Using flat fallback.") + collisionMesh = .generatePlane(width: CURVED_MAX_WIDTH_METERS, height: CURVED_MAX_WIDTH_METERS * screenAspect) + } + + Task { + if let collisionShape = try? await ShapeResource.generateStaticMesh(from: collisionMesh) { + await MainActor.run { + screen.components.set(CollisionComponent( + shapes: [collisionShape], + filter: CollisionFilter( + group: .screenEntity, + mask: .all + ) + )) + } + } + } screen.components.set(InputTargetComponent(allowedInputTypes: .all)) @@ -1642,22 +3995,54 @@ struct _CurvedDisplayStreamView: View { content.add(screen) + // Chromosphere: bloom shell must use the **same** curve / aspect topology as the display (updated in updateRealityView). + if chromosphereMeshEntity == nil { + let curveNow = curvaturePreset.value * curveAnimationMultiplier + let haloMesh = (try? makeChromosphereMesh(curveMagnitude: curveNow)) ?? fallbackChromospherePlaneMesh() + + let haloEntity = ModelEntity(mesh: haloMesh, materials: []) + haloEntity.components.set(OpacityComponent(opacity: 0.0)) + haloEntity.components.set(GroundingShadowComponent(castsShadow: false)) + screen.addChild(haloEntity) + headStorage.chromosphereHaloEntity = haloEntity + applyChromosphereHaloLocalZOffset(curveMagnitude: curveNow, entity: haloEntity) + DispatchQueue.main.async { + self.chromosphereMeshEntity = haloEntity + self.replaceChromosphereMeshWithDisplayCurve(curvaturePreset.value * curveAnimationMultiplier) + self.updateChromosphereMesh() + } + } + + // DEBUG: Spheres disabled - using corner gaze calibration instead + // addDebugCalibrationSpheres(to: screen) + let head = AnchorEntity(.head) content.add(head) - self.headAnchor = head - - if !hasInitializedPosition { - screen.position = SIMD3(0.0, 1.5, -6.0) - hasInitializedPosition = true - screenPosition = screen.position - screenScale = 4.0 + headStorage.headAnchor = head + + // First session only: apply a wide default placement. If the user has saved + // position/scale (`curved.pos` / `curved.scale`), bootstrap already restored + // `screenPosition` — do not async-overwrite it here (that broke persistence). + if !headStorage.hasInitializedPosition { + headStorage.hasInitializedPosition = true + let storedPos = UserDefaults.standard.array(forKey: "curved.pos") as? [Float] + let hasSavedPosition = storedPos?.count == 3 + if !hasSavedPosition { + screen.position = SIMD3(0.0, 1.5, -9.0) + DispatchQueue.main.async { + self.screenPosition = self.screen.position + self.screenScale = 4.0 + } + } } if let controls = attachments.entity(for: "controls") { - self.controlsEntity = controls + headStorage.controlsEntity = controls if controls.parent !== screen { screen.addChild(controls) } let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect - controls.position = [0.0 as Float, (screenHeight / 2.0) + Float(0.03), Float(0.05)] + // Reactive V2 translucent dome: pull toolbar slightly toward the viewer vs mesh sorting with the hemisphere. + let controlsZLocal: Float = (dimLevel == 10) ? 0.16 : 0.05 + controls.position = [0.0 as Float, (screenHeight / 2.0) + Float(0.03), controlsZLocal] } if let inputEnt = attachments.entity(for: "inputOverlay") { @@ -1671,14 +4056,12 @@ struct _CurvedDisplayStreamView: View { let desiredLocalWidth = CURVED_MAX_WIDTH_METERS * 1.05 let scale = desiredLocalWidth / unscaledWidth inputEnt.scale = [scale, scale, scale] - inputBaseWidth = unscaledWidth - inputScaleInitialized = true } } if let statsEnt = attachments.entity(for: "stats") { if statsEnt.parent !== screen { screen.addChild(statsEnt) } - if !statsScaleInitialized { + if !headStorage.statsScaleInitialized { let bounds = statsEnt.visualBounds(relativeTo: screen) if bounds.extents.x > 0 { let currentScaleX = max(statsEnt.scale.x, 0.0001) @@ -1686,6 +4069,7 @@ struct _CurvedDisplayStreamView: View { let targetLocalWidth = statsCardWidthMeters let scale = targetLocalWidth / unscaledWidth statsEnt.scale = [scale, scale, scale] + headStorage.statsScaleInitialized = true } } let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect @@ -1728,12 +4112,26 @@ struct _CurvedDisplayStreamView: View { if bounds.extents.x > 0 { let currentScaleX = max(sbsEnt.scale.x, 0.0001) let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let desiredLocalWidth = swapCardWidthMeters + let desiredLocalWidth = sbsConfirmCardWidthMeters let scale = desiredLocalWidth / unscaledWidth sbsEnt.scale = [scale, scale, scale] } } + if let disconnectEnt = attachments.entity(for: "disconnectConfirm") { + if disconnectEnt.parent !== screen { screen.addChild(disconnectEnt) } + disconnectEnt.position = [0.0 as Float, 0.0 as Float, Float(0.06)] + + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth = swapCardWidthMeters + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } + } + if let popupEnt = attachments.entity(for: "presetPopup") { if popupEnt.parent !== screen { screen.addChild(popupEnt) } popupEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] @@ -1747,20 +4145,151 @@ struct _CurvedDisplayStreamView: View { popupEnt.scale = [scale, scale, scale] } } + + // Co-op join notification (centered, same as presetPopup) + if let joinEnt = attachments.entity(for: "coopJoinNotification") { + if joinEnt.parent !== screen { screen.addChild(joinEnt) } + joinEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + + let bounds = joinEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(joinEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + joinEnt.scale = [scale, scale, scale] + } + } + + // Co-op disconnect notification (centered, same as presetPopup) + if let disconnectEnt = attachments.entity(for: "coopDisconnectNotification") { + if disconnectEnt.parent !== screen { screen.addChild(disconnectEnt) } + disconnectEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } + } + + // Co-op connecting overlay (centered, same as presetPopup) + if let connectingEnt = attachments.entity(for: "coopConnectingOverlay") { + if connectingEnt.parent !== screen { screen.addChild(connectingEnt) } + connectingEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + + let bounds = connectingEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(connectingEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + connectingEnt.scale = [scale, scale, scale] + } + } + + // Keyboard TextField - positioned below screen, centered + if let keyboardEnt = attachments.entity(for: "keyboardTextField") { + if keyboardEnt.parent !== screen { screen.addChild(keyboardEnt) } + let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect + + // Position below screen - if mic button is showing, keyboard goes above it + let keyboardOffset: Float = viewModel.streamSettings.showMicButton ? 0.16 : 0.08 + keyboardEnt.position = [0.0 as Float, -(screenHeight / 2.0) - Float(keyboardOffset), Float(0.05)] + + let bounds = keyboardEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(keyboardEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + keyboardEnt.scale = [scale, scale, scale] + } + } + + // Mic Button - positioned below keyboard (if keyboard is showing) or below screen + if let micEnt = attachments.entity(for: "micButton") { + if micEnt.parent !== screen { screen.addChild(micEnt) } + let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect + + // Position below keyboard if keyboard is showing, otherwise below screen + let micOffset: Float = showVirtualKeyboard ? 0.24 : 0.08 + micEnt.position = [0.0 as Float, -(screenHeight / 2.0) - Float(micOffset), Float(0.05)] + + let bounds = micEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(micEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.30 + let scale = desiredLocalWidth / unscaledWidth + micEnt.scale = [scale, scale, scale] + } + } + } func updateRealityView(content: RealityViewContent, attachments: RealityViewAttachments) { let currentCurve = curvaturePreset.value * curveAnimationMultiplier - if let mesh = try? generateCurvedRoundedPlane( - width: CURVED_MAX_WIDTH_METERS, - aspectRatio: screenAspect, - resolution: (512, 512), - curveMagnitude: currentCurve, - cornerRadiusFraction: cornerRadiusFraction - ) { - if let model = screen.model { - try? model.mesh.replace(with: mesh.contents) + // OPTIMIZATION: Only regenerate mesh if curve or aspect ratio changed significantly + let needsMeshUpdate: Bool + if let lastCurve = headStorage.lastGeneratedCurve, let lastAspect = headStorage.lastGeneratedAspect { + needsMeshUpdate = abs(currentCurve - lastCurve) > 0.001 || abs(screenAspect - lastAspect) > 0.001 + } else { + needsMeshUpdate = true + } + + if needsMeshUpdate { + if let mesh = try? generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS, + aspectRatio: screenAspect, + resolution: (256, 256), + curveMagnitude: currentCurve, + cornerRadiusFraction: cornerRadiusFraction + ) { + if let model = screen.model { + try? model.mesh.replace(with: mesh.contents) + } + + if let haloEnt = headStorage.chromosphereHaloEntity, + let haloMesh = try? makeChromosphereMesh(curveMagnitude: currentCurve), + let hm = haloEnt.model { + try? hm.mesh.replace(with: haloMesh.contents) + } else if let haloEnt = headStorage.chromosphereHaloEntity, + let hm = haloEnt.model { + let plane = fallbackChromospherePlaneMesh() + try? hm.mesh.replace(with: plane.contents) + } + + // Also update collision mesh for accurate gaze hit detection + if let collisionMesh = try? generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS, + aspectRatio: screenAspect, + resolution: (64, 64), + curveMagnitude: currentCurve, + cornerRadiusFraction: 0 + ) { + Task { + if let collisionShape = try? await ShapeResource.generateStaticMesh(from: collisionMesh) { + await MainActor.run { + self.screen.components.set(CollisionComponent( + shapes: [collisionShape], + filter: CollisionFilter( + group: .screenEntity, + mask: .all + ) + )) + } + } + } + + // Update trackers (using headStorage to avoid @State modification during render) + self.headStorage.lastGeneratedCurve = currentCurve + self.headStorage.lastGeneratedAspect = self.screenAspect + } } } @@ -1770,22 +4299,35 @@ struct _CurvedDisplayStreamView: View { let tiltRotation = simd_quatf(angle: tiltRadians, axis: SIMD3(1, 0, 0)) screen.transform.rotation = tiltRotation - if let head = headAnchor { + if let head = headStorage.headAnchor { let p = head.position(relativeTo: nil) - let delta = simd_length(p - lastHeadWorldPos) + + // UPDATE: Efficiently feed head position to the input system + // This is "lazy" - we push the data, but SwiftUI doesn't redraw + // We need head relative to the screen + let localHead = screen.convert(position: .zero, from: head) + headStorage.positionInScreenSpace = localHead + + let delta = simd_length(p - headStorage.lastHeadWorldPos) let nearOrigin = simd_length(p) < 0.1 - let wasFar = simd_length(lastHeadWorldPos) > 0.25 - let notDraggingRecently = (CACurrentMediaTime() - lastDragTime) > 0.4 + let wasFar = simd_length(headStorage.lastHeadWorldPos) > 0.25 + let notDraggingRecently = (CACurrentMediaTime() - headStorage.lastDragTime) > 0.4 if nearOrigin && wasFar && delta > 0.25 && notDraggingRecently { - withAnimation(.easeInOut(duration: 0.22)) { - recenterScreenToHead(head: head) + // Defer state modification to avoid "Modifying state during view update" + DispatchQueue.main.async { + withAnimation(.easeInOut(duration: 0.22)) { + self.recenterScreenToHead(head: head) + } } } - lastHeadWorldPos = p + headStorage.lastHeadWorldPos = p } if let inputEnt = attachments.entity(for: "inputOverlay") { if inputEnt.parent !== screen { screen.addChild(inputEnt) } + // Keep input overlay just in front of the screen to avoid blocking controls + inputEnt.position = [0.0 as Float, 0.0 as Float, Float(0.01)] + let bounds = inputEnt.visualBounds(relativeTo: screen) if bounds.extents.x > 0 { let currentScaleX = max(inputEnt.scale.x, 0.0001) @@ -1795,78 +4337,237 @@ struct _CurvedDisplayStreamView: View { inputEnt.scale = [scale, scale, scale] } } + + if let pickerEnt = attachments.entity(for: "envPicker") { + if pickerEnt.parent !== screen { screen.addChild(pickerEnt) } + pickerEnt.position = [0.0 as Float, 0.0 as Float, Float(0.12)] + if showEnvironmentPicker { + let bounds = pickerEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(pickerEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.96 + let scale = desiredLocalWidth / unscaledWidth + pickerEnt.scale = [scale, scale, scale] + } + } + } + + if let dimPickerEnt = attachments.entity(for: "dimPicker") { + if dimPickerEnt.parent !== screen { screen.addChild(dimPickerEnt) } + dimPickerEnt.position = [0.0 as Float, 0.0 as Float, Float(0.12)] + if showDimmingPicker { + let bounds = dimPickerEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(dimPickerEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth = DimmingPickerView.curvedDesiredLocalWidth + let scale = desiredLocalWidth / unscaledWidth + dimPickerEnt.scale = [scale, scale, scale] + } + } + } - if let statsEnt = attachments.entity(for: "stats") { - if statsEnt.parent !== screen { screen.addChild(statsEnt) } - if !statsScaleInitialized { - let bounds = statsEnt.visualBounds(relativeTo: screen) + if let hdrEnt = attachments.entity(for: "hdrPanel") { + if hdrEnt.parent !== screen { screen.addChild(hdrEnt) } + hdrEnt.position = [0.0 as Float, 0.0 as Float, Float(0.12)] + if showHDRPanel { + let bounds = hdrEnt.visualBounds(relativeTo: screen) if bounds.extents.x > 0 { - let currentScaleX = max(statsEnt.scale.x, 0.0001) + let currentScaleX = max(hdrEnt.scale.x, 0.0001) let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let targetLocalWidth = statsCardWidthMeters - let scale = targetLocalWidth / unscaledWidth - statsEnt.scale = [scale, scale, scale] + let desiredLocalWidth: Float = 0.70 + let scale = desiredLocalWidth / unscaledWidth + hdrEnt.scale = [scale, scale, scale] } } + } + + if let statsEnt = attachments.entity(for: "stats") { + if statsEnt.parent !== screen { screen.addChild(statsEnt) } let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect statsEnt.position = [0.0 as Float, -(screenHeight / 2.0) - Float(0.03), Float(0.05)] + if viewModel.streamSettings.statsOverlay { + if !headStorage.statsScaleInitialized { + let bounds = statsEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(statsEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let targetLocalWidth = statsCardWidthMeters + let scale = targetLocalWidth / unscaledWidth + statsEnt.scale = [scale, scale, scale] + headStorage.statsScaleInitialized = true + } + } + } } if let tutorialEnt = attachments.entity(for: "tutorial") { if tutorialEnt.parent !== screen { screen.addChild(tutorialEnt) } tutorialEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] - - let bounds = tutorialEnt.visualBounds(relativeTo: screen) - if bounds.extents.x > 0 { - let currentScaleX = max(tutorialEnt.scale.x, 0.0001) - let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let targetLocalWidth = tutorialCardWidthMeters - let scale = targetLocalWidth / unscaledWidth - tutorialEnt.scale = [scale, scale, scale] + if showCurvedTutorial { + let bounds = tutorialEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(tutorialEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let targetLocalWidth = tutorialCardWidthMeters + let scale = targetLocalWidth / unscaledWidth + tutorialEnt.scale = [scale, scale, scale] + } } } if let swapEnt = attachments.entity(for: "swapConfirm") { if swapEnt.parent !== screen { screen.addChild(swapEnt) } swapEnt.position = [0.0 as Float, 0.0 as Float, Float(0.06)] - - let bounds = swapEnt.visualBounds(relativeTo: screen) - if bounds.extents.x > 0 { - let currentScaleX = max(swapEnt.scale.x, 0.0001) - let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let desiredLocalWidth = swapCardWidthMeters - let scale = desiredLocalWidth / unscaledWidth - swapEnt.scale = [scale, scale, scale] + if showSwapConfirm { + let bounds = swapEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(swapEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth = swapCardWidthMeters + let scale = desiredLocalWidth / unscaledWidth + swapEnt.scale = [scale, scale, scale] + } } } if let sbsEnt = attachments.entity(for: "sbsConfirm") { if sbsEnt.parent !== screen { screen.addChild(sbsEnt) } sbsEnt.position = [0.0 as Float, 0.0 as Float, Float(0.06)] + if show3DConfirm { + let bounds = sbsEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(sbsEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth = sbsConfirmCardWidthMeters + let scale = desiredLocalWidth / unscaledWidth + sbsEnt.scale = [scale, scale, scale] + } + } + } - let bounds = sbsEnt.visualBounds(relativeTo: screen) - if bounds.extents.x > 0 { - let currentScaleX = max(sbsEnt.scale.x, 0.0001) - let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let desiredLocalWidth = swapCardWidthMeters - let scale = desiredLocalWidth / unscaledWidth - sbsEnt.scale = [scale, scale, scale] + if let disconnectEnt = attachments.entity(for: "disconnectConfirm") { + if disconnectEnt.parent !== screen { screen.addChild(disconnectEnt) } + disconnectEnt.position = [0.0 as Float, 0.0 as Float, Float(0.06)] + if showDisconnectConfirm { + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth = swapCardWidthMeters + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } } } if let popupEnt = attachments.entity(for: "presetPopup") { if popupEnt.parent !== screen { screen.addChild(popupEnt) } popupEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + if showInlinePresetOverlay { + let bounds = popupEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(popupEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + popupEnt.scale = [scale, scale, scale] + } + } + } + + // Co-op join notification (centered, same as presetPopup) + if let joinEnt = attachments.entity(for: "coopJoinNotification") { + if joinEnt.parent !== screen { screen.addChild(joinEnt) } + joinEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + if coopCoordinator.friendJoinedNotification { + let bounds = joinEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(joinEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + joinEnt.scale = [scale, scale, scale] + } + } + } + + // Co-op disconnect notification (centered, same as presetPopup) + if let disconnectEnt = attachments.entity(for: "coopDisconnectNotification") { + if disconnectEnt.parent !== screen { screen.addChild(disconnectEnt) } + disconnectEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + if coopCoordinator.disconnectNotification { + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } + } + } + + // Co-op connecting overlay (centered, same as presetPopup) + if let connectingEnt = attachments.entity(for: "coopConnectingOverlay") { + if connectingEnt.parent !== screen { screen.addChild(connectingEnt) } + connectingEnt.position = [0.0 as Float, 0.0 as Float, Float(0.15)] + if viewModel.isCoopSession && viewModel.assignedControllerSlot == 1 && viewModel.streamState == .starting { + let bounds = connectingEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(connectingEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.35 + let scale = desiredLocalWidth / unscaledWidth + connectingEnt.scale = [scale, scale, scale] + } + } + } + + // Keyboard TextField - positioned below screen, centered + if let keyboardEnt = attachments.entity(for: "keyboardTextField") { + if keyboardEnt.parent !== screen { screen.addChild(keyboardEnt) } + let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect - let bounds = popupEnt.visualBounds(relativeTo: screen) - if bounds.extents.x > 0 { - let currentScaleX = max(popupEnt.scale.x, 0.0001) - let unscaledWidth = Float(bounds.extents.x) / currentScaleX - let desiredLocalWidth: Float = 0.35 - let scale = desiredLocalWidth / unscaledWidth - popupEnt.scale = [scale, scale, scale] + // Position below screen - if mic button is showing, keyboard goes above it + let keyboardOffset: Float = viewModel.streamSettings.showMicButton ? 0.16 : 0.08 + keyboardEnt.position = [0.0 as Float, -(screenHeight / 2.0) - Float(keyboardOffset), Float(0.05)] + if showVirtualKeyboard { + let bounds = keyboardEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(keyboardEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + keyboardEnt.scale = [scale, scale, scale] + } + } + } + + // Mic Button - positioned below keyboard (if keyboard is showing) or below screen + if let micEnt = attachments.entity(for: "micButton") { + if micEnt.parent !== screen { screen.addChild(micEnt) } + let screenHeight = CURVED_MAX_WIDTH_METERS * screenAspect + + // Position below keyboard if keyboard is showing, otherwise below screen + let micOffset: Float = showVirtualKeyboard ? 0.24 : 0.08 + micEnt.position = [0.0 as Float, -(screenHeight / 2.0) - Float(micOffset), Float(0.05)] + if viewModel.streamSettings.showMicButton { + let bounds = micEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(micEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.30 + let scale = desiredLocalWidth / unscaledWidth + micEnt.scale = [scale, scale, scale] + } } } + + if let haloEnt = headStorage.chromosphereHaloEntity { + applyChromosphereHaloLocalZOffset(curveMagnitude: currentCurve, entity: haloEnt) + } } // MARK: - Stream Management @@ -1877,50 +4578,123 @@ struct _CurvedDisplayStreamView: View { private func startStreamIfNeeded() { guard streamMan == nil else { + print("[CurvedDisplay] StreamManager already exists, skipping duplicate creation") needsResume = false return } - - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) { - guard self.viewModel.activelyStreaming, self.streamMan == nil else { + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + guard !self.hasPerformedTeardown, self.viewModel.activelyStreaming, self.streamMan == nil else { + print("[CurvedDisplay] Aborting stream start - Teardown: \(self.hasPerformedTeardown), Streaming: \(self.viewModel.activelyStreaming), Exists: \(self.streamMan != nil)") return } + self.renderGateOpen = true + self.firstFrameReceived = false + self.idrWatchdogTimer1?.invalidate(); self.idrWatchdogTimer1 = nil + self.idrWatchdogTimer2?.invalidate(); self.idrWatchdogTimer2 = nil + self.postFirstFrameRebindTimer?.invalidate(); self.postFirstFrameRebindTimer = nil + self.idrWatchdogTimer1 = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { _ in + if !self.firstFrameReceived { LiRequestIdrFrame() } + } + self.idrWatchdogTimer2 = Timer.scheduledTimer(withTimeInterval: 0.9, repeats: false) { _ in + if !self.firstFrameReceived { LiRequestIdrFrame() } + } + + // CRITICAL: Sync HDR settings from panel to safeHDRSettings BEFORE decoder creation + self.syncHDRSettingsForStreamStart() + self.ensureHDRTextureMatchesSetting() + // Set controller support reference for rumble forwarding + self.connectionCallbacks.controllerSupport = self.controllerSupport + + // Capture texture locally for thread-safe background access + let localTexture = self.texture + self.streamMan = StreamManager( config: self.streamConfig, rendererProvider: { - DrawableVideoDecoder( - texture: self.texture, + let decoder = DrawableVideoDecoder( + texture: localTexture, callbacks: self.connectionCallbacks, aspectRatio: self.screenAspect, useFramePacing: self.streamConfig.useFramePacing, enableHDR: self.viewModel.streamSettings.enableHdr, hdrSettingsProvider: { [safeHDRSettings] in safeHDRSettings.value }, - enhancementsProvider: { [weak viewModel] in - guard let vm = viewModel else { return (1.0, 1.0) } - // Apply additional HDR settings - let preset = vm.streamSettings.uikitPreset - switch preset { - case 1: return (0.95, 1.01) // Cinematic: slight desaturation, minimal contrast - case 2: return (1.12, 1.02) // Vivid: added saturation, light contrast - case 3: return (1.05, 1.01) // Realistic: warmth via saturation, minimal contrast - default: return (1.0, 1.0) // Default: neutral + enhancementsProvider: { + let p = self.viewModel.streamSettings.uikitPreset + switch p { + case 0: return (1.0, 1.0, 0.0) + case 1: return (1.15, 1.0, 0.0) + case 2: return (1.25, 1.0, 0.0) + case 3: return (0.90, 1.05, 0.0) + default: return (1.0, 1.0, 0.0) } }, - callbackToRender: { texture, correctedResolution in + callbackToRender: { textureQueue, haloQueue, correctedResolution in guard self.renderGateOpen else { return } - + + // Push frame and UI metadata directly to Main Thread (Bypasses RealityKit traffic jam) DispatchQueue.main.async { - if let correctedResolution { self.correctedResolution = correctedResolution } - self.texture.replace(withDrawables: texture) - self.rebindScreenMaterial() - self.controllerSupport?.connectionEstablished() - self.startHideTimer() + // DIRECT PUSH: Instantly paint the new frame to the curved screen + self.texture.replace(withDrawables: textureQueue) + + // Chromosphere: wire up the downsampled bloom texture on first frame + if let haloQueue { + if self.chromosphereTexture == nil { + let mipShift = ChromaHaloDownsample.mipShift + let cw = max(1, Int(self.streamConfig.width) >> mipShift) + let ch = max(1, Int(self.streamConfig.height) >> mipShift) + let bpp = self.viewModel.streamSettings.enableHdr ? 8 : 4 + if let tex = try? TextureResource( + dimensions: .dimensions(width: cw, height: ch), + format: .raw(pixelFormat: self.viewModel.streamSettings.enableHdr ? .rgba16Float : .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: Data(count: bpp * cw * ch), bytesPerRow: bpp * cw)]) + ) { + self.chromosphereTexture = tex + tex.replace(withDrawables: haloQueue) + self.updateChromosphereMesh() + } + } + } + + if let correctedResolution { + self.correctedResolution = correctedResolution + } + + // First Frame Logic + if !self.firstFrameReceived { + self.firstFrameReceived = true + self.idrWatchdogTimer1?.invalidate(); self.idrWatchdogTimer1 = nil + self.idrWatchdogTimer2?.invalidate(); self.idrWatchdogTimer2 = nil + self.guestAggressiveIDRTimer?.invalidate(); self.guestAggressiveIDRTimer = nil + + self.postFirstFrameRebindTimer?.invalidate() + self.postFirstFrameRebindTimer = Timer.scheduledTimer(withTimeInterval: 0.18, repeats: false) { _ in + self.rebindScreenMaterial() + } + + self.controllerSupport?.connectionEstablished() + self.startHideTimer() + } } } ) + + // Store the decoder reference for controlling reactive dimming + DispatchQueue.main.async { + self.videoDecoder = decoder + decoder.isReactiveDimmingEnabled = (self.dimLevel == 2 || self.dimLevel == 10 || self.dimLevel == 12) + let reachIdx = Reactive1ChromosphereReach.clampedSavedIndex() + decoder.chromaHaloScale = Reactive1ChromosphereReach.haloScale(forIndex: reachIdx) + if self.headStorage.chromosphereHaloEntity != nil { + self.replaceChromosphereMeshWithDisplayCurve(self.curvaturePreset.value * self.curveAnimationMultiplier) + } + self.updateChromosphereMesh() + } + + return decoder }, connectionCallbacks: self.connectionCallbacks ) @@ -1928,9 +4702,32 @@ struct _CurvedDisplayStreamView: View { if let streamMan = self.streamMan { operationQueue.addOperation(streamMan) } + + // AGGRESSIVE GUEST-SIDE IDR REQUESTING + // Co-op guests have independent streams - they must request their own IDR frames + if self.viewModel.isCoopSession && self.viewModel.assignedControllerSlot == 1 { + print("[CurvedDisplay] 🎮 CO-OP GUEST: Starting aggressive IDR requesting") + var requestCount = 0 + let maxRequests = 120 // 60 seconds at 500ms intervals + self.guestAggressiveIDRTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in + requestCount += 1 + if self.firstFrameReceived { + print("[CurvedDisplay] 🎮 CO-OP GUEST: First frame received! Stopping IDR requests after \(requestCount) requests") + timer.invalidate() + self.guestAggressiveIDRTimer = nil + return + } + if requestCount > maxRequests { + print("[CurvedDisplay] 🎮 CO-OP GUEST: Max IDR requests reached (\(maxRequests)), stopping") + timer.invalidate() + self.guestAggressiveIDRTimer = nil + return + } + print("[CurvedDisplay] 🎮 CO-OP GUEST: Requesting IDR frame #\(requestCount)") + LiRequestIdrFrame() + } + } - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) { LiRequestIdrFrame() } - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(350)) { LiRequestIdrFrame() } } } @@ -1962,7 +4759,19 @@ struct _CurvedDisplayStreamView: View { viewModel.shouldCloseStream = false Task { + // Only open main window if menu isn't already showing it + // (avoids duplicate window when disconnecting via in-stream menu) + if !isMenuOpen { + openWindow(id: "mainView") + + // Allow the OS time to build the window during the heavy teardown, + // then force it to the correct height and size. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.positionMenuWindow() + } + } await dismissImmersiveSpace() + viewModel.isImmersiveSpaceOpen = false } } @@ -1970,72 +4779,187 @@ struct _CurvedDisplayStreamView: View { private func cycleTiltAngle() { tiltAngle += 10.0 - if tiltAngle > 40.0 { + if tiltAngle > 60.0 { tiltAngle = 0.0 } + savedTiltAngle = Double(tiltAngle) } private func performCompleteTeardown() { guard !hasPerformedTeardown else { return } hasPerformedTeardown = true + + cancelReactiveSphereEnvelopeIntro(resetDomeVisuals: true) - guard let streamManager = streamMan else { - cleanupResources() - postTeardownNotification() - return - } + print("[CurvedDisplay] 🔴 TEARDOWN START") - streamManager.stopStream(completion: { [self] in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - self.cleanupResources() - self.postTeardownNotification() - } - }) + // CRITICAL: Close render gate BEFORE stopping stream + renderGateOpen = false + + statsTimer?.invalidate() + hideTimer?.invalidate() + presetOverlayTimer?.invalidate() + moonlightCycleTimer?.invalidate() + + idrWatchdogTimer1?.invalidate(); idrWatchdogTimer1 = nil + idrWatchdogTimer2?.invalidate(); idrWatchdogTimer2 = nil + postFirstFrameRebindTimer?.invalidate(); postFirstFrameRebindTimer = nil + guestAggressiveIDRTimer?.invalidate(); guestAggressiveIDRTimer = nil + firstFrameReceived = false + + controllerSupport?.cleanup() + controllerSupport = nil + + if let sm = streamMan { + print("[CurvedDisplay] Stopping StreamManager (waiting for LiStopConnection completion)...") + streamMan = nil // Clear reference now to prevent double-stop + + // Tell the serializer a stop is beginning — no new connection can start until + // notifyStopComplete() is called inside the real completion block below. + ConnectionSerializer.shared.notifyStopBegun() + + sm.stopStream(completion: { + DispatchQueue.main.async { + print("[CurvedDisplay] 🔴 TEARDOWN COMPLETE — LiStopConnection finished") + // Ungate the serializer — new connections may now proceed. + ConnectionSerializer.shared.notifyStopComplete() + NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + } + }) + } else { + print("[CurvedDisplay] 🔴 TEARDOWN COMPLETE (no stream to stop)") + NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + } } private func cleanupResources() { streamMan = nil controllerSupport?.cleanup() controllerSupport = nil - - // Remove: NotificationCenter.post(name: .rkStreamDidTeardown, object: nil) } - - private func postTeardownNotification() { - print("[Curved] Posting .rkStreamDidTeardown after verified completion + buffer") - // Remove: NotificationCenter.post(name: .rkStreamDidTeardown, object: nil) + + private func startEnvironmentFade(targetOpacity: Float, completion: (() -> Void)? = nil) { + environmentFadeTimer?.invalidate() + + guard let dome = headStorage.environmentDome else { + completion?() + return + } + + // Ensure OpacityComponent exists + if dome.components[OpacityComponent.self] == nil { + dome.components.set(OpacityComponent(opacity: targetOpacity == 1.0 ? 0.0 : 1.0)) + } + + let startOpacity = dome.components[OpacityComponent.self]?.opacity ?? 0.0 + + // If already close to target, just set and finish + if abs(startOpacity - targetOpacity) < 0.01 { + dome.components.set(OpacityComponent(opacity: targetOpacity)) + completion?() + return + } + + let duration: TimeInterval = 0.5 + let steps = 30 + let interval = duration / Double(steps) + let stepAmount = (targetOpacity - startOpacity) / Float(steps) + + var currentStep = 0 + + environmentFadeTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak dome] timer in + guard let dome = dome else { + timer.invalidate() + return + } + + currentStep += 1 + let newOpacity = startOpacity + stepAmount * Float(currentStep) + dome.components.set(OpacityComponent(opacity: newOpacity)) + + if currentStep >= steps { + if targetOpacity >= 1.0 { + // Remove OpacityComponent when fully visible to avoid interfering with controls + dome.components.remove(OpacityComponent.self) + } else { + dome.components.set(OpacityComponent(opacity: targetOpacity)) + } + timer.invalidate() + // self.environmentFadeTimer = nil // Omitted to avoid self capture complexity + completion?() + } + } } private func updateEnvironmentState() { - guard let dome = environmentDome else { return } + guard let dome = headStorage.environmentDome else { return } if environmentSphereLevel == 0 { - dome.isEnabled = false - lastEnvironmentSphereLevelApplied = 0 + startEnvironmentFade(targetOpacity: 0.0) { + dome.isEnabled = false + self.headStorage.lastEnvironmentSphereLevelApplied = 0 + } + return + } + + // If already enabled, fade out first then swap + if dome.isEnabled { + startEnvironmentFade(targetOpacity: 0.0) { + if let tex = self.currentSkyboxTexture() { + self.applySkyboxTexture(tex) + self.headStorage.lastEnvironmentSphereLevelApplied = self.environmentSphereLevel + self.startEnvironmentFade(targetOpacity: 1.0) + } + } return } - dome.isEnabled = true + + if !dome.isEnabled { + dome.isEnabled = true + dome.components.set(OpacityComponent(opacity: 0.0)) + } + if let tex = currentSkyboxTexture() { applySkyboxTexture(tex) - lastEnvironmentSphereLevelApplied = environmentSphereLevel + headStorage.lastEnvironmentSphereLevelApplied = environmentSphereLevel + startEnvironmentFade(targetOpacity: 1.0) } } private func updateNewsetState() { - guard let dome = environmentDome else { return } + guard let dome = headStorage.environmentDome else { return } if newsetLevel == 0 { - dome.isEnabled = false + startEnvironmentFade(targetOpacity: 0.0) { + dome.isEnabled = false + } + return + } + + // If already enabled, fade out first then swap + if dome.isEnabled { + startEnvironmentFade(targetOpacity: 0.0) { + if let tex = self.currentNewsetTexture() { + self.applySkyboxTexture(tex) + self.startEnvironmentFade(targetOpacity: 1.0) + } + } return } - dome.isEnabled = true + + if !dome.isEnabled { + dome.isEnabled = true + dome.components.set(OpacityComponent(opacity: 0.0)) + } + if let tex = currentNewsetTexture() { applySkyboxTexture(tex) + startEnvironmentFade(targetOpacity: 1.0) } } private func currentSkyboxTexture() -> TextureResource? { - let builtinNames = builtinSkyboxNames + let builtinNames = SkyboxCatalog.builtinNames let idx = environmentSphereLevel - 1 if idx >= 0 && idx < builtinNames.count { if let cached = builtinSkyboxTextures[builtinNames[idx]] { @@ -2053,8 +4977,8 @@ struct _CurvedDisplayStreamView: View { private func currentNewsetTexture() -> TextureResource? { let idx = newsetLevel - 1 - if idx >= 0 && idx < newsetSkyboxNames.count { - let name = newsetSkyboxNames[idx] + if idx >= 0 && idx < SkyboxCatalog.newsetNames.count { + let name = SkyboxCatalog.newsetNames[idx] if let cached = newsetSkyboxTextures[name] { return cached @@ -2072,17 +4996,22 @@ struct _CurvedDisplayStreamView: View { } private func applySkyboxTexture(_ texture: TextureResource) { - guard let dome = environmentDome else { return } + guard let dome = headStorage.environmentDome else { return } + var mat = UnlitMaterial(texture: texture) + // Keep the skybox material opaque when fully visible. + // OpacityComponent drives the fade and will automatically take the entity through a transparent path while fading. + mat.blending = .opaque + dome.model = ModelComponent(mesh: dome.model?.mesh ?? .generateSphere(radius: 60.0), - materials: [UnlitMaterial(texture: texture)]) + materials: [mat]) // Apply rotation based on which set is active if newsetLevel > 0 { // Newset is active let idx = newsetLevel - 1 - if idx >= 0 && idx < newsetSkyboxNames.count { - let skyboxName = newsetSkyboxNames[idx] - if let rotationAngle = newsetSkyboxRotations[skyboxName] { + if idx >= 0 && idx < SkyboxCatalog.newsetNames.count { + let skyboxName = SkyboxCatalog.newsetNames[idx] + if let rotationAngle = SkyboxCatalog.newsetRotations[skyboxName] { dome.orientation = simd_quatf(angle: rotationAngle, axis: SIMD3(0, 1, 0)) } else { dome.orientation = simd_quatf(angle: 0, axis: SIMD3(0, 1, 0)) @@ -2091,9 +5020,9 @@ struct _CurvedDisplayStreamView: View { } else if environmentSphereLevel > 0 { // Numbered set is active let idx = environmentSphereLevel - 1 - if idx >= 0 && idx < builtinSkyboxNames.count { - let skyboxName = builtinSkyboxNames[idx] - if let rotationAngle = skyboxRotations[skyboxName] { + if idx >= 0 && idx < SkyboxCatalog.builtinNames.count { + let skyboxName = SkyboxCatalog.builtinNames[idx] + if let rotationAngle = SkyboxCatalog.rotations[skyboxName] { dome.orientation = simd_quatf(angle: rotationAngle, axis: SIMD3(0, 1, 0)) } else { dome.orientation = simd_quatf(angle: 0, axis: SIMD3(0, 1, 0)) @@ -2119,6 +5048,14 @@ struct _CurvedDisplayStreamView: View { } // MARK: - Mesh Generation + + /// Pushes Chromosphere halo behind the panel with a tighter offset when curved vs flat (reduces coplanar z-fighting). + private func applyChromosphereHaloLocalZOffset(curveMagnitude: Float, entity: Entity) { + let zOffset: Float = abs(curveMagnitude) < 0.002 ? -0.048 : -0.028 + var pos = entity.position + pos.z = zOffset + entity.position = pos + } func generateCurvedRoundedPlane( width: Float, @@ -2230,22 +5167,37 @@ struct _CurvedDisplayStreamView: View { } } - if dimLevel == 12 { - var mat = UnlitMaterial(color: currentAmbientColor.withAlphaComponent(0.80)) + if dimLevel == 2 { + // Reactive 1 uses Chromosphere only; purple dome hidden (neutral material if ever applied) + var mat = UnlitMaterial(color: UIColor.clear) + mat.blending = .transparent(opacity: 1.0) + return (mat, nil) + } + + if dimLevel == 10 { + // Reactive 2 — legacy pre–Chromosphere preset: translucent tinted dome (historical Reactive V1 parity). + // Note: transparent domes composite differently than opaque spheres; Attachment toolbar uses stronger floors (`reactiveV2*` helpers). + var mat = UnlitMaterial(color: currentAmbientColor.withAlphaComponent(0.85)) mat.blending = .transparent(opacity: 1.0) return (mat, nil) } + + if dimLevel == 12 { + // Starfield - Pure black background + var mat = UnlitMaterial(color: .black) + mat.blending = .opaque + return (mat, nil) + } let selectedTex: TextureResource? switch dimLevel { - case 2: selectedTex = eclipseGradientTexture - case 4: selectedTex = purpleGradientTexturePurpleBlack - case 5: selectedTex = twilightGradientTexture - case 6: selectedTex = dawnGradientTexture - case 7: selectedTex = sunriseGradientTexture - case 8: selectedTex = woodlandGradientTexture - case 9: selectedTex = desertGradientTexture - case 10: selectedTex = duskHDRTexture + case 4: selectedTex = eclipseGradientTexture + case 5: selectedTex = purpleGradientTexturePurpleBlack + case 6: selectedTex = twilightGradientTexture + case 7: selectedTex = dawnGradientTexture + case 8: selectedTex = sunriseGradientTexture + case 9: selectedTex = woodlandGradientTexture + case 14: selectedTex = desertGradientTexture default: selectedTex = purpleGradientTextureColors } @@ -2253,77 +5205,132 @@ struct _CurvedDisplayStreamView: View { if let tex = selectedTex { var unlitMat = UnlitMaterial(texture: tex) - if dimLevel == 10 { - unlitMat.color.tint = UIColor.white.withAlphaComponent(1.0) + // Eclipse (Level 4) is SOLID black - use .opaque for proper Z-sorting + if dimLevel == 4 { + unlitMat.color.tint = .white unlitMat.blending = .opaque } else { + // All other gradients use user-adjustable brightness + // Use user-adjustable brightness from presetBrightness, falling back to defaults let tintAlpha: CGFloat = { - switch dimLevel { - case 2, 4: return 0.95 - case 5, 6, 7, 8, 9: return 0.90 - default: return 0.5 + if let userBrightness = presetBrightness[dimLevel] { + return CGFloat(userBrightness) } + return defaultPresetBrightness[dimLevel] ?? 0.5 }() + + // Always use transparent blending for smooth brightness cycling unlitMat.color.tint = UIColor.white.withAlphaComponent(tintAlpha) unlitMat.blending = .transparent(opacity: 1.0) } mat = unlitMat } else { var fallback = UnlitMaterial(color: .purple) - if dimLevel == 10 { - fallback.color.tint = UIColor(red: 0.60, green: 0.40, blue: 0.90, alpha: 1.0) - fallback.blending = .opaque - } else { - let fallbackAlpha: CGFloat = { - switch dimLevel { - case 2, 4: return 0.95 - case 5, 6, 7, 8, 9: return 0.90 - default: return 0.5 - } - }() - fallback.color.tint = UIColor(red: 0.60, green: 0.40, blue: 0.90, alpha: fallbackAlpha) - fallback.blending = .transparent(opacity: 1.0) - } + let fallbackAlpha: CGFloat = { + switch dimLevel { + case 4, 5: return 0.95 + case 6, 7, 8, 9, 10: return 0.90 + default: return 0.5 + } + }() + fallback.color.tint = UIColor(red: 0.60, green: 0.40, blue: 0.90, alpha: fallbackAlpha) + fallback.blending = .transparent(opacity: 1.0) mat = fallback } return (mat, selectedTex) } + /// Persisted Reactive 1 tier → updates Metal chroma halo + Chromosphere curved shell scale. + private func applySavedReactive1ReachToChromospherePipeline() { + let idx = Reactive1ChromosphereReach.clampedSavedIndex() + let scale = Reactive1ChromosphereReach.haloScale(forIndex: idx) + videoDecoder?.chromaHaloScale = scale + guard chromosphereMeshEntity != nil || headStorage.chromosphereHaloEntity != nil else { return } + replaceChromosphereMeshWithDisplayCurve(curvaturePreset.value * curveAnimationMultiplier) + } + private func updateDimmerDomesState() { - dimmerDome?.isEnabled = (dimLevel == 1) - dimmerDomePurple?.isEnabled = (dimLevel >= 2 && dimLevel <= 12) + headStorage.dimmerDome?.isEnabled = (dimLevel == 1) + headStorage.dimmerDomePurple?.isEnabled = (dimLevel >= 2 && dimLevel <= 14 && dimLevel != 2) + + // Chromosphere bloom mesh — Reactive 1 (dim 2) only (halo intensity cleared when leaving preset) + chromosphereMeshEntity?.isEnabled = (dimLevel == 2) && firstFrameReceived + updateChromosphereMesh() + + // Enable particles for Starfield (dimLevel 12) only + // Add 0.5s warmup delay to prevent initial blink + let shouldEnableParticles = (dimLevel == 12) + + if shouldEnableParticles { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.particleManager.setEnabled(true) + } + } else { + particleManager.setEnabled(false) + } } private func updateDimmerDomes(content: RealityViewContent) { - if let dome = dimmerDome { - let targetAlpha: Float = viewModel.streamSettings.dimPassthrough ? Float(dimAlphas[1]) : Float(dimAlphas[0]) - if let comp = dome.components[OpacityComponent.self], abs(comp.opacity - targetAlpha) > 0.001 { - dome.components.set(OpacityComponent(opacity: targetAlpha)) - } else if dome.components[OpacityComponent.self] == nil { - dome.components.set(OpacityComponent(opacity: targetAlpha)) + // Only update materials if dimLevel changed, in Reactive mode (needs continuous updates), + // or if the preset uses adjustable brightness (Night, Midnight, Twilight, Dawn, Sunrise, Woodland, Desert) + let isReactiveMode = (dimLevel == 10 || dimLevel == 12) + let isAdjustablePreset = [1, 5, 6, 7, 8, 9, 14].contains(dimLevel) + + if dimLevel != headStorage.lastAppliedDimLevel || isReactiveMode || isAdjustablePreset { + headStorage.lastAppliedDimLevel = dimLevel + + if let dome = headStorage.dimmerDome { + // Use user-adjustable brightness for Night mode, falling back to default + let nightBrightness = presetBrightness[1] ?? defaultPresetBrightness[1] ?? 0.82 + let targetAlpha: Float = viewModel.streamSettings.dimPassthrough ? Float(nightBrightness) : Float(dimAlphas[0]) + if let comp = dome.components[OpacityComponent.self], abs(comp.opacity - targetAlpha) > 0.001 { + dome.components.set(OpacityComponent(opacity: targetAlpha)) + } else if dome.components[OpacityComponent.self] == nil { + dome.components.set(OpacityComponent(opacity: targetAlpha)) + } + + if dome.model?.materials.isEmpty ?? true { + var blackMat = UnlitMaterial(color: .black) + blackMat.blending = .transparent(opacity: 1.0) + dome.model = ModelComponent(mesh: dome.model?.mesh ?? .generateSphere(radius: 60.0), + materials: [blackMat]) + } } - } - if let purple = dimmerDomePurple { - let (mat, _) = getDimmerMaterial() - purple.model?.materials = [mat] + if let purple = self.headStorage.dimmerDomePurple { + let (mat, _) = getDimmerMaterial() + purple.model?.materials = [mat] + } } } private func setupDimmerDomes(content: RealityViewContent) { - let dome = ModelEntity(mesh: .generateSphere(radius: 60.0), materials: [UnlitMaterial(color: .black)]) + let dome = ModelEntity(mesh: .generateSphere(radius: 60.0)) dome.scale.x = -1.0 dome.position = .zero + var blackMat = UnlitMaterial(color: .black) + blackMat.blending = .transparent(opacity: 1.0) + dome.model = ModelComponent(mesh: dome.model?.mesh ?? .generateSphere(radius: 60.0), + materials: [blackMat]) + dome.components.set(OpacityComponent(opacity: 0.0)) + dome.components.set(InputTargetComponent(allowedInputTypes: [])) content.add(dome) - self.dimmerDome = dome + self.headStorage.dimmerDome = dome - let purpleDome = ModelEntity(mesh: .generateSphere(radius: 60.0), materials: [UnlitMaterial(color: .clear)]) + let purpleDome = ModelEntity(mesh: .generateSphere(radius: 60.0)) purpleDome.scale.x = -1.0 purpleDome.position = .zero + purpleDome.components.set(InputTargetComponent(allowedInputTypes: [])) content.add(purpleDome) - self.dimmerDomePurple = purpleDome + self.headStorage.dimmerDomePurple = purpleDome updateDimmerDomesState() + + // Add particle system for Nebula preset + content.add(particleManager.rootEntity) + + // Initialize particle manager with saved star distance preset + particleManager.updateDistancePreset(starDistancePreset) Task { purpleGradientTextureColors = try? await makeGradientTexture(size: 1024, gradient: .sunset) @@ -2385,10 +5392,10 @@ struct _CurvedDisplayStreamView: View { case .eclipse: colors = [ - UIColor(red: 0.10, green: 0.08, blue: 0.15, alpha: 0.85).cgColor, - UIColor(red: 0.15, green: 0.10, blue: 0.20, alpha: 0.88).cgColor, - UIColor(red: 0.08, green: 0.05, blue: 0.12, alpha: 0.92).cgColor, - UIColor.black.withAlphaComponent(0.96).cgColor + UIColor.black.cgColor, + UIColor.black.cgColor, + UIColor.black.cgColor, + UIColor.black.cgColor ] locations = [0.0, 0.30, 0.70, 1.0] @@ -2421,21 +5428,21 @@ struct _CurvedDisplayStreamView: View { case .woodland: colors = [ - UIColor(red: 0.20, green: 0.35, blue: 0.18, alpha: 0.50).cgColor, - UIColor(red: 0.25, green: 0.40, blue: 0.20, alpha: 0.58).cgColor, - UIColor(red: 0.30, green: 0.45, blue: 0.25, alpha: 0.68).cgColor, - UIColor(red: 0.15, green: 0.25, blue: 0.12, alpha: 0.80).cgColor + UIColor(red: 0.25, green: 0.45, blue: 0.22, alpha: 0.65).cgColor, + UIColor(red: 0.18, green: 0.32, blue: 0.15, alpha: 0.75).cgColor, + UIColor(red: 0.08, green: 0.18, blue: 0.06, alpha: 0.90).cgColor, + UIColor(red: 0.04, green: 0.10, blue: 0.03, alpha: 0.98).cgColor ] - locations = [0.0, 0.35, 0.70, 1.0] + locations = [0.0, 0.30, 0.60, 1.0] case .desert: colors = [ - UIColor(red: 0.95, green: 0.80, blue: 0.50, alpha: 0.42).cgColor, - UIColor(red: 0.90, green: 0.65, blue: 0.45, alpha: 0.48).cgColor, - UIColor(red: 0.75, green: 0.50, blue: 0.40, alpha: 0.58).cgColor, - UIColor(red: 0.50, green: 0.35, blue: 0.30, alpha: 0.72).cgColor + UIColor(red: 0.95, green: 0.80, blue: 0.55, alpha: 0.60).cgColor, + UIColor(red: 0.80, green: 0.60, blue: 0.40, alpha: 0.70).cgColor, + UIColor(red: 0.35, green: 0.22, blue: 0.12, alpha: 0.90).cgColor, + UIColor(red: 0.20, green: 0.12, blue: 0.06, alpha: 0.98).cgColor ] - locations = [0.0, 0.30, 0.65, 1.0] + locations = [0.0, 0.25, 0.55, 1.0] } let colorSpace = CGColorSpaceCreateDeviceRGB() @@ -2497,10 +5504,10 @@ struct _CurvedDisplayStreamView: View { let sphere = ModelEntity(mesh: .generateSphere(radius: 60.0)) sphere.scale.x = -1.0 sphere.model = ModelComponent(mesh: sphere.model?.mesh ?? .generateSphere(radius: 60.0), - materials: [UnlitMaterial(color: .clear)]) + materials: [UnlitMaterial(color: .clear)]) sphere.isEnabled = false content.add(sphere) - environmentDome = sphere + headStorage.environmentDome = sphere if extraSkyboxTextures.isEmpty && extraSkyboxNames.isEmpty { loadExtraSkyboxesFromBundle() @@ -2508,67 +5515,73 @@ struct _CurvedDisplayStreamView: View { if environmentSphereLevel != 0, let tex = currentSkyboxTexture() { sphere.isEnabled = true applySkyboxTexture(tex) - lastEnvironmentSphereLevelApplied = environmentSphereLevel + headStorage.lastEnvironmentSphereLevelApplied = environmentSphereLevel } } func updateEnvironment360(content: RealityViewContent) { - guard let dome = environmentDome else { return } - - // Handle newset first (takes priority) - if newsetLevel > 0 { - dome.isEnabled = true - if let tex = currentNewsetTexture() { - applySkyboxTexture(tex) - } - return - } - - // Handle regular environment spheres - if environmentSphereLevel == 0 { - dome.isEnabled = false - lastEnvironmentSphereLevelApplied = 0 - return - } - - if lastEnvironmentSphereLevelApplied != environmentSphereLevel { - dome.isEnabled = true - if let tex = currentSkyboxTexture() { - applySkyboxTexture(tex) - } - lastEnvironmentSphereLevelApplied = environmentSphereLevel - } + // We handle environment updates via updateEnvironmentState() triggered by Binding changes + // to support fade animations. Automatic updates here would interfere with transitions. + } + + private func disableEnvironmentImmediately() { + environmentFadeTimer?.invalidate() + environmentFadeTimer = nil + + headStorage.lastEnvironmentSphereLevelApplied = 0 + + guard let dome = headStorage.environmentDome else { return } + dome.components.set(OpacityComponent(opacity: 0.0)) + dome.isEnabled = false } internal init(streamConfig: Binding, needsHdr: Bool, swapAction: @escaping () -> Void) { self.swapAction = swapAction self._streamConfig = streamConfig self.needsHdr = needsHdr - self.controllerSupport = ControllerSupport(config: streamConfig.wrappedValue, delegate: DummyControllerDelegate()) + // Note: controllerSupport is created in setupScene (via onAppear), not here + // Creating it in init causes excessive re-creation on every view update let bytesPerPixel = needsHdr ? 8 : 4 let data = Data(count: bytesPerPixel * Int(streamConfig.wrappedValue.width) * Int(streamConfig.wrappedValue.height)) - self.texture = try! TextureResource( - dimensions: .dimensions(width: Int(streamConfig.wrappedValue.width), height: Int(streamConfig.wrappedValue.height)), - format: .raw(pixelFormat: needsHdr ? .rgba16Float : .bgra8Unorm_srgb), - contents: .init(mipmapLevels: [.mip(data: data, bytesPerRow: bytesPerPixel * Int(streamConfig.wrappedValue.width))]) - ) - self.isHDRTexture = needsHdr + // Safe texture creation with fallback + do { + self.texture = try TextureResource( + dimensions: .dimensions(width: Int(streamConfig.wrappedValue.width), height: Int(streamConfig.wrappedValue.height)), + format: .raw(pixelFormat: needsHdr ? .rgba16Float : .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: data, bytesPerRow: bytesPerPixel * Int(streamConfig.wrappedValue.width))]) + ) + self.isHDRTexture = needsHdr + } catch { + print("⚠️ Failed to create main texture: \(error). Using fallback.") + // Fallback to minimal 1x1 texture to prevent crash + let fallbackData = Data(count: 4) + self.texture = try! TextureResource( + dimensions: .dimensions(width: 1, height: 1), + format: .raw(pixelFormat: .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: fallbackData, bytesPerRow: 4)]) + ) + self.isHDRTexture = false + } } private func recenterScreenToHead(head: AnchorEntity) { let headPos = head.position(relativeTo: nil) let current = screenPosition + // Preserve current height offset let yOffset = current.y - headPos.y + + // Calculate the ACTUAL 3D distance from head to screen (not just horizontal) + let delta = current - headPos + let actualDistance = simd_length(delta) - let horizVec = simd_float3(current.x - headPos.x, 0, current.z - headPos.z) - let horizDist = max(simd_length(horizVec), 0.01) - + // Get head's forward direction (where you're looking) let q = head.transform.rotation var headForward = q.act(simd_float3(0, 0, -1)) + // Flatten to horizontal plane (ignore vertical component) var flatForward = simd_float3(headForward.x, 0, headForward.z) let norm = simd_length(flatForward) if norm < 1e-4 { @@ -2577,10 +5590,11 @@ struct _CurvedDisplayStreamView: View { flatForward /= norm } + // Place screen dead center at the same 3D distance var newPos = simd_float3( - headPos.x + flatForward.x * horizDist, + headPos.x + flatForward.x * actualDistance, headPos.y + yOffset, - headPos.z + flatForward.z * horizDist + headPos.z + flatForward.z * actualDistance ) newPos.x = min(max(newPos.x, -allowedLateralMax), allowedLateralMax) @@ -2594,6 +5608,7 @@ struct _CurvedDisplayStreamView: View { let packed = [pos.x, pos.y, pos.z] UserDefaults.standard.set(packed, forKey: kCurvedPosKey) UserDefaults.standard.set(scale, forKey: kCurvedScaleKey) + savedTiltAngle = Double(tiltAngle) } private func restoreSavedTransform() { @@ -2602,7 +5617,7 @@ struct _CurvedDisplayStreamView: View { } let scale = UserDefaults.standard.float(forKey: kCurvedScaleKey) if scale > 0 { screenScale = scale } - tiltAngle = 0.0 + tiltAngle = Float(savedTiltAngle) } private let kCurvedLockedKey = "curved.locked" @@ -2613,7 +5628,7 @@ struct _CurvedDisplayStreamView: View { private func handleWindowClose() { isMenuOpen = false if let sceneID = self.immersiveSpaceSceneID { - AudioHelpers.fixAudioForScene(identifier: sceneID) + AudioHelpers.fixAudioForScene(identifier: sceneID, soundStageSize: soundStageSize) } else { fixAudioForCurrentMode() } @@ -2625,7 +5640,7 @@ struct _CurvedDisplayStreamView: View { self.showMenuPanel = false } if let sceneID = self.immersiveSpaceSceneID { - AudioHelpers.fixAudioForScene(identifier: sceneID) + AudioHelpers.fixAudioForScene(identifier: sceneID, soundStageSize: soundStageSize) } else { fixAudioForCurrentMode() } @@ -2643,7 +5658,7 @@ struct _CurvedDisplayStreamView: View { moonlightCycleTimer?.invalidate() lastMoonlightUpdateTime = CACurrentMediaTime() - if let purple = self.dimmerDomePurple { + if let purple = self.headStorage.dimmerDomePurple { let initial = getMoonlightCycleColor(phase: moonlightCyclePhase).withAlphaComponent(moonlightAlphaLowPower) var mat = moonlightMaterial ?? UnlitMaterial(color: initial) mat.blending = .transparent(opacity: 1.0) @@ -2653,30 +5668,33 @@ struct _CurvedDisplayStreamView: View { } moonlightCycleTimer = Timer.scheduledTimer(withTimeInterval: moonlightUpdateIntervalLowPower, repeats: true) { _ in - guard self.dimLevel == 11, let purple = self.dimmerDomePurple else { return } + guard self.dimLevel == 11, let purple = self.headStorage.dimmerDomePurple else { return } let now = CACurrentMediaTime() let dt = now - self.lastMoonlightUpdateTime - self.lastMoonlightUpdateTime = now + + DispatchQueue.main.async { + self.lastMoonlightUpdateTime = now - self.moonlightCyclePhase += CGFloat(dt) / self.moonlightCycleDurationLowPower - if self.moonlightCyclePhase >= 1.0 { self.moonlightCyclePhase -= 1.0 } + self.moonlightCyclePhase += CGFloat(dt) / self.moonlightCycleDurationLowPower + if self.moonlightCyclePhase >= 1.0 { self.moonlightCyclePhase -= 1.0 } - let nextColor = self.getMoonlightCycleColor(phase: self.moonlightCyclePhase).withAlphaComponent(self.moonlightAlphaLowPower) - let rgbVal = self.rgb(nextColor) + let nextColor = self.getMoonlightCycleColor(phase: self.moonlightCyclePhase).withAlphaComponent(self.moonlightAlphaLowPower) + let rgbVal = self.rgb(nextColor) - if self.colorDistance(rgbVal, self.lastMoonlightAppliedRGB) >= self.moonlightColorDeltaThresholdLowPower { - if var mat = self.moonlightMaterial { - mat.color.tint = nextColor - self.moonlightMaterial = mat - purple.model?.materials = [mat] - } else { - var mat = UnlitMaterial(color: nextColor) - mat.blending = .transparent(opacity: 1.0) - self.moonlightMaterial = mat - purple.model?.materials = [mat] + if self.colorDistance(rgbVal, self.lastMoonlightAppliedRGB) >= self.moonlightColorDeltaThresholdLowPower { + if var mat = self.moonlightMaterial { + mat.color.tint = nextColor + self.moonlightMaterial = mat + purple.model?.materials = [mat] + } else { + var mat = UnlitMaterial(color: nextColor) + mat.blending = .transparent(opacity: 1.0) + self.moonlightMaterial = mat + purple.model?.materials = [mat] + } + self.lastMoonlightAppliedRGB = rgbVal } - self.lastMoonlightAppliedRGB = rgbVal } } } @@ -2686,6 +5704,113 @@ struct _CurvedDisplayStreamView: View { moonlightCycleTimer = nil moonlightMaterial = nil } + + /// Resets purple reactive dome transform if a prior build left non-identity envelope state. + private func cancelReactiveSphereEnvelopeIntro(resetDomeVisuals: Bool = true) { + guard resetDomeVisuals, let purple = headStorage.dimmerDomePurple else { return } + purple.scale = SIMD3(-1, 1, 1) + purple.components.remove(OpacityComponent.self) + } + + // MARK: - Reactive Color Lerp + + private func startReactiveLerp() { + reactiveLerpTimer?.invalidate() + + // Initialize colors if starting fresh + if currentAmbientColor == .black && targetReactiveColor == .black { + let initialColor = UIColor(red: 0.1, green: 0.1, blue: 0.15, alpha: 1.0) + currentAmbientColor = initialColor + targetReactiveColor = initialColor + } + + // Run at 60fps for buttery smooth interpolation + reactiveLerpTimer = Timer.scheduledTimer(withTimeInterval: 1.0 / 60.0, repeats: true) { _ in + guard let purple = self.headStorage.dimmerDomePurple else { return } + let isReactive = (self.dimLevel == 10 || self.dimLevel == 12) + guard isReactive else { return } + + // Lerp factor: 0.15 = smooth but responsive (reaches 95% in ~0.2s) + let lerpFactor: CGFloat = 0.15 + + var currentR: CGFloat = 0, currentG: CGFloat = 0, currentB: CGFloat = 0, currentA: CGFloat = 0 + self.currentAmbientColor.getRed(¤tR, green: ¤tG, blue: ¤tB, alpha: ¤tA) + + var targetR: CGFloat = 0, targetG: CGFloat = 0, targetB: CGFloat = 0, targetA: CGFloat = 0 + self.targetReactiveColor.getRed(&targetR, green: &targetG, blue: &targetB, alpha: &targetA) + + // Linear interpolation toward center zone color + let newR = currentR + (targetR - currentR) * lerpFactor + let newG = currentG + (targetG - currentG) * lerpFactor + let newB = currentB + (targetB - currentB) * lerpFactor + + DispatchQueue.main.async { + self.currentAmbientColor = UIColor(red: newR, green: newG, blue: newB, alpha: 1.0) + } + + // Update material + let (mat, _) = self.getDimmerMaterial() + purple.model?.materials = [mat] + } + } + + private func stopReactiveLerp() { + reactiveLerpTimer?.invalidate() + reactiveLerpTimer = nil + } + + // MARK: - ChromaHalo + + private func makeChromosphereMesh(curveMagnitude: Float) throws -> MeshResource { + let haloScale = videoDecoder?.chromaHaloScale ?? 1.55 + // Match main curved panel tessellation (see `setupRealityView` screen mesh). Symmetric grid avoids + // uneven UV density vs the halo texture that made the shell read as a rectangular “LED matrix”. + let res: (UInt32, UInt32) = (256, 256) + return try generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS * haloScale, + aspectRatio: screenAspect, + resolution: res, + curveMagnitude: curveMagnitude, + cornerRadiusFraction: cornerRadiusFraction / haloScale + ) + } + + private func fallbackChromospherePlaneMesh() -> MeshResource { + let haloScale = videoDecoder?.chromaHaloScale ?? 1.55 + return MeshResource.generatePlane( + width: CURVED_MAX_WIDTH_METERS * haloScale, + height: CURVED_MAX_WIDTH_METERS * screenAspect * haloScale + ) + } + + /// Rebuild chromosphere geometry to match the display (`generateCurvedRoundedPlane` halo shell). + private func replaceChromosphereMeshWithDisplayCurve(_ curveMagnitude: Float) { + guard let haloEnt = chromosphereMeshEntity ?? headStorage.chromosphereHaloEntity, let model = haloEnt.model else { return } + let haloResource = (try? makeChromosphereMesh(curveMagnitude: curveMagnitude)) ?? fallbackChromospherePlaneMesh() + do { + try model.mesh.replace(with: haloResource.contents) + } catch { + print("⚠️ Chromosphere mesh.replace failed: \(error)") + } + applyChromosphereHaloLocalZOffset(curveMagnitude: curveMagnitude, entity: haloEnt) + } + + /// Chromosphere mesh + halo intensity — Reactive 1 (dim 2) only. + private func updateChromosphereMesh() { + guard let decoder = videoDecoder else { return } + let active = dimLevel == 2 + decoder.chromaHaloIntensity = active ? 1.0 : 0.0 + + guard let entity = chromosphereMeshEntity ?? headStorage.chromosphereHaloEntity, + let tex = chromosphereTexture else { return } + var mat = UnlitMaterial(texture: tex) + mat.blending = .transparent(opacity: 1.0) + mat.color.tint = UIColor.white.withAlphaComponent(active ? 1.0 : 0.0) + if entity.model != nil { + entity.model?.materials = [mat] + } + entity.components.set(OpacityComponent(opacity: active && firstFrameReceived ? 1.0 : 0.0)) + } // MARK: - Timers & State Changes @@ -2695,9 +5820,24 @@ struct _CurvedDisplayStreamView: View { controlsHighlighted = true hideTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in - withAnimation(.easeInOut(duration: 0.35)) { - hideControls = true - controlsHighlighted = false + DispatchQueue.main.async { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + self.collapsedMenuHideDelay) { + withAnimation(.easeInOut(duration: 0.35)) { + self.controlsExpanded = false + self.hideControls = true + self.controlsHighlighted = false + } + } + } else { + withAnimation(.easeInOut(duration: 0.35)) { + self.hideControls = true + self.controlsHighlighted = false + } + } } } } @@ -2705,9 +5845,24 @@ struct _CurvedDisplayStreamView: View { private func startHighlightTimer() { hideTimer?.invalidate() hideTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in - withAnimation(.easeInOut(duration: 0.35)) { - hideControls = true - controlsHighlighted = false + DispatchQueue.main.async { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + self.collapsedMenuHideDelay) { + withAnimation(.easeInOut(duration: 0.35)) { + self.controlsExpanded = false + self.hideControls = true + self.controlsHighlighted = false + } + } + } else { + withAnimation(.easeInOut(duration: 0.35)) { + self.hideControls = true + self.controlsHighlighted = false + } + } } } } @@ -2722,34 +5877,85 @@ struct _CurvedDisplayStreamView: View { showModeLabel = true } modeLabelTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.2)) { - showModeLabel = false + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.2)) { + self.showModeLabel = false + } } } } + /// Center toast for FILTER selection; if Reference HDR blocks preset grading, follows with a short hint. + private func presentFilterPresetCenterPopup(selectedPreset: Int32) { + presetOverlayText = presetName(for: selectedPreset) + presetOverlayIcon = "camera.filters" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + + let needsReferenceHdrOffHint = selectedPreset != 0 + && viewModel.streamSettings.enableHdr + && hdrPanelSettings.referenceHDR + + if needsReferenceHdrOffHint { + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.35, repeats: false) { _ in + DispatchQueue.main.async { + self.presetOverlayText = "DISABLE REFERENCE HDR TO USE FILTER PRESETS" + self.presetOverlayIcon = "wand.and.stars" + self.presetOverlayTimer?.invalidate() + self.presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 2.1, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + } + } + } else { + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + } + } + private func presetName(for preset: Int32) -> String { switch preset { - case 0: "Default" - case 1: "Cinematic" - case 2: "Vivid" - case 3: "Realistic" - default: "Default" + case 0: "FILTER: Default" + case 1: "FILTER: Cinematic" + case 2: "FILTER: Vi\u{200A}vid" // Hair space between I and V + case 3: "FILTER: Realistic" + default: "FILTER: Default" } } + private func curvatureText(for displayName: String) -> String { + // Hair space between R and V + return "CUR\u{200A}VATURE: \(displayName)" + } + + private func canChangePreset() -> Bool { + guard let cooldownUntil = presetCooldownUntil else { return true } + return Date() >= cooldownUntil + } + private func startStatsTimer() { statsTimer?.invalidate() statsTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in if let streamMan = self.streamMan, let stats = streamMan.getStatsOverlayText() { - self.statsOverlayText = stats + DispatchQueue.main.async { + self.statsOverlayText = stats + } } } } private func fixAudioForCurrentMode() { if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() + AudioHelpers.fixAudioForSurroundForCurrentWindow(soundStageSize: soundStageSize) } else { AudioHelpers.fixAudioForDirectStereo() } @@ -2757,112 +5963,72 @@ struct _CurvedDisplayStreamView: View { private func updateScreenInteractivity() { guard screen.parent != nil else { return } - let shouldDisableInteractions = showMenuPanel || showSwapConfirm || show3DConfirm + // Disable screen collision when menus are showing OR when in Controller mode + // Controller buttons map to system gestures which hit CollisionComponent + let shouldDisableInteractions = showMenuPanel || showSwapConfirm || show3DConfirm || showDisconnectConfirm || inputMode == .controller if shouldDisableInteractions { screen.components.remove(CollisionComponent.self) screen.components.remove(InputTargetComponent.self) } else { - screen.components.set(CollisionComponent( - shapes: [ShapeResource.generateBox( - width: CURVED_MAX_WIDTH_METERS, - height: CURVED_MAX_WIDTH_METERS * screenAspect, - depth: 0.01 - )], - filter: CollisionFilter( - group: .screenEntity, - mask: .all - ) - )) + // Generate curved collision mesh for accurate gaze hit detection + if let collisionMesh = try? generateCurvedRoundedPlane( + width: CURVED_MAX_WIDTH_METERS, + aspectRatio: screenAspect, + resolution: (64, 64), + curveMagnitude: curvaturePreset.value * curveAnimationMultiplier, + cornerRadiusFraction: 0 + ) { + Task { + if let collisionShape = try? await ShapeResource.generateStaticMesh(from: collisionMesh) { + await MainActor.run { + screen.components.set(CollisionComponent( + shapes: [collisionShape], + filter: CollisionFilter( + group: .screenEntity, + mask: .all + ) + )) + } + } + } + } screen.components.set(InputTargetComponent(allowedInputTypes: .all)) } } // MARK: - Preload Skyboxes private func loadExtraSkyboxesFromBundle() { - let exts = ["jpg", "jpeg", "png"] - let builtinSet = Set(builtinSkyboxNames + ["AboveClouds", "Above_Clouds"]) - var names: [String] = [] - var textures: [TextureResource] = [] - - for ext in exts { - if let urls = Bundle.main.urls(forResourcesWithExtension: ext, subdirectory: "Skyboxes") { - for url in urls { - let base = url.deletingPathExtension().lastPathComponent - if builtinSet.contains(base) { continue } - if names.contains(base) { continue } - do { - let tex = try TextureResource.load(contentsOf: url) - names.append(base) - textures.append(tex) - } catch { - print("[Texture] Error loading \(base).\(ext): \(error)") + // Load skyboxes on background thread to avoid blocking main thread during view setup + Task.detached(priority: .background) { + let exts = ["jpg", "jpeg", "png"] + let builtinSet = Set(SkyboxCatalog.builtinNames + ["AboveClouds", "Above_Clouds"]) + var names: [String] = [] + var textures: [TextureResource] = [] + + for ext in exts { + if let urls = Bundle.main.urls(forResourcesWithExtension: ext, subdirectory: "Skyboxes") { + for url in urls { + let base = url.deletingPathExtension().lastPathComponent + if builtinSet.contains(base) { continue } + if names.contains(base) { continue } + do { + let tex = try TextureResource.load(contentsOf: url) + names.append(base) + textures.append(tex) + } catch { + print("[Texture] Error loading \(base).\(ext): \(error)") + } } } } - } - extraSkyboxNames = names - extraSkyboxTextures = textures - } -} - -struct CenterPresetPopup: View { - var text: String - var icon: String - - var body: some View { - let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) - let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) - let babyBlue = Color(red: 0.72, green: 0.85, blue: 1.0) - let radius: CGFloat = 24 - - HStack(spacing: 12) { - Spacer() - // 1. Icon - ZStack { - Circle() - .fill( - LinearGradient( - colors: [brandOrange, brandOrange.opacity(0.85)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ) - ) - .frame(width: 83, height: 83) - .shadow(color: brandOrange.opacity(0.5), radius: 12, x: 0, y: 8) - Image(systemName: icon) - .font(.system(size: 34, weight: .bold)) - .foregroundStyle(.white) - } - // 2. Text - Text(text.uppercased()) - .font(.custom("Fredoka-SemiBold", size: 50)) - .tracking(1.2) - .foregroundColor(.white) - .lineLimit(1) - .minimumScaleFactor(0.85) - Spacer() + // Update state on main thread once loading is complete + await MainActor.run { + self.extraSkyboxNames = names + self.extraSkyboxTextures = textures + print("[Skybox] Loaded \(names.count) extra skyboxes in background") + } } - .frame(width: 713, height: 132) - .padding(.horizontal, 24) - .padding(.vertical, 16) - .background( - RoundedRectangle(cornerRadius: radius, style: .continuous) - .fill(brandNavy.opacity(0.92)) - .overlay( - RoundedRectangle(cornerRadius: radius, style: .continuous) - .stroke( - LinearGradient( - colors: [.white.opacity(0.2), .white.opacity(0.05)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ), - lineWidth: 1 - ) - ) - ) - .shadow(color: .black.opacity(0.25), radius: 30, x: 0, y: 16) - .allowsHitTesting(false) } } @@ -2874,22 +6040,3 @@ extension Notification.Name { static let rkStreamDidTeardown = Notification.Name("RKStreamDidTeardown") static let curvedScreenWakeRequested = Notification.Name("CurvedScreenWakeRequested") } - -// MARK: - Center Preset Popup - -struct ConditionalGlass: ViewModifier { - let enabled: Bool - func body(content: Content) -> some View { - if enabled { - content.glassBackgroundEffect() - } else { - content - } - } -} - -extension View { - func conditionalGlass(_ enabled: Bool) -> some View { - self.modifier(ConditionalGlass(enabled: enabled)) - } -} \ No newline at end of file diff --git a/Moonlight Vision/CurvedDisplayTutorialView.swift b/Moonlight Vision/CurvedDisplayTutorialView.swift index 620a519e9..738a67e3c 100644 --- a/Moonlight Vision/CurvedDisplayTutorialView.swift +++ b/Moonlight Vision/CurvedDisplayTutorialView.swift @@ -1,8 +1,8 @@ // // CurvedDisplayTutorialView.swift -// NeoMoonlight - First-Time Tutorial for Curved Display +// Neo Moonlight // -// Premium polished tutorial matching navy + orange theme +// // import SwiftUI @@ -22,25 +22,40 @@ struct CurvedDisplayTutorialView: View { title: "Center the Screen", description: "Hold the Digital Crown to recenter the screen directly in front of you." ), + ( + icon: "gamecontroller.fill", + title: "Control Modes", + description: "Switch between Gaze Control, Screen Adjust, and Controller Mode using the toggle in top controls. Enable Controller Mode for gamepads connected directly to Vision Pro Bluetooth." + ), ( icon: "arrow.up.left.and.arrow.down.right", - title: "Resize with Pinch", - description: "Pinch with both fingers inwards and outwards to adjust screen size." + title: "Screen Adjust", + description: "Enable Screen Adjust Mode to unlock the screen. Pinch and drag to reposition. Pinch with both fingers inwards and outwards to change the scale." ), ( icon: "hand.point.up.left.fill", title: "Reveal & Unlock Controls", - description: "Icons auto-hide. Tap the top icons to reveal them. When highlighted, pinch-hold to move the screen to your preferred position." + description: "Icons auto-hide. Tap any icon to reveal the controls and interact with them." + ), + ( + icon: "hand.tap.fill", + title: "Long Press to Reset", + description: "Long Press (Pinch & Hold) on Tilt, Dimming, and Environment icons to quickly reset to default state." ), ( icon: "eye.slash.fill", title: "App Visibility", - description: "In Curved Display mode, external apps and system windows aren't visible. Switch to Standard Display if you need to use other apps." + description: "In Curved Display mode, external apps and system windows aren't visible. Switch to Flat Display if you need to use other apps." + ), + ( + icon: "person.2.fill", + title: "Couch Co-op Mode", + description: "Play couch co-op games with a friend via SharePlay. This is an experimental feature, so bear with any quirks or bugs you may encounter." ), ( icon: "mountain.2.fill", title: "Apple Environments", - description: "Choose an Apple environment first, connect to immersive mode, then rotate the Digital Crown to reveal and enjoy the scene." + description: "Select your preferred Apple environment. Connect to Curved Display, then rotate the digital crown to reveal the environment." ) ] diff --git a/Moonlight Vision/DataCatalog.swift b/Moonlight Vision/DataCatalog.swift new file mode 100644 index 000000000..766ccf93d --- /dev/null +++ b/Moonlight Vision/DataCatalog.swift @@ -0,0 +1,94 @@ +import Foundation + +struct SkyboxCatalog { + static let builtinNames: [String] = [ + "2", "13", "15", "23", "i", "11", "5", "16", + "22", "f", "a", "25", "17", "d", "t", "21", "8", "7", "1", + "26", "3", "cobblestone1", "outpost", + "street1", "santorini1", "terrace1" + ] + + static let rotations: [String: Float] = [ + "3": Float(530.0 * .pi / 180.0), + "5": -2.478, + "8": Float(115.0 * .pi / 180.0), + "11": 0.175, + "15": -0.105, + "16": Float(-50.0 * .pi / 180.0), + "17": 1.867, + "21": -1.921, + "23": -2.007, + "26": -0.524, + "a": Float(150.0 * .pi / 180.0), + "b": Float(145.0 * .pi / 180.0), + "c": Float(125.0 * .pi / 180.0), + "d": Float(-280.0 * .pi / 180.0), + "f": Float(5.0 * .pi / 180.0), + "i": Float(-90.0 * .pi / 180.0), + "w": Float(-160.0 * .pi / 180.0), + "y": Float(-15.0 * .pi / 180.0), + "cobblestone1": Float(156.0 * .pi / 180.0), + "outpost": Float(-8.0 * .pi / 180.0), + "street1": Float(175.0 * .pi / 180.0), + "santorini1": Float(280.0 * .pi / 180.0), + "terrace1": Float(28.0 * .pi / 180.0) + ] + + static let displayNames: [String: String] = [ + "1": "Loft", + "2": "Moonlight", + "3": "Full Moon", + "5": "Moondaze", + "7": "Trackday", + "8": "Atlantis", + "11": "Inked", + "13": "Jungle", + "15": "Monolith", + "16": "Meadow", + "17": "Fireflies", + "21": "Reach", + "22": "Mistfire", + "23": "Apocalypse", + "25": "Rubble", + "26": "Zenith", + "a": "Metro", + "b": "Stalked", + "c": "Stalked", + "d": "Stalked", + "f": "Foundry", + "i": "Station", + "t": "Moonrise", + "w": "NeoCity", + "x": "Arc", + "y": "Arc", + "cobblestone1": "Cobblestone", + "outpost": "Arc", + "street1": "Oasis", + "santorini1": "Realm", + "terrace1": "Nexus" + ] + + static let newsetNames: [String] = [ + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", + "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", + "u", "v", "w", "x", "y", "z" + ] + + static let newsetRotations: [String: Float] = [ + "a": Float(150.0 * .pi / 180.0), + "b": Float(180.0 * .pi / 180.0), + "c": Float(15.0 * .pi / 180.0), + "d": Float(-160.0 * .pi / 180.0), + "e": Float(-90.0 * .pi / 180.0), + "f": Float(5.0 * .pi / 180.0), + "g": Float(-100.0 * .pi / 180.0), + "h": Float(-100.0 * .pi / 180.0), + "i": Float(-90.0 * .pi / 180.0), + "j": Float(-10.0 * .pi / 180.0), + "k": Float(115.0 * .pi / 180.0), + "l": Float(-50.0 * .pi / 180.0), + "n": Float(30.0 * .pi / 180.0), + "u": Float(180.0 * .pi / 180.0), + "z": Float(20.0 * .pi / 180.0) + ] +} diff --git a/Moonlight Vision/DebugLogger.swift b/Moonlight Vision/DebugLogger.swift new file mode 100644 index 000000000..b5d667061 --- /dev/null +++ b/Moonlight Vision/DebugLogger.swift @@ -0,0 +1,83 @@ +// +// DebugLogger.swift +// Moonlight Vision +// +// +// + +import Foundation + +#if DEBUG + +/// +/// Logs survive app crashes and can be retrieved via Xcode's Devices window. +class DebugLogger { + static let shared = DebugLogger() + + private let fileURL: URL + private let queue = DispatchQueue(label: "com.neovectorx.debuglogger", qos: .utility) + private let dateFormatter: DateFormatter + + private init() { + let docs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + fileURL = docs.appendingPathComponent("debug_log.txt") + + dateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH:mm:ss.SSS" + + // Clear old log on app launch + try? FileManager.default.removeItem(at: fileURL) + + // Write header + let header = "=== Debug Log Started: \(Date()) ===\n" + try? header.write(to: fileURL, atomically: true, encoding: .utf8) + } + + /// Log a message with automatic timestamp + func log(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { + let timestamp = dateFormatter.string(from: Date()) + let fileName = (file as NSString).lastPathComponent.replacingOccurrences(of: ".swift", with: "") + let entry = "[\(timestamp)] [\(fileName):\(line)] \(message)\n" + + // Write asynchronously to avoid blocking main thread + queue.async { + if let data = entry.data(using: .utf8) { + if let handle = try? FileHandle(forWritingTo: self.fileURL) { + handle.seekToEndOfFile() + handle.write(data) + handle.closeFile() + } else { + try? data.write(to: self.fileURL) + } + } + } + + // Also print for when debugger IS attached (on your device) + print(entry, terminator: "") + } + + /// Get the file URL for manual retrieval + func getLogFileURL() -> URL { + return fileURL + } + + /// Read all logs (for in-app display if needed) + func readLogs() -> String { + return (try? String(contentsOf: fileURL, encoding: .utf8)) ?? "No logs available" + } +} + +/// Convenience global function for debug logging +func debugLog(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { + DebugLogger.shared.log(message, file: file, function: function, line: line) +} + +#else + +/// No-op in release builds - completely stripped by compiler +@inline(__always) +func debugLog(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { + // Does nothing in release builds +} + +#endif diff --git a/Moonlight Vision/DimmingPickerView.swift b/Moonlight Vision/DimmingPickerView.swift new file mode 100644 index 000000000..0ffa03ae6 --- /dev/null +++ b/Moonlight Vision/DimmingPickerView.swift @@ -0,0 +1,761 @@ +// +// DimmingPickerView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// + +import SwiftUI + +/// Baseline sizing for the lighting preset sheet; multiply with ``pt(_:)`` for uniform layout/fonts. +private enum DimmingPickerMetrics { + /// 30% smaller than original design (`1 − 0.30`). + static let scale: CGFloat = 0.7 + static func pt(_ base: CGFloat) -> CGFloat { base * scale } +} + +struct DimmingPickerView: View { + @Binding var dimLevel: Int + @Binding var isPresented: Bool + @Binding var environmentSphereLevel: Int + @Binding var newsetLevel: Int + @Binding var presetBrightness: [Int: Double] + let defaultPresetBrightness: [Int: Double] + /// Starfield: each tap selects preset and advances star distance one step (curved display only). + var onStarfieldTapCycle: (() -> Void)? = nil + /// Reactive 1 (Chromosphere): each tap expands glow size / reach (curved display only). + var onReactive1TapCycle: (() -> Void)? = nil + + // Dimming preset items + struct DimItem: Identifiable { + let id: String + let displayName: String + let dimLevel: Int + let supportsAdjustment: Bool + } + + // Presets that support brightness adjustment via long-press + private let adjustablePresets: Set = [1, 5, 6, 7, 8, 9, 14] + + private var allItems: [DimItem] { + [ + DimItem(id: "0", displayName: "Off", dimLevel: 0, supportsAdjustment: false), + DimItem(id: "1", displayName: "Night", dimLevel: 1, supportsAdjustment: true), + DimItem(id: "2", displayName: "Reactive 1", dimLevel: 2, supportsAdjustment: false), + DimItem(id: "10", displayName: "Reactive 2", dimLevel: 10, supportsAdjustment: false), + DimItem(id: "12", displayName: "Starfield", dimLevel: 12, supportsAdjustment: false), + DimItem(id: "4", displayName: "Eclipse", dimLevel: 4, supportsAdjustment: false), + DimItem(id: "5", displayName: "Midnight", dimLevel: 5, supportsAdjustment: true), + DimItem(id: "6", displayName: "Twilight", dimLevel: 6, supportsAdjustment: true), + DimItem(id: "7", displayName: "Dawn", dimLevel: 7, supportsAdjustment: true), + DimItem(id: "8", displayName: "Sunrise", dimLevel: 8, supportsAdjustment: true), + DimItem(id: "9", displayName: "Woodland", dimLevel: 9, supportsAdjustment: true), + DimItem(id: "14", displayName: "Desert", dimLevel: 14, supportsAdjustment: true) + ] + } + + // Theme Colors + private let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + private let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + + // State for tracking which preset is currently being adjusted + @State private var cyclingPresetLevel: Int? = nil + + var body: some View { + VStack(spacing: DimmingPickerMetrics.pt(20)) { + // Header + HStack { + Text("Select Lighting Preset") + .font(.system(size: DimmingPickerMetrics.pt(24), weight: .bold)) + .foregroundColor(.white) + + Spacer() + + Button { + withAnimation { isPresented = false } + } label: { + Image(systemName: "xmark.circle.fill") + .font(.system(size: DimmingPickerMetrics.pt(32))) + .foregroundColor(.white.opacity(0.8)) + } + .buttonStyle(.plain) + } + .padding(.horizontal, DimmingPickerMetrics.pt(8)) + + // Grid (6 columns × 2 rows) + LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 6), spacing: DimmingPickerMetrics.pt(20)) { + ForEach(allItems) { item in + if item.supportsAdjustment { + // Adjustable preset with long-press for brightness cycling + AdjustableDimItemView( + item: item, + dimLevel: $dimLevel, + presetBrightness: $presetBrightness, + cyclingPresetLevel: $cyclingPresetLevel, + defaultPresetBrightness: defaultPresetBrightness, + isSelected: isSelected(item), + brandOrange: brandOrange, + isPickerOpen: isPresented, + onSelect: { selectItem(item) } + ) + } else if item.dimLevel == 2, onReactive1TapCycle != nil { + // Reactive 1 — each tap selects preset and advances chromosphere reach one tier (curved). + Button { + selectItem(item) + onReactive1TapCycle?() + } label: { + VStack(spacing: DimmingPickerMetrics.pt(8)) { + DimmingThumbnailView( + displayName: item.displayName, + dimLevel: item.dimLevel, + isPickerOpen: isPresented, + brightness: nil, + isCycling: false + ) + .frame(height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + .overlay( + Circle() + .stroke(isSelected(item) ? brandOrange : Color.white.opacity(0.2), lineWidth: isSelected(item) ? DimmingPickerMetrics.pt(3) : DimmingPickerMetrics.pt(1)) + ) + + HStack(spacing: DimmingPickerMetrics.pt(3)) { + Text(item.displayName) + .font(.system(size: DimmingPickerMetrics.pt(14), weight: .medium)) + .foregroundColor(isSelected(item) ? brandOrange : .white) + .lineLimit(1) + Image(systemName: "rays") + .font(.system(size: DimmingPickerMetrics.pt(9))) + .foregroundColor(isSelected(item) ? brandOrange.opacity(0.7) : .white.opacity(0.5)) + } + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } else if item.dimLevel == 10 { + // Reactive 2 — legacy translucent tinted dome (0.85α, transparent blend), no Chromaglow; curated toolbar readability. + Button { + selectItem(item) + } label: { + VStack(spacing: DimmingPickerMetrics.pt(8)) { + DimmingThumbnailView( + displayName: item.displayName, + dimLevel: item.dimLevel, + isPickerOpen: isPresented, + brightness: nil, + isCycling: false + ) + .frame(height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + .overlay( + Circle() + .stroke(isSelected(item) ? brandOrange : Color.white.opacity(0.2), lineWidth: isSelected(item) ? DimmingPickerMetrics.pt(3) : DimmingPickerMetrics.pt(1)) + ) + + Text(item.displayName) + .font(.system(size: DimmingPickerMetrics.pt(14), weight: .medium)) + .foregroundColor(isSelected(item) ? brandOrange : .white) + .lineLimit(1) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } else if item.dimLevel == 12, onStarfieldTapCycle != nil { + // Starfield — each tap selects preset and advances star distance one step (curved). + Button { + selectItem(item) + onStarfieldTapCycle?() + } label: { + VStack(spacing: DimmingPickerMetrics.pt(8)) { + DimmingThumbnailView( + displayName: item.displayName, + dimLevel: item.dimLevel, + isPickerOpen: isPresented, + brightness: nil, + isCycling: false + ) + .frame(height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + .overlay( + Circle() + .stroke(isSelected(item) ? brandOrange : Color.white.opacity(0.2), lineWidth: isSelected(item) ? DimmingPickerMetrics.pt(3) : DimmingPickerMetrics.pt(1)) + ) + + HStack(spacing: DimmingPickerMetrics.pt(3)) { + Text(item.displayName) + .font(.system(size: DimmingPickerMetrics.pt(14), weight: .medium)) + .foregroundColor(isSelected(item) ? brandOrange : .white) + .lineLimit(1) + Image(systemName: "lightbulb.circle") + .font(.system(size: DimmingPickerMetrics.pt(9))) + .foregroundColor(isSelected(item) ? brandOrange.opacity(0.7) : .white.opacity(0.5)) + } + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } else { + // Non-adjustable preset (tap only) + Button { + selectItem(item) + } label: { + VStack(spacing: DimmingPickerMetrics.pt(8)) { + DimmingThumbnailView( + displayName: item.displayName, + dimLevel: item.dimLevel, + isPickerOpen: isPresented, + brightness: nil, + isCycling: false + ) + .frame(height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + .overlay( + Circle() + .stroke(isSelected(item) ? brandOrange : Color.white.opacity(0.2), lineWidth: isSelected(item) ? DimmingPickerMetrics.pt(3) : DimmingPickerMetrics.pt(1)) + ) + + Text(item.displayName) + .font(.system(size: DimmingPickerMetrics.pt(14), weight: .medium)) + .foregroundColor(isSelected(item) ? brandOrange : .white) + .lineLimit(1) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } + } + } + .frame(minHeight: DimmingPickerMetrics.pt(220)) + + // Hint for adjustable presets (top-align icon with first line when text wraps) + HStack(alignment: .top, spacing: DimmingPickerMetrics.pt(8)) { + Image(systemName: "lightbulb.circle") + .font(.system(size: DimmingPickerMetrics.pt(11))) + .foregroundColor(.white.opacity(0.5)) + .padding(.top, DimmingPickerMetrics.pt(1.5)) + Text("Long press on dimmable presets adjusts brightness. Tap Reactive 1 to expand glow size. Tap Starfield to cycle star distance.") + .font(.system(size: DimmingPickerMetrics.pt(11))) + .foregroundColor(.white.opacity(0.5)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.top, DimmingPickerMetrics.pt(4)) + } + .padding(DimmingPickerMetrics.pt(32)) + .background( + RoundedRectangle(cornerRadius: DimmingPickerMetrics.pt(24), style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: DimmingPickerMetrics.pt(20), x: 0, y: DimmingPickerMetrics.pt(10)) + ) + .overlay( + RoundedRectangle(cornerRadius: DimmingPickerMetrics.pt(24), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: DimmingPickerMetrics.pt(1.5) + ) + ) + .frame(width: DimmingPickerMetrics.pt(700)) + } + + private func isSelected(_ item: DimItem) -> Bool { + return dimLevel == item.dimLevel + } + + private func selectItem(_ item: DimItem) { + dimLevel = item.dimLevel + + // Reset environment when selecting a dimming preset (they're mutually exclusive) + if item.dimLevel != 0 { + environmentSphereLevel = 0 + newsetLevel = 0 + } + } +} + +// MARK: - Adjustable Dim Item View (supports long-press brightness cycling) + +private struct AdjustableDimItemView: View { + let item: DimmingPickerView.DimItem + @Binding var dimLevel: Int + @Binding var presetBrightness: [Int: Double] + @Binding var cyclingPresetLevel: Int? + let defaultPresetBrightness: [Int: Double] + let isSelected: Bool + let brandOrange: Color + let isPickerOpen: Bool + let onSelect: () -> Void + + @State private var cycleTask: Task? = nil + @State private var cycleStartTime: Date? = nil + + private var currentBrightness: Double { + presetBrightness[item.dimLevel] ?? defaultPresetBrightness[item.dimLevel] ?? 0.85 + } + + private var isCycling: Bool { + cyclingPresetLevel == item.dimLevel + } + + var body: some View { + Button { + if !isCycling { + onSelect() + } + } label: { + VStack(spacing: DimmingPickerMetrics.pt(8)) { + DimmingThumbnailView( + displayName: item.displayName, + dimLevel: item.dimLevel, + isPickerOpen: isPickerOpen, + brightness: currentBrightness, + isCycling: isCycling + ) + .frame(height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + .overlay( + Circle() + .stroke(isSelected ? brandOrange : Color.white.opacity(0.2), lineWidth: isSelected ? DimmingPickerMetrics.pt(3) : DimmingPickerMetrics.pt(1)) + ) + // Glow effect during cycling + .shadow(color: .white.opacity(isCycling ? currentBrightness * 0.8 : 0.0), radius: isCycling ? DimmingPickerMetrics.pt(12) : 0) + .shadow(color: .white.opacity(isCycling ? currentBrightness * 0.4 : 0.0), radius: isCycling ? DimmingPickerMetrics.pt(24) : 0) + .animation(.easeInOut(duration: 0.15), value: currentBrightness) + .animation(.easeOut(duration: 0.4), value: isCycling) + + HStack(spacing: DimmingPickerMetrics.pt(3)) { + Text(item.displayName) + .font(.system(size: DimmingPickerMetrics.pt(14), weight: .medium)) + .foregroundColor(isSelected ? brandOrange : .white) + .lineLimit(1) + + Image(systemName: "lightbulb.circle") + .font(.system(size: DimmingPickerMetrics.pt(9))) + .foregroundColor(isSelected ? brandOrange.opacity(0.7) : .white.opacity(0.5)) + } + } + .contentShape(Rectangle()) + } + .buttonStyle(HoldablePlainButtonStyle( + onHold: { startBrightnessCycle() }, + onRelease: { + if isCycling { + stopBrightnessCycle() + } + } + )) + .onDisappear { + cycleTask?.cancel() + cycleTask = nil + } + } + + private func startBrightnessCycle() { + // First, select this preset + onSelect() + + cyclingPresetLevel = item.dimLevel + cycleStartTime = Date() + + cycleTask?.cancel() + cycleTask = Task { + let cycleDuration: Double = 5.0 // seconds for full dark→light→dark + + while !Task.isCancelled { + let elapsed = Date().timeIntervalSince(cycleStartTime ?? Date()) + // Sine wave: 0.5 + 0.5 * sin(...) gives range 0.0 to 1.0 + let brightness = 0.5 + 0.5 * sin(elapsed * 2.0 * .pi / cycleDuration) + + await MainActor.run { + presetBrightness[item.dimLevel] = brightness + // Save to UserDefaults as we cycle (will save final value on release too) + UserDefaults.standard.set(brightness, forKey: "preset.brightness.\(item.dimLevel)") + } + + try? await Task.sleep(nanoseconds: 50_000_000) // 50ms updates (20 FPS) + } + } + } + + private func stopBrightnessCycle() { + cycleTask?.cancel() + cycleTask = nil + cycleStartTime = nil + + // Save the final brightness value + let finalBrightness = presetBrightness[item.dimLevel] ?? defaultPresetBrightness[item.dimLevel] ?? 0.85 + UserDefaults.standard.set(finalBrightness, forKey: "preset.brightness.\(item.dimLevel)") + + withAnimation(.easeOut(duration: 0.4)) { + cyclingPresetLevel = nil + } + } +} + +private struct DimmingThumbnailView: View { + let displayName: String + let dimLevel: Int + let isPickerOpen: Bool + let brightness: Double? // User-adjustable brightness for applicable presets + let isCycling: Bool // Whether brightness is currently being cycled via long-press + + @State private var animationPhase: Double = 0 + @State private var animationTask: Task? + + var body: some View { + Group { + if dimLevel == 12, let _ = UIImage(named: "starfield") { + // Use custom image for Starfield preset + Image("starfield") + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: DimmingPickerMetrics.pt(80), height: DimmingPickerMetrics.pt(80)) + .clipShape(Circle()) + } else { + // Use gradient for all other presets + Circle() + .fill(gradientForPreset()) + .frame(width: DimmingPickerMetrics.pt(80), height: DimmingPickerMetrics.pt(80)) + // Apply brightness to thumbnail opacity for adjustable presets + .opacity(thumbnailOpacity) + .overlay( + Group { + if dimLevel == 0 { + Image(systemName: "slash.circle") + .font(.system(size: DimmingPickerMetrics.pt(40))) + .foregroundColor(.white.opacity(0.8)) + } + } + ) + } + } + .onChange(of: isPickerOpen) { _, isOpen in + // Cancel existing animation when picker closes + if !isOpen { + animationTask?.cancel() + animationTask = nil + animationPhase = 0 + } else if dimLevel == 2 || dimLevel == 10 || dimLevel == 12 { + // Start animation when picker opens (Reactive V1, V2, and Starfield) + startAnimation() + } + } + .onAppear { + if isPickerOpen && (dimLevel == 2 || dimLevel == 10 || dimLevel == 12) { + startAnimation() + } + } + .onDisappear { + animationTask?.cancel() + animationTask = nil + } + } + + private var thumbnailOpacity: Double { + // For adjustable presets during cycling, mirror the brightness value + if let brightness = brightness { + // Scale brightness to a visible opacity range (0.3 to 1.0) so it's never invisible + return 0.3 + (brightness * 0.7) + } + // Default opacities for non-adjustable presets + return dimLevel == 2 ? 0.8 : 1.0 + } + + private func startAnimation() { + animationTask?.cancel() + animationTask = Task { + while !Task.isCancelled { + try? await Task.sleep(nanoseconds: 150_000_000) // 150ms updates (much slower, less CPU) + if !Task.isCancelled { + animationPhase += 0.015 // Slightly larger steps to compensate + if animationPhase >= 1.0 { + animationPhase = 0 + } + } + } + } + } + + private func gradientForPreset() -> LinearGradient { + switch dimLevel { + case 0: // Off + return LinearGradient( + colors: [Color.gray.opacity(0.3), Color.gray.opacity(0.2)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 1: // Night + return LinearGradient( + colors: [Color.black, Color(white: 0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 2: // Reactive - Animated color cycling + // Cycle through distinct colors based on animation phase + let progress = animationPhase + let color1: Color + let color2: Color + let color3: Color + + // Smooth color transitions through spectrum + if progress < 0.2 { + // Purple to Blue + let t = progress / 0.2 + color1 = Color(red: 0.5 - 0.2 * t, green: 0.0 + 0.3 * t, blue: 0.8 + 0.2 * t) + color2 = Color(red: 0.3 - 0.1 * t, green: 0.0 + 0.5 * t, blue: 0.9 + 0.1 * t) + color3 = Color(red: 0.6 - 0.3 * t, green: 0.1 + 0.4 * t, blue: 0.7 + 0.2 * t) + } else if progress < 0.4 { + // Blue to Cyan + let t = (progress - 0.2) / 0.2 + color1 = Color(red: 0.3 - 0.3 * t, green: 0.3 + 0.4 * t, blue: 1.0) + color2 = Color(red: 0.2 - 0.2 * t, green: 0.5 + 0.3 * t, blue: 1.0) + color3 = Color(red: 0.3 - 0.3 * t, green: 0.5 + 0.3 * t, blue: 0.9 + 0.1 * t) + } else if progress < 0.6 { + // Cyan to Green + let t = (progress - 0.4) / 0.2 + color1 = Color(red: 0.0, green: 0.7 + 0.2 * t, blue: 1.0 - 0.3 * t) + color2 = Color(red: 0.0, green: 0.8 + 0.1 * t, blue: 0.8 - 0.4 * t) + color3 = Color(red: 0.0 + 0.2 * t, green: 0.8 + 0.1 * t, blue: 1.0 - 0.5 * t) + } else if progress < 0.8 { + // Green to Yellow/Orange + let t = (progress - 0.6) / 0.2 + color1 = Color(red: 0.0 + 0.9 * t, green: 0.9, blue: 0.7 - 0.5 * t) + color2 = Color(red: 0.0 + 1.0 * t, green: 0.9 - 0.2 * t, blue: 0.4 - 0.4 * t) + color3 = Color(red: 0.2 + 0.6 * t, green: 0.9 - 0.1 * t, blue: 0.5 - 0.3 * t) + } else { + // Orange to Purple (completing cycle) + let t = (progress - 0.8) / 0.2 + color1 = Color(red: 0.9 - 0.4 * t, green: 0.7 - 0.7 * t, blue: 0.2 + 0.6 * t) + color2 = Color(red: 1.0 - 0.7 * t, green: 0.7 - 0.7 * t, blue: 0.0 + 0.9 * t) + color3 = Color(red: 0.8 - 0.2 * t, green: 0.8 - 0.7 * t, blue: 0.2 + 0.5 * t) + } + + return LinearGradient( + colors: [color1, color2, color3], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 4: // Eclipse + return LinearGradient( + colors: [ + Color.black, + Color.black + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 5: // Midnight + return LinearGradient( + colors: [ + Color(red: 0.4, green: 0.2, blue: 0.6), + Color.black + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 6: // Twilight + return LinearGradient( + colors: [ + Color(red: 0.25, green: 0.20, blue: 0.40), + Color(red: 0.40, green: 0.25, blue: 0.50), + Color(red: 0.20, green: 0.15, blue: 0.30), + Color(red: 0.05, green: 0.03, blue: 0.10) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 7: // Dawn + return LinearGradient( + colors: [ + Color(red: 0.95, green: 0.75, blue: 0.55), + Color(red: 0.90, green: 0.60, blue: 0.70), + Color(red: 0.60, green: 0.45, blue: 0.75), + Color(red: 0.30, green: 0.25, blue: 0.45) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 8: // Sunrise + return LinearGradient( + colors: [ + Color(red: 1.0, green: 0.85, blue: 0.40), + Color(red: 0.98, green: 0.70, blue: 0.50), + Color(red: 0.90, green: 0.50, blue: 0.60), + Color(red: 0.70, green: 0.40, blue: 0.70) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 9: // Woodland + return LinearGradient( + colors: [ + Color(red: 0.25, green: 0.45, blue: 0.22), + Color(red: 0.18, green: 0.32, blue: 0.15), + Color(red: 0.08, green: 0.18, blue: 0.06), + Color(red: 0.04, green: 0.10, blue: 0.03) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 11: // Desert - Original tan to brown gradient + return LinearGradient( + colors: [ + Color(red: 0.95, green: 0.80, blue: 0.50), + Color(red: 0.90, green: 0.65, blue: 0.45), + Color(red: 0.75, green: 0.50, blue: 0.40), + Color(red: 0.50, green: 0.35, blue: 0.30) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 14: // Desert - Original tan to brown gradient + return LinearGradient( + colors: [ + Color(red: 0.95, green: 0.80, blue: 0.50), + Color(red: 0.90, green: 0.65, blue: 0.45), + Color(red: 0.75, green: 0.50, blue: 0.40), + Color(red: 0.50, green: 0.35, blue: 0.30) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 10: // Reactive V2 - Offset color cycle (starts at Cyan instead of Purple) + // Cycle through distinct colors based on animation phase + // Offset by 0.4 (40%) to start at Cyan instead of Purple + let progress = fmod(animationPhase + 0.4, 1.0) + let color1: Color + let color2: Color + let color3: Color + + // Smooth color transitions through spectrum (offset from V1) + if progress < 0.2 { + // Purple to Blue + let t = progress / 0.2 + color1 = Color(red: 0.5 - 0.2 * t, green: 0.0 + 0.3 * t, blue: 0.8 + 0.2 * t) + color2 = Color(red: 0.3 - 0.1 * t, green: 0.0 + 0.5 * t, blue: 0.9 + 0.1 * t) + color3 = Color(red: 0.6 - 0.3 * t, green: 0.1 + 0.4 * t, blue: 0.7 + 0.2 * t) + } else if progress < 0.4 { + // Blue to Cyan + let t = (progress - 0.2) / 0.2 + color1 = Color(red: 0.3 - 0.3 * t, green: 0.3 + 0.4 * t, blue: 1.0) + color2 = Color(red: 0.2 - 0.2 * t, green: 0.5 + 0.3 * t, blue: 1.0) + color3 = Color(red: 0.3 - 0.3 * t, green: 0.5 + 0.3 * t, blue: 0.9 + 0.1 * t) + } else if progress < 0.6 { + // Cyan to Green + let t = (progress - 0.4) / 0.2 + color1 = Color(red: 0.0, green: 0.7 + 0.2 * t, blue: 1.0 - 0.3 * t) + color2 = Color(red: 0.0, green: 0.8 + 0.1 * t, blue: 0.8 - 0.4 * t) + color3 = Color(red: 0.0 + 0.2 * t, green: 0.8 + 0.1 * t, blue: 1.0 - 0.5 * t) + } else if progress < 0.8 { + // Green to Yellow/Orange + let t = (progress - 0.6) / 0.2 + color1 = Color(red: 0.0 + 0.9 * t, green: 0.9, blue: 0.7 - 0.5 * t) + color2 = Color(red: 0.0 + 1.0 * t, green: 0.9 - 0.2 * t, blue: 0.4 - 0.4 * t) + color3 = Color(red: 0.2 + 0.6 * t, green: 0.9 - 0.1 * t, blue: 0.5 - 0.3 * t) + } else { + // Orange to Purple (completing cycle) + let t = (progress - 0.8) / 0.2 + color1 = Color(red: 0.9 - 0.4 * t, green: 0.7 - 0.7 * t, blue: 0.2 + 0.6 * t) + color2 = Color(red: 1.0 - 0.7 * t, green: 0.7 - 0.7 * t, blue: 0.0 + 0.9 * t) + color3 = Color(red: 0.8 - 0.2 * t, green: 0.8 - 0.7 * t, blue: 0.2 + 0.5 * t) + } + + return LinearGradient( + colors: [color1, color2, color3], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + case 12: // Starfield - Deep black space with subtle deep blue tint + return LinearGradient( + colors: [ + Color(red: 0.02, green: 0.02, blue: 0.08), // Very dark blue-black + Color(red: 0.0, green: 0.0, blue: 0.05), // Deep space black + Color(red: 0.0, green: 0.0, blue: 0.0) // Pure black + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + default: + let progress = animationPhase + let color1: Color + let color2: Color + let color3: Color + + // Smooth color transitions through spectrum (offset from V1/V2) + if progress < 0.2 { + // Purple to Blue + let t = progress / 0.2 + color1 = Color(red: 0.5 - 0.2 * t, green: 0.0 + 0.3 * t, blue: 0.8 + 0.2 * t) + color2 = Color(red: 0.3 - 0.1 * t, green: 0.0 + 0.5 * t, blue: 0.9 + 0.1 * t) + color3 = Color(red: 0.6 - 0.3 * t, green: 0.1 + 0.4 * t, blue: 0.7 + 0.2 * t) + } else if progress < 0.4 { + // Blue to Cyan + let t = (progress - 0.2) / 0.2 + color1 = Color(red: 0.3 - 0.3 * t, green: 0.3 + 0.4 * t, blue: 1.0) + color2 = Color(red: 0.2 - 0.2 * t, green: 0.5 + 0.3 * t, blue: 1.0) + color3 = Color(red: 0.3 - 0.3 * t, green: 0.5 + 0.3 * t, blue: 0.9 + 0.1 * t) + } else if progress < 0.6 { + // Cyan to Green + let t = (progress - 0.4) / 0.2 + color1 = Color(red: 0.0, green: 0.7 + 0.2 * t, blue: 1.0 - 0.3 * t) + color2 = Color(red: 0.0, green: 0.8 + 0.1 * t, blue: 0.8 - 0.4 * t) + color3 = Color(red: 0.0 + 0.2 * t, green: 0.8 + 0.1 * t, blue: 1.0 - 0.5 * t) + } else if progress < 0.8 { + // Green to Yellow/Orange + let t = (progress - 0.6) / 0.2 + color1 = Color(red: 0.0 + 0.9 * t, green: 0.9, blue: 0.7 - 0.5 * t) + color2 = Color(red: 0.0 + 1.0 * t, green: 0.9 - 0.2 * t, blue: 0.4 - 0.4 * t) + color3 = Color(red: 0.2 + 0.6 * t, green: 0.9 - 0.1 * t, blue: 0.5 - 0.3 * t) + } else { + // Orange to Purple (completing cycle) + let t = (progress - 0.8) / 0.2 + color1 = Color(red: 0.9 - 0.4 * t, green: 0.7 - 0.7 * t, blue: 0.2 + 0.6 * t) + color2 = Color(red: 1.0 - 0.7 * t, green: 0.7 - 0.7 * t, blue: 0.0 + 0.9 * t) + color3 = Color(red: 0.8 - 0.2 * t, green: 0.8 - 0.7 * t, blue: 0.2 + 0.5 * t) + } + + return LinearGradient( + colors: [color1, color2, color3], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + } + } +} + +extension DimmingPickerView { + /// Curved-display RealityKit sizing: historically `0.96` screen fraction at 1.0 UI scale; scale with ``DimmingPickerMetrics`` so spatial size matches SwiftUI shrink. + static var curvedDesiredLocalWidth: Float { 0.96 * Float(DimmingPickerMetrics.scale) } +} + +// MARK: - Holdable Plain Button Style (tap = native sound + select; hold = start cycle; release = stop cycle) + +struct HoldablePlainButtonStyle: ButtonStyle { + let onHold: () -> Void + let onRelease: () -> Void + /// Seconds before onHold fires (default 0.5). Use a shorter value (e.g. 0.2) for quicker response. + var minimumHoldDuration: Double = 0.5 + + @State private var holdTask: Task? + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .onChange(of: configuration.isPressed) { oldValue, isPressed in + if isPressed { + holdTask?.cancel() + let duration = minimumHoldDuration + holdTask = Task { + try? await Task.sleep(nanoseconds: UInt64(duration * 1_000_000_000)) + if !Task.isCancelled { + await MainActor.run { onHold() } + } + } + } else { + holdTask?.cancel() + onRelease() + } + } + } +} diff --git a/Moonlight Vision/DrawableVideoDecoder.swift b/Moonlight Vision/DrawableVideoDecoder.swift index b0896fe47..4a27367cd 100644 --- a/Moonlight Vision/DrawableVideoDecoder.swift +++ b/Moonlight Vision/DrawableVideoDecoder.swift @@ -12,11 +12,13 @@ import CoreVideo import Foundation import Metal import MetalKit -import QuartzCore // For CADisplayLink +import QuartzCore import RealityKit import SwiftUI +import UIKit import VideoToolbox import CoreFoundation +import simd // Add these constants after your existing constants let kCVPixelBufferYCbCrMatrixKey = "YCbCrMatrix" as CFString @@ -28,14 +30,137 @@ struct HDRParams { var contrast: Float var saturation: Float var brightness: Float - var mode: Int32 // 0 = Power Curve, 1 = ACES, 2 = ACES + Vibrance + var pqExposure: Float // PQ-only exposure trim; 1.0 = neutral + var mode: Int32 + /// Bit 0 (`1`): Reference HDR — minimal client grading (PQ + gamut + tone map only). See `Shaders.metal` `FullHDRParams.hdrGradeFlags`. + var hdrGradeFlags: UInt32 = 0 } +/// ChromaHalo / Chromosphere: halo drawable / RealityKit texture size is full frame `>> mipShift`. +/// Rim pass samples **mip 0**; a **separable 13-tap blur** on the halo buffer spreads that into a smooth wash (GPU-heavy, quality-first). +enum ChromaHaloDownsample { + /// `1` → half resolution per axis (vs stream). Pairs with separable blur for Hue-like gradients. + static let mipShift: Int = 1 +} + +private let chromaHaloSourceMipLevel = 0 + +/// Multiplies halo texel step in separable blur (wider bleed ≈ Ambilight wall wash). +private let chromaHaloAmbilightBlurSpread: Float = 1.45 + private struct ColorEnhancementUniforms { var saturation: Float var contrast: Float + var warmth: Float var padding1: Float - var padding2: Float +} + +// Must match ShaderHDRParams in Shaders.metal exactly (field order + alignment). +// Metal float3x3 is stored as 3 × float4 columns (48 bytes); float3 is 16 bytes (padded). +private struct ShaderHDRParams { + var isPQ: UInt32 // 1 = PQ/HDR path, 0 = SDR / extended + var primariesType: UInt32 // 0=709/P3, 1=2020, 2=SMPTE-C (gamut selector) + var extendedScene: UInt32 // 1 = Moonlight HDR + non-PQ (matches `Shaders.metal` ShaderHDRParams.extendedScene) + var reserved0: UInt32 = 0 + var edrHeadroom: Float // Tone map ceiling (2.0 on visionOS) + var pad: Float = 0 + var alignPad: SIMD2 = .zero + /// Sunshine maxCLL / maxFALL (nits); 0 = omit CLL-driven shoulder (see `Shaders.metal` hdrUchimuraShoulderP). + var maxContentNits: Float = 0 + var maxFrameAvgNits: Float = 0 + var padHdrMeta: SIMD2 = .zero + var yuvMatrix: simd_float3x3 // Precomputed YUV→RGB matrix (CPU-selected) + var yuvOffset: simd_float3 // Subtract before matrix multiply +} + +// Build the YUV→RGB matrix and offset for the given format on the CPU. +// Shared by DrawableVideoDecoder (RealityKit path) and MetalVideoDecoderRenderer (UIKit path). +// Eliminates all if/else branching in the fragment shader. +// Coefficients from ITU-R BT.709-6, BT.2020-2, BT.601-7. +func buildYUVMatrix(matrixType: UInt32, isFullRange: Bool, is10Bit: Bool) -> (simd_float3x3, simd_float3) { + let yBlack: Float = isFullRange ? 0.0 : (is10Bit ? 64.0 / 1023.0 : 16.0 / 255.0) + let uvCenter: Float = is10Bit ? 512.0 / 1023.0 : 128.0 / 255.0 + let yScale: Float = isFullRange ? 1.0 : (is10Bit ? 1023.0 / 876.0 : 255.0 / 219.0) + + let offset = simd_float3(yBlack, uvCenter, uvCenter) + + let m: simd_float3x3 + switch matrixType { + case 1: // BT.2020 + if isFullRange { + m = simd_float3x3(columns: ( + simd_float3( 1.0, 1.0, 1.0 ), + simd_float3( 0.0, -0.164553, 1.8814 ), + simd_float3( 1.4746, -0.571353, 0.0 ) + )) + } else { + let s = yScale + m = simd_float3x3(columns: ( + simd_float3( s, s, s ), + simd_float3( 0.0, -0.18732610 * s, 2.14177232 * s ), + simd_float3( 1.67867411 * s, -0.65042432 * s, 0.0 ) + )) + } + case 2: // BT.601 / SMPTE-C + if isFullRange { + m = simd_float3x3(columns: ( + simd_float3( 1.0, 1.0, 1.0 ), + simd_float3( 0.0, -0.344136, 1.77200 ), + simd_float3( 1.40200, -0.714136, 0.0 ) + )) + } else { + let s = yScale + m = simd_float3x3(columns: ( + simd_float3( s, s, s ), + simd_float3( 0.0, -0.391762 * s, 2.017232 * s ), + simd_float3( 1.596027 * s, -0.812968 * s, 0.0 ) + )) + } + default: // BT.709 + if isFullRange { + m = simd_float3x3(columns: ( + simd_float3( 1.0, 1.0, 1.0 ), + simd_float3( 0.0, -0.187324, 1.8556 ), + simd_float3( 1.5748, -0.468124, 0.0 ) + )) + } else { + let s = yScale + m = simd_float3x3(columns: ( + simd_float3( s, s, s ), + simd_float3( 0.0, -0.21324861 * s, 2.11240179 * s ), + simd_float3( 1.79274107 * s, -0.53290933 * s, 0.0 ) + )) + } + } + return (m, offset) +} + +// Must match FullHDRParams in Shaders.metal exactly. +private struct ShaderFullHDRParams { + var boost: Float + var contrast: Float + var saturation: Float + var brightness: Float + var pqExposure: Float + var mode: Int32 + var hdrGradeFlags: UInt32 +} + +/// Buffer 0 for TestFlight SDR fragments (`copyFragmentShaderHDR_EDR` / `_HEVC_EDR`) — matches `LegacySDRFrameParams` in Shaders.metal. +private struct LegacySDRFrameParams { + var presetIndex: UInt32 = 0 + var isPQ: UInt32 + var isBT2020Matrix: UInt32 + var isBT2020Primaries: UInt32 +} + +/// Buffer 1 for legacy SDR fragments — matches `LegacySDRFullParams` in Shaders.metal (no pqExposure). +private struct LegacySDRFullParams { + var boost: Float + var contrast: Float + var saturation: Float + var brightness: Float + var mode: Int32 } let kCVImageBufferYCbCrMatrix_ITU_R_2020 = "ITU_R_2020" as CFString @@ -54,7 +179,7 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { private var callbacks: ConnectionCallbacks private var streamAspectRatio: Float - let callbackToRender: @MainActor (TextureResource.DrawableQueue, (Int, Int)?) -> Void + let callbackToRender: @MainActor (TextureResource.DrawableQueue, TextureResource.DrawableQueue?, (Int, Int)?) -> Void private var hdrSettingsProvider: (() -> HDRParams)? = nil /// Format and frame info @@ -90,6 +215,11 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { var session: VTDecompressionSession? var decoderCallback: VTDecompressionOutputCallbackRecord + + // Limits GPU command buffer depth to 3 in-flight frames. + // Prevents memory pressure and watchdog kills when the decoder runs faster than the GPU. + private let inflightSemaphore = DispatchSemaphore(value: 3) + lazy var mtlDevice: MTLDevice = { guard let device = MTLCreateSystemDefaultDevice() else { fatalError() @@ -104,17 +234,35 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { private var hdrEnabled: Bool private var hdrMetadata: SS_HDR_METADATA = SS_HDR_METADATA() - private var enhancementsProvider: (() -> (Float, Float))? = nil + private var enhancementsProvider: (() -> (Float, Float, Float))? = nil private var copyPipelineState: MTLRenderPipelineState? private var copyPipelineFormat: MTLPixelFormat? private var copyPipelineStateYUV: MTLRenderPipelineState? private var lastCopyFragment: String? + // ChromaHalo: downsampled drawable queue for the edge bloom layer + var chromaHaloQueue: TextureResource.DrawableQueue? + private var chromaHaloRimPipelineState: MTLRenderPipelineState? + private var chromaHaloBlurHPipelineState: MTLRenderPipelineState? + private var chromaHaloBlurVPipelineState: MTLRenderPipelineState? + /// Ping-pong scratch: rim → A, horizontal blur → B, vertical blur (+ temporal) → drawable. + private var chromaHaloScratchA: MTLTexture? + private var chromaHaloScratchB: MTLTexture? + private var prevChromaHaloTexture: MTLTexture? + private var firstFrameEmitted = false private static let ambientEngine: AmbientLightEngine? = AmbientLightEngine() + // Flag to control whether we spawn the ambient analysis task (zone colors for dome modes) + var isReactiveDimmingEnabled: Bool = false + // ChromaHalo intensity for edge bloom (0.0 = off, 1.0 = normal) + var chromaHaloIntensity: Float = 0.0 + // ChromaHalo scale (how much larger than video the halo mesh is) + /// Geometric margin for bloom vs display — keep equal to `_CurvedDisplayStreamView.chromosphereDiameterScale`. + var chromaHaloScale: Float = 1.55 + // MARK: - Initialization init( @@ -124,8 +272,8 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { useFramePacing: Bool, enableHDR: Bool = false, hdrSettingsProvider: (() -> HDRParams)? = nil, - enhancementsProvider: (() -> (Float, Float))? = nil, - callbackToRender: @MainActor @escaping (TextureResource.DrawableQueue, (Int, Int)?) -> Void + enhancementsProvider: (() -> (Float, Float, Float))? = nil, + callbackToRender: @MainActor @escaping (TextureResource.DrawableQueue, TextureResource.DrawableQueue?, (Int, Int)?) -> Void ) { metalFormat = enableHDR ? .rgba16Float : .bgra8Unorm_srgb @@ -170,84 +318,106 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { presentationTimeStamp _: CMTime, presentationDuration _: CMTime? ) { + guard let imageBuffer = imageBuffer else { return } + + // Back-pressure: drop the frame silently if 3 frames are already queued on the GPU. + if inflightSemaphore.wait(timeout: .now()) != .success { return } + + autoreleasepool { + renderFrame(imageBuffer: imageBuffer) + } + } + + private func renderFrame(imageBuffer: CVImageBuffer) { guard - let imageBuffer = imageBuffer, let commandBuffer = commandQueue?.makeCommandBuffer(), - let textureCache = textureCache + let textureCache = textureCache else { - print("DrawableVideoDecoder: Missing imageBuffer/commandBuffer/textureCache") + inflightSemaphore.signal() return } - let pf = CVPixelBufferGetPixelFormatType(imageBuffer) + commandBuffer.addCompletedHandler { [weak self] _ in + self?.inflightSemaphore.signal() + } + + let pf = CVPixelBufferGetPixelFormatType(imageBuffer) let planeCount = CVPixelBufferGetPlaneCount(imageBuffer) - // 1. PQ Detection (With Force-Fix) - // If the user enabled HDR, we MUST assume PQ, even if the stream metadata is missing. - var isPQ = hdrEnabled - - // (Optional) If not already forced, check metadata as fallback - if !isPQ { - if let tfVal = CVBufferGetAttachment(imageBuffer, kCVImageBufferTransferFunctionKey, nil)?.takeUnretainedValue(), - CFGetTypeID(tfVal) == CFStringGetTypeID() { - isPQ = CFEqual(tfVal as! CFString, kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ) + // --- PQ detection (ST.2084) --- + // 1) Prefer attachment on the decoded pixel buffer. + // 2) Else use transfer from CMVideoFormatDescription (must match AV1 sequence header — see AV1Parser tcMap). + // VideoToolbox often omits kCVImageBufferTransferFunctionKey on the buffer even when the format desc is correct. + var isPQ = false + if let tfVal = CVBufferGetAttachment(imageBuffer, kCVImageBufferTransferFunctionKey, nil)?.takeUnretainedValue(), + CFGetTypeID(tfVal) == CFStringGetTypeID() { + isPQ = CFEqual(tfVal as! CFString, kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ) + } + if !isPQ, let fd = formatDesc, + let tfAny = CMFormatDescriptionGetExtension(fd, extensionKey: kCMFormatDescriptionExtension_TransferFunction) { + if CFGetTypeID(tfAny) == CFStringGetTypeID() { + isPQ = CFEqual(tfAny as! CFString, kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ) } } - // 2. Primaries Detection (Gamut) - var isBT2020Primaries = false + // --- Primaries Detection --- + var primariesFromAttachment = false + var primariesType: UInt32 = 0 // 0=709, 1=2020, 2=SMPTE-C if let primVal = CVBufferGetAttachment(imageBuffer, kCVImageBufferColorPrimariesKey, nil)?.takeUnretainedValue(), CFGetTypeID(primVal) == CFStringGetTypeID() { + primariesFromAttachment = true let prim = primVal as! CFString - if CFEqual(prim, kCVImageBufferColorPrimaries_ITU_R_2020) { - isBT2020Primaries = true - } else if CFEqual(prim, kCVImageBufferColorPrimaries_ITU_R_709_2) { - isBT2020Primaries = false - } + if CFEqual(prim, kCVImageBufferColorPrimaries_ITU_R_2020) { primariesType = 1 } + else if CFEqual(prim, "SMPTE_C" as CFString) { primariesType = 2 } + // else stays 0 (BT.709) } else { - // Fallback: If HDR is on, assume Rec.2020 - isBT2020Primaries = hdrEnabled + // Infer BT.2020 only for PQ HDR without tags; 10‑bit SDR without primaries stays 709 (avoids green cast). + primariesType = (hdrEnabled && pixelFormatIs10Bit(pf) && isPQ) ? 1 : 0 } - // 3. Matrix Detection (YUV Coeffs) - var isBT2020Matrix = false + // --- Matrix Detection --- + var matrixFromAttachment = false + var matrixType: UInt32 = 0 // 0=709, 1=2020, 2=601 if let mtxVal = CVBufferGetAttachment(imageBuffer, kCVImageBufferYCbCrMatrixKey, nil)?.takeUnretainedValue(), CFGetTypeID(mtxVal) == CFStringGetTypeID() { + matrixFromAttachment = true let mtx = mtxVal as! CFString - if CFEqual(mtx, kCVImageBufferYCbCrMatrix_ITU_R_2020) { - isBT2020Matrix = true - } else if CFEqual(mtx, kCVImageBufferYCbCrMatrix_ITU_R_709_2) { - isBT2020Matrix = false - } + if CFEqual(mtx, kCVImageBufferYCbCrMatrix_ITU_R_2020) { matrixType = 1 } + else if CFEqual(mtx, "ITU_R_601_4" as CFString) { matrixType = 2 } + // else stays 0 (BT.709) } else { - // Fallback: If HDR is on, assume Rec.2020 - isBT2020Matrix = hdrEnabled + matrixType = (hdrEnabled && pixelFormatIs10Bit(pf) && isPQ) ? 1 : 0 } - guard - let drawable = try? drawableQueue?.nextDrawable() - else { - print("DrawableVideoDecoder: nextDrawable() returned nil") - return + // PQ tag but no colorimetry attachments is common for Windows HDR desktop in Moonlight — treat as non-PQ. + if isPQ && hdrEnabled && !matrixFromAttachment && !primariesFromAttachment { + isPQ = false + matrixType = 0 + primariesType = 0 } - - if hdrEnabled { - updateHDRMetadata() + // PQ with explicit BT.709 primaries + 709 matrix is usually SDR-in-HDR container, not PQ code values. + if isPQ && primariesFromAttachment && matrixFromAttachment && primariesType == 0 && matrixType == 0 { + isPQ = false } - // Explicit bi-planar detection - var isBiPlanar = false - var yFormat: MTLPixelFormat = .invalid + let is10Bit = pixelFormatIs10Bit(pf) ? UInt32(1) : 0 + let isFullRange = pixelFormatIsFullRange(pf) ? UInt32(1) : 0 + + if hdrEnabled { updateHDRMetadata() } + + // --- Texture Format Selection --- + // When HDR is off, use the same CV→Metal mapping as pre–HDR-overhaul builds (and as + // MetalVideoDecoderRenderer): 10-bit SDR stays on r16/rg16 (or packed YCbCr), not r8/rg8. + var isBiPlanar = false + var yFormat: MTLPixelFormat = .invalid var cbcrFormat: MTLPixelFormat = .invalid if planeCount >= 2 { - // Prefer native formats derived from CVPixelBuffer let srcMetalFormats = CVMetalHelpers.getTextureTypesForFormat(pf) if srcMetalFormats.count > 0 { yFormat = srcMetalFormats[0] } if srcMetalFormats.count > 1 { cbcrFormat = srcMetalFormats[1] } isBiPlanar = (cbcrFormat != .invalid) - - // If HDR enabled, ensure P010 path where possible + if hdrEnabled { yFormat = .r16Unorm cbcrFormat = .rg16Unorm @@ -255,20 +425,40 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { } } - // DEBUG: First-frame log (once) if !firstFrameEmitted { let fmtStr = CVMetalHelpers.coreVideoPixelFormatToStr[pf] ?? "\(pf)" - print("[DrawableVideoDecoder] PF=\(fmtStr), planes=\(planeCount), hdr=\(hdrEnabled), PQ=\(isPQ), 2020Primaries=\(isBT2020Primaries), 2020Matrix=\(isBT2020Matrix)") + let tfDesc: String = { + guard let fd = formatDesc, + let tfAny = CMFormatDescriptionGetExtension(fd, extensionKey: kCMFormatDescriptionExtension_TransferFunction) + else { return "-" } + if let s = tfAny as? String { return s } + if CFGetTypeID(tfAny) == CFStringGetTypeID() { return (tfAny as! CFString) as String } + return "-" + }() + let cllLog = hdrEnabled ? " maxCLL=\(hdrMetadata.maxContentLightLevel) maxFALL=\(hdrMetadata.maxFrameAverageLightLevel)" : "" + print("[DrawableVideoDecoder] PF=\(fmtStr), planes=\(planeCount), hdr=\(hdrEnabled), isPQ=\(isPQ), tfDesc=\(tfDesc), fullRange=\(isFullRange==1), 10bit=\(is10Bit==1), matrix=\(matrixType), primaries=\(primariesType)\(cllLog)") } - let fragment: String = isBiPlanar ? "copyFragmentShaderHDR_EDR" : "copyFragmentShaderHEVC_EDR" + guard let drawable = try? drawableQueue?.nextDrawable() else { + commandBuffer.commit() + return + } + + // SDR uses default TestFlight entry points; HDR uses separate Metal symbols (never shares SDR shader body). + let fragment: String = { + if hdrEnabled { + return isBiPlanar ? "copyFragmentShaderHDR_HDRUnified" : "copyFragmentShaderHEVC_HDRUnified" + } + return isBiPlanar ? "copyFragmentShaderHDR_EDR" : "copyFragmentShaderHEVC_EDR" + }() if isBiPlanar { if copyPipelineStateYUV == nil || lastCopyFragment != fragment { copyPipelineStateYUV = buildCopyPipeline(fragment: fragment) lastCopyFragment = fragment - if copyPipelineStateYUV == nil { + guard copyPipelineStateYUV != nil else { print("DrawableVideoDecoder: Failed to build YUV pipeline") + commandBuffer.commit() return } } @@ -276,20 +466,21 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { if copyPipelineState == nil || lastCopyFragment != fragment { copyPipelineState = buildCopyPipeline(fragment: fragment) lastCopyFragment = fragment - if copyPipelineState == nil { + guard copyPipelineState != nil else { print("DrawableVideoDecoder: Failed to build single-plane pipeline") + commandBuffer.commit() return } } } let renderPassDescriptor = MTLRenderPassDescriptor() - renderPassDescriptor.colorAttachments[0].texture = drawable.texture - renderPassDescriptor.colorAttachments[0].loadAction = .clear + renderPassDescriptor.colorAttachments[0].texture = drawable.texture + renderPassDescriptor.colorAttachments[0].loadAction = .clear renderPassDescriptor.colorAttachments[0].storeAction = .store guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) else { - print("DrawableVideoDecoder: Failed to create render encoder") + commandBuffer.commit() return } @@ -299,99 +490,279 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { let w1 = CVPixelBufferGetWidthOfPlane(imageBuffer, 1) let h1 = CVPixelBufferGetHeightOfPlane(imageBuffer, 1) - var yTexRef: CVMetalTexture? - var cbcrTexRef: CVMetalTexture? - - let res0 = CVMetalTextureCacheCreateTextureFromImage( - kCFAllocatorDefault, textureCache, imageBuffer, nil, - yFormat, w0, h0, 0, &yTexRef - ) - let res1 = CVMetalTextureCacheCreateTextureFromImage( - kCFAllocatorDefault, textureCache, imageBuffer, nil, - cbcrFormat, w1, h1, 1, &cbcrTexRef - ) - if res0 != 0 || res1 != 0 { - print("DrawableVideoDecoder: CVMetalTexture (YUV) failed: \(res0), \(res1)") + var yRef: CVMetalTexture? + var cbcrRef: CVMetalTexture? + let r0 = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, imageBuffer, nil, yFormat, w0, h0, 0, &yRef) + let r1 = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, imageBuffer, nil, cbcrFormat, w1, h1, 1, &cbcrRef) + guard r0 == 0, r1 == 0, + let yTex = yRef.flatMap(CVMetalTextureGetTexture), + let uvTex = cbcrRef.flatMap(CVMetalTextureGetTexture) else { renderEncoder.endEncoding() commandBuffer.commit() return } - - guard let yTex = yTexRef.flatMap(CVMetalTextureGetTexture), - let cbcrTex = cbcrTexRef.flatMap(CVMetalTextureGetTexture) else { - print("DrawableVideoDecoder: Failed to get Y/CBCR textures") - renderEncoder.endEncoding() - commandBuffer.commit() - return - } - renderEncoder.setRenderPipelineState(copyPipelineStateYUV!) - renderEncoder.setFragmentTexture(yTex, index: 0) - renderEncoder.setFragmentTexture(cbcrTex, index: 1) + renderEncoder.setFragmentTexture(yTex, index: 0) + renderEncoder.setFragmentTexture(uvTex, index: 1) } else { - var imageTexture: CVMetalTexture? + var imgRef: CVMetalTexture? let w = CVPixelBufferGetWidthOfPlane(imageBuffer, 0) let h = CVPixelBufferGetHeightOfPlane(imageBuffer, 0) - let srcFormat = CVMetalHelpers.getTextureTypesForFormat(pf)[0] - - let result = CVMetalTextureCacheCreateTextureFromImage( - kCFAllocatorDefault, textureCache, imageBuffer, nil, - srcFormat, w, h, 0, &imageTexture - ) - guard result == 0, let imageTexture, let sourceTexture = CVMetalTextureGetTexture(imageTexture) else { - print("DrawableVideoDecoder: CVMetalTexture (single-plane) failed: \(result)") + let srcFmt = CVMetalHelpers.getTextureTypesForFormat(pf)[0] + let result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, imageBuffer, nil, srcFmt, w, h, 0, &imgRef) + guard result == 0, let srcTex = imgRef.flatMap(CVMetalTextureGetTexture) else { renderEncoder.endEncoding() commandBuffer.commit() return } - renderEncoder.setRenderPipelineState(copyPipelineState!) - renderEncoder.setFragmentTexture(sourceTexture, index: 0) + renderEncoder.setFragmentTexture(srcTex, index: 0) } - // --- 1. FORCE PQ FIX (The "Washed Out" Fix) --- - // If HDR is enabled, we assume the signal is PQ, even if metadata is missing. - // This prevents the "Gray Screen" issue. - if hdrEnabled { isPQ = true } - - // --- 2. THE STRUCT FIX (Type Mismatch Fix) --- - // We defined the struct properties as UInt32 (to match Metal 'uint'). - // We convert our Swift Bools to 1 or 0 here. - struct ShaderHDRParams { var presetIndex: UInt32; var isPQ: UInt32; var isBT2020Matrix: UInt32; var isBT2020Primaries: UInt32 } - - var shaderParams = ShaderHDRParams( - presetIndex: 0, - isPQ: isPQ ? 1 : 0, // Convert Bool -> UInt32 - isBT2020Matrix: isBT2020Matrix ? 1 : 0, - isBT2020Primaries: isBT2020Primaries ? 1 : 0 - ) - - if let pb = mtlDevice.makeBuffer(bytes: &shaderParams, length: MemoryLayout.size, options: .storageModeShared) { - renderEncoder.setFragmentBuffer(pb, offset: 0, index: 0) - } + // Buffer 0: ShaderHDRParams — frame signal description + // visionOS has fixed EDR headroom (Vision Pro's micro-OLED peak capability). + // On other platforms, query UIScreen dynamically. + // Only use HDR slider values when HDR is actually enabled. + let userParams: HDRParams = hdrEnabled + ? (hdrSettingsProvider?() ?? HDRParams(boost: 1.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, pqExposure: 1.0, mode: 0)) + : HDRParams(boost: 1.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, pqExposure: 1.0, mode: 0) + + // Always compute once so first-frame logging (and HDR shader params) share the same binding. + let edrHeadroom: Float = { + #if os(visionOS) + return 2.0 + #else + let raw = UIScreen.main.currentEDRHeadroom + return Float(raw > 1.0 ? raw : UIScreen.main.potentialEDRHeadroom) + #endif + }() - let satCon = enhancementsProvider?() ?? (1.0, 1.0) - var enh = ColorEnhancementUniforms(saturation: satCon.0, contrast: satCon.1, padding1: 0, padding2: 0) - if let eb = mtlDevice.makeBuffer(bytes: &enh, length: MemoryLayout.size, options: .storageModeShared) { - renderEncoder.setFragmentBuffer(eb, offset: 0, index: 2) + if hdrEnabled { + let is10BitBool = is10Bit == 1 + let isFullRangeBool = isFullRange == 1 + let (yuvMatrix, yuvOffset) = buildYUVMatrix(matrixType: matrixType, isFullRange: isFullRangeBool, is10Bit: is10BitBool) + let extendedScene: UInt32 = (hdrEnabled && !isPQ) ? 1 : 0 + var shaderHDR = ShaderHDRParams( + isPQ: isPQ ? 1 : 0, + primariesType: primariesType, + extendedScene: extendedScene, + reserved0: 0, + edrHeadroom: edrHeadroom, + pad: 0, + alignPad: .zero, + maxContentNits: Float(hdrMetadata.maxContentLightLevel), + maxFrameAvgNits: Float(hdrMetadata.maxFrameAverageLightLevel), + padHdrMeta: .zero, + yuvMatrix: yuvMatrix, + yuvOffset: yuvOffset + ) + renderEncoder.setFragmentBytes(&shaderHDR, length: MemoryLayout.size, index: 0) + + var fullParams = ShaderFullHDRParams( + boost: userParams.boost, + contrast: userParams.contrast, + saturation: userParams.saturation, + brightness: userParams.brightness, + pqExposure: userParams.pqExposure, + mode: userParams.mode, + hdrGradeFlags: userParams.hdrGradeFlags + ) + renderEncoder.setFragmentBytes(&fullParams, length: MemoryLayout.size, index: 1) + } else { + var legacyFrame = LegacySDRFrameParams( + presetIndex: 0, + isPQ: isPQ ? 1 : 0, + isBT2020Matrix: matrixType == 1 ? 1 : 0, + isBT2020Primaries: primariesType == 1 ? 1 : 0 + ) + renderEncoder.setFragmentBytes(&legacyFrame, length: MemoryLayout.size, index: 0) + + var legacyFull = LegacySDRFullParams( + boost: userParams.boost, + contrast: userParams.contrast, + saturation: userParams.saturation, + brightness: userParams.brightness, + mode: userParams.mode + ) + renderEncoder.setFragmentBytes(&legacyFull, length: MemoryLayout.size, index: 1) } + // Buffer 2: ColorEnhancementUniforms — warmth / per-renderer adjustments + let satConWarm = enhancementsProvider?() ?? (1.0, 1.0, 0.0) + var enh = ColorEnhancementUniforms(saturation: satConWarm.0, contrast: satConWarm.1, warmth: satConWarm.2, padding1: 0) + renderEncoder.setFragmentBytes(&enh, length: MemoryLayout.size, index: 2) + renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) renderEncoder.endEncoding() - // --- ENABLE MIPMAP GENERATION (The Shimmer Fix) --- + // Mipmap generation — used by both ChromaHalo bloom and ambient zone sampling if let blitEncoder = commandBuffer.makeBlitCommandEncoder() { blitEncoder.generateMipmaps(for: drawable.texture) blitEncoder.endEncoding() } + // ChromaHalo: rim (mip 0) → two rounds separable blur (Ambilight diffusion) → temporal on final V-pass. + if chromaHaloIntensity > 0.0, + let haloQueue = chromaHaloQueue, + let haloDrawable = try? haloQueue.nextDrawable() { + + let sampleMip = min(chromaHaloSourceMipLevel, drawable.texture.mipmapLevelCount - 1) + + if chromaHaloRimPipelineState == nil { + chromaHaloRimPipelineState = buildCopyPipeline(fragment: "chromaHaloRimFragment") + } + if chromaHaloBlurHPipelineState == nil { + chromaHaloBlurHPipelineState = buildCopyPipeline(fragment: "chromaHaloBlurHFragment") + } + if chromaHaloBlurVPipelineState == nil { + chromaHaloBlurVPipelineState = buildCopyPipeline(fragment: "chromaHaloBlurVFragment") + } + + var didAllocatePrevChroma = false + if prevChromaHaloTexture == nil + || prevChromaHaloTexture!.width != haloDrawable.texture.width + || prevChromaHaloTexture!.height != haloDrawable.texture.height { + let desc = MTLTextureDescriptor.texture2DDescriptor( + pixelFormat: haloDrawable.texture.pixelFormat, + width: haloDrawable.texture.width, + height: haloDrawable.texture.height, + mipmapped: false) + desc.usage = [.shaderRead, .renderTarget] + prevChromaHaloTexture = mtlDevice.makeTexture(descriptor: desc) + didAllocatePrevChroma = prevChromaHaloTexture != nil + } + + if didAllocatePrevChroma, let freshPrev = prevChromaHaloTexture { + let clearDesc = MTLRenderPassDescriptor() + clearDesc.colorAttachments[0].texture = freshPrev + clearDesc.colorAttachments[0].loadAction = .clear + clearDesc.colorAttachments[0].clearColor = MTLClearColor(red: 0, green: 0, blue: 0, alpha: 0) + clearDesc.colorAttachments[0].storeAction = .store + if let clearEnc = commandBuffer.makeRenderCommandEncoder(descriptor: clearDesc) { + clearEnc.endEncoding() + } + } + + ensureChromaHaloBlurScratchMatches(haloDrawable.texture) + + if let mipView = drawable.texture.makeTextureView( + pixelFormat: drawable.texture.pixelFormat, + textureType: .type2D, + levels: sampleMip..<(sampleMip + 1), + slices: 0..<1), + let rimPS = chromaHaloRimPipelineState, + let blurHPS = chromaHaloBlurHPipelineState, + let blurVPS = chromaHaloBlurVPipelineState, + let scratchA = chromaHaloScratchA, + let scratchB = chromaHaloScratchB, + let prevTex = prevChromaHaloTexture { + + let w = Float(scratchA.width) + let h = Float(scratchA.height) + var texelUV = simd_float2( + chromaHaloAmbilightBlurSpread / max(w, 1), + chromaHaloAmbilightBlurSpread / max(h, 1)) + + // Pass 1 — rim → scratch A + let passRim = MTLRenderPassDescriptor() + passRim.colorAttachments[0].texture = scratchA + passRim.colorAttachments[0].loadAction = .clear + passRim.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + passRim.colorAttachments[0].storeAction = .store + if let enc = commandBuffer.makeRenderCommandEncoder(descriptor: passRim) { + enc.setRenderPipelineState(rimPS) + enc.setFragmentTexture(mipView, index: 0) + var scale = chromaHaloScale + var intensity = chromaHaloIntensity + enc.setFragmentBytes(&scale, length: MemoryLayout.size, index: 1) + enc.setFragmentBytes(&intensity, length: MemoryLayout.size, index: 2) + enc.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + enc.endEncoding() + } + + // Pass 2 — horizontal blur A → B + let passH = MTLRenderPassDescriptor() + passH.colorAttachments[0].texture = scratchB + passH.colorAttachments[0].loadAction = .clear + passH.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + passH.colorAttachments[0].storeAction = .store + if let enc = commandBuffer.makeRenderCommandEncoder(descriptor: passH) { + enc.setRenderPipelineState(blurHPS) + enc.setFragmentTexture(scratchA, index: 0) + enc.setFragmentBytes(&texelUV, length: MemoryLayout.size, index: 0) + enc.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + enc.endEncoding() + } + + // Pass 3 — first vertical blur → scratch A (Ambilight diffusion pass 2/4) + let passV1 = MTLRenderPassDescriptor() + passV1.colorAttachments[0].texture = scratchA + passV1.colorAttachments[0].loadAction = .clear + passV1.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + passV1.colorAttachments[0].storeAction = .store + if let enc = commandBuffer.makeRenderCommandEncoder(descriptor: passV1) { + enc.setRenderPipelineState(blurVPS) + enc.setFragmentTexture(scratchB, index: 0) + enc.setFragmentTexture(prevTex, index: 1) + enc.setFragmentBytes(&texelUV, length: MemoryLayout.size, index: 0) + var vTemporalOff: UInt32 = 0 + enc.setFragmentBytes(&vTemporalOff, length: MemoryLayout.size, index: 1) + var mixPlaceholder: Float = 0 + enc.setFragmentBytes(&mixPlaceholder, length: MemoryLayout.size, index: 2) + enc.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + enc.endEncoding() + } + + // Pass 4 — horizontal blur scratch A → B + let passH2 = MTLRenderPassDescriptor() + passH2.colorAttachments[0].texture = scratchB + passH2.colorAttachments[0].loadAction = .clear + passH2.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + passH2.colorAttachments[0].storeAction = .store + if let enc = commandBuffer.makeRenderCommandEncoder(descriptor: passH2) { + enc.setRenderPipelineState(blurHPS) + enc.setFragmentTexture(scratchA, index: 0) + enc.setFragmentBytes(&texelUV, length: MemoryLayout.size, index: 0) + enc.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + enc.endEncoding() + } + + // Pass 5 — vertical blur + temporal → halo drawable + let passV2 = MTLRenderPassDescriptor() + passV2.colorAttachments[0].texture = haloDrawable.texture + passV2.colorAttachments[0].loadAction = .clear + passV2.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + passV2.colorAttachments[0].storeAction = .store + if let enc = commandBuffer.makeRenderCommandEncoder(descriptor: passV2) { + enc.setRenderPipelineState(blurVPS) + enc.setFragmentTexture(scratchB, index: 0) + enc.setFragmentTexture(prevTex, index: 1) + enc.setFragmentBytes(&texelUV, length: MemoryLayout.size, index: 0) + var vTemporalOn: UInt32 = 1 + enc.setFragmentBytes(&vTemporalOn, length: MemoryLayout.size, index: 1) + var mix = chromaHaloTemporalFrameMix() + enc.setFragmentBytes(&mix, length: MemoryLayout.size, index: 2) + enc.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + enc.endEncoding() + } + + if let blitEnc = commandBuffer.makeBlitCommandEncoder() { + blitEnc.copy(from: haloDrawable.texture, to: prevTex) + blitEnc.endEncoding() + } + } + + haloDrawable.present() + } + let outTextureForAmbient = drawable.texture + commandBuffer.addCompletedHandler { _ in + drawable.present() + } commandBuffer.commit() - drawable.present() - // Fire and forget. The engine handles the math and notification on its own timeline. - if let engine = Self.ambientEngine { + if isReactiveDimmingEnabled, let engine = Self.ambientEngine { Task.detached { await engine.analyze(texture: outTextureForAmbient) } @@ -401,11 +772,69 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { firstFrameEmitted = true DispatchQueue.main.async { self.callbacks.videoContentShown() - print("DrawableVideoDecoder: First frame presented (PQ=\(isPQ), 2020Primaries=\(isBT2020Primaries), 2020Matrix=\(isBT2020Matrix))") + print("DrawableVideoDecoder: First frame presented (PQ=\(isPQ), primaries=\(primariesType), matrix=\(matrixType), edrHeadroom=\(edrHeadroom))") } } } + // MARK: - Pixel Format Helpers + + private func pixelFormatIs10Bit(_ pf: OSType) -> Bool { + switch pf { + case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_Lossy_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_Lossless_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarFullRange: + return true + default: + return false + } + } + + private func pixelFormatIsFullRange(_ pf: OSType) -> Bool { + switch pf { + case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_Lossy_420YpCbCr10PackedBiPlanarFullRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarFullRange: + return true + // Studio (limited) range is fixed by the OSType. Some streams incorrectly set FullRangeVideo on the + // CMFormatDescription; trusting that here used full-range YUV offsets on limited buffers → lifted blacks + // and the milky HDR desktop look (PQ path and extended path both start from the same decode). + case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_422YpCbCr8BiPlanarVideoRange, + kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange, + kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_Lossy_420YpCbCr8BiPlanarVideoRange, + kCVPixelFormatType_Lossless_420YpCbCr8BiPlanarVideoRange, + kCVPixelFormatType_Lossy_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_Lossless_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_Lossy_422YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_Lossless_422YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_422YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_444YpCbCr10PackedBiPlanarVideoRange: + return false + default: + // Match MetalVideoDecoderRenderer: unknown layouts default to studio (limited) range. + // Relying on CMFormatDescription FullRangeVideo has produced false positives for Moonlight HDR + // (washed desktop); only OSTypes in the explicit `true` branch above are treated as full range. + return false + } + } + func setupLowLevelTexture() { DispatchQueue.main.sync { if videoWidth == 0 || videoHeight == 0 { @@ -431,9 +860,34 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { } }() + // ChromaHalo: downsampled queue (see `ChromaHaloDownsample.mipShift`) + self.chromaHaloQueue = { + let mipShift = ChromaHaloDownsample.mipShift + let cw = max(1, videoWidth >> mipShift) + let ch = max(1, videoHeight >> mipShift) + let descriptor = TextureResource.DrawableQueue.Descriptor( + pixelFormat: metalFormat, + width: cw, + height: ch, + usage: [.renderTarget, .shaderWrite, .shaderRead], + mipmapsMode: .none + ) + do { + let q = try TextureResource.DrawableQueue(descriptor) + q.allowsNextDrawableTimeout = true + return q + } catch { + print("DrawableVideoDecoder: Could not create ChromaHalo queue: \(error)") + return nil + } + }() + + self.chromaHaloScratchA = nil + self.chromaHaloScratchB = nil + region = MTLRegionMake2D(0, 0, videoWidth, videoHeight) - self.callbackToRender(self.drawableQueue!, (videoWidth, videoHeight)) + self.callbackToRender(self.drawableQueue!, self.chromaHaloQueue, (videoWidth, videoHeight)) } } @@ -518,7 +972,13 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { textureCache = nil copyPipelineState = nil copyPipelineFormat = nil - + chromaHaloRimPipelineState = nil + chromaHaloBlurHPipelineState = nil + chromaHaloBlurVPipelineState = nil + chromaHaloScratchA = nil + chromaHaloScratchB = nil + prevChromaHaloTexture = nil + print("DrawableVideoDecoder: Stopped and cleaned up all state") } @@ -587,7 +1047,7 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder as String: true, ] - // Don’t force a pixel format for HDR; allow native YUV bi-planar output + // HDR: request 10-bit bi-planar YUV. AV1 HDR: also tag the decoder pixel pool (original fork parity). var attributes: [CFString: Any] = [ kCVPixelBufferMetalCompatibilityKey: true, kCVPixelBufferPoolMinimumBufferCountKey: 3 @@ -614,6 +1074,11 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { return DR_NEED_IDR } + guard let session = session else { + free(dataPtr) + return DR_NEED_IDR + } + guard let sampleBuffer = createSampleBuffer( dataPtr: dataPtr, length: Int(length), @@ -624,7 +1089,7 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { return DR_NEED_IDR } - VTDecompressionSessionDecodeFrame(session!, sampleBuffer: sampleBuffer, flags: [._EnableAsynchronousDecompression], frameRefcon: nil, infoFlagsOut: nil) + VTDecompressionSessionDecodeFrame(session, sampleBuffer: sampleBuffer, flags: [._EnableAsynchronousDecompression], frameRefcon: nil, infoFlagsOut: nil) if decodeUnit.pointee.frameType == FRAME_TYPE_IDR { callbacks.videoContentShown() @@ -655,8 +1120,8 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { let frameData = Data(bytesNoCopy: dataPtr, count: Int(length), deallocator: .none) return createAV1FormatDescriptionForIDRFrame(frameData) } else { - // Unsupported - abort() + // Unsupported video format - return nil to request IDR + return nil } } @@ -732,7 +1197,11 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { do { return try frameData.withUnsafeBytes { (buffer: UnsafeRawBufferPointer) -> CMVideoFormatDescription in var mutableBuffer = UnsafeMutableBufferPointer(mutating: buffer.bindMemory(to: UInt8.self)) - let fd = try CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C(mutableBuffer) + let fd = try CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C( + mutableBuffer, + masteringDisplayColorVolume: masteringDisplayColorVolume, + contentLightLevelInfo: contentLightLevelInfo + ) return fd as CMVideoFormatDescription } } catch { @@ -873,7 +1342,12 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { // replacing the 3/4 nalu headers with a 4 byte length, so add an extra byte on top of the original length for each 3-byte nalu header let blockBufferLength = buffer.count + naluIndices.filter(\.threeByteHeader).count - let blockBuffer = try! CMBlockBuffer(length: blockBufferLength, flags: .assureMemoryNow) + + // Safe allocation with graceful frame dropping on OOM + guard let blockBuffer = try? CMBlockBuffer(length: blockBufferLength, flags: .assureMemoryNow) else { + print("⚠️ Failed to allocate CMBlockBuffer (\(blockBufferLength) bytes) - dropping frame due to memory pressure") + return nil + } var contiguousBuffer: CMBlockBuffer! if !CMBlockBufferIsRangeContiguous(blockBuffer, atOffset: 0, length: 0) { @@ -919,7 +1393,13 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { var offset = 0 let umrbp = UnsafeMutableRawBufferPointer(start: buffer.baseAddress, count: buffer.count) - let bb = try! CMBlockBuffer(buffer: umrbp, deallocator: { _, _ in buffer.deallocate() }, flags: .assureMemoryNow) + + // Safe allocation with graceful frame dropping on OOM + guard let bb = try? CMBlockBuffer(buffer: umrbp, deallocator: { _, _ in buffer.deallocate() }, flags: .assureMemoryNow) else { + print("⚠️ Failed to create CMBlockBuffer from buffer (\(buffer.count) bytes) - dropping frame due to memory pressure") + buffer.deallocate() + return nil + } let pointer = UnsafeMutablePointer(OpaquePointer(buffer.baseAddress!))! for index in naluIndices { @@ -932,10 +1412,6 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { offset += index.payloadSize } - if bb == nil { - buffer.deallocate() - } - return bb } @@ -1009,6 +1485,32 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { } } + /// Sync constants with `Shaders.metal` `chromaHaloRimFragment` / `Reactive1ChromosphereReach`. + private func chromaHaloTemporalFrameMix() -> Float { + let kBase: Float = 1.55 + let kSpan: Float = 1.93 + let reachT = min(1, max(0, (chromaHaloScale - kBase) / max(kSpan, 1e-4))) + return 0.27 + reachT * 0.055 + } + + private func ensureChromaHaloBlurScratchMatches(_ haloTex: MTLTexture) { + let w = haloTex.width + let h = haloTex.height + let pf = haloTex.pixelFormat + if let a = chromaHaloScratchA, + a.width == w, a.height == h, a.pixelFormat == pf, + let b = chromaHaloScratchB, + b.width == w, b.height == h, b.pixelFormat == pf { + return + } + chromaHaloScratchA = nil + chromaHaloScratchB = nil + let desc = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: pf, width: w, height: h, mipmapped: false) + desc.usage = [.shaderRead, .renderTarget] + chromaHaloScratchA = mtlDevice.makeTexture(descriptor: desc) + chromaHaloScratchB = mtlDevice.makeTexture(descriptor: desc) + } + // Builds a simple copy pipeline with no input buffers, just // draw 4 vertices to copy the input texture to the output private func buildCopyPipeline(fragment: String) -> MTLRenderPipelineState? { @@ -1048,6 +1550,7 @@ class DrawableVideoDecoder: NSObject, AnyVideoDecoderRenderer { contrast: 1.0, saturation: 1.0, brightness: 0.0, + pqExposure: 1.0, mode: 0 ) @@ -1198,4 +1701,4 @@ let DR_NEED_IDR: Int32 = -1 // func LiGetHdrMetadata(_ hdr: UnsafeMutablePointer) -> Bool { // // Stub, return false for now // return false -// } \ No newline at end of file +// } diff --git a/Moonlight Vision/EnvironmentPickerView.swift b/Moonlight Vision/EnvironmentPickerView.swift new file mode 100644 index 000000000..abf877881 --- /dev/null +++ b/Moonlight Vision/EnvironmentPickerView.swift @@ -0,0 +1,269 @@ +// +// EnvironmentPickerView.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import SwiftUI + +struct EnvironmentPickerView: View { + @Binding var environmentSphereLevel: Int + @Binding var newsetLevel: Int + @Binding var isPresented: Bool + @Binding var dimLevel: Int + + // Dependencies to fetch names (Unused but kept for compatibility) + var extraSkyboxNames: [String] + + // Derived Data + private struct EnvItem: Identifiable { + let id: String + let displayName: String + let type: EnvType + let index: Int // The 1-based index expected by the main view logic (0 for Disable) + } + + private enum EnvType { + case disable + case builtin + } + + @State private var currentPage = 0 + private let itemsPerPage = 6 + + private var allItems: [EnvItem] { + var items: [EnvItem] = [] + + // 1. "Disable Environment" option + items.append(EnvItem(id: "disable", displayName: "None", type: .disable, index: 0)) + + // 2. Built-in (environmentSphereLevel 1...N) + // This strictly displays only the 21 named environments + let builtins = SkyboxCatalog.builtinNames + for (i, name) in builtins.enumerated() { + let displayName = SkyboxCatalog.displayNames[name] ?? name.uppercased() + items.append(EnvItem(id: "b-\(i)", displayName: displayName, type: .builtin, index: i + 1)) + } + + return items + } + + private var pageCount: Int { + max(1, Int(ceil(Double(allItems.count) / Double(itemsPerPage)))) + } + + private var currentItems: [EnvItem] { + let start = currentPage * itemsPerPage + let end = min(start + itemsPerPage, allItems.count) + guard start < end else { return [] } + return Array(allItems[start.. 0 ? .white : .white.opacity(0.2)) + } + .buttonStyle(.plain) + .disabled(currentPage == 0) + + HStack(spacing: 8) { + ForEach(0..= pageCount - 1) + } + } + .padding(32) + .background( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: 20, x: 0, y: 10) + ) + .overlay( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) + .frame(width: 700) + .onAppear { + scrollToSelection() + } + } + + private func scrollToSelection() { + // Find which item is currently selected + var selectedItem: EnvItem? + + if newsetLevel == 0 && environmentSphereLevel == 0 { + // Disabled state selected + selectedItem = allItems.first { $0.type == .disable } + } else if newsetLevel > 0 { + // Newset active, but hidden from this list + selectedItem = nil + } else if environmentSphereLevel > 0 { + // Check builtin items + selectedItem = allItems.first { $0.type == .builtin && $0.index == environmentSphereLevel } + } + + if let item = selectedItem, let idx = allItems.firstIndex(where: { $0.id == item.id }) { + currentPage = idx / itemsPerPage + } + } + + private func isSelected(_ item: EnvItem) -> Bool { + if item.type == .disable { + return newsetLevel == 0 && environmentSphereLevel == 0 + } + return newsetLevel == 0 && environmentSphereLevel == item.index + } + + private func selectItem(_ item: EnvItem) { + if item.type == .disable { + newsetLevel = 0 + environmentSphereLevel = 0 + // Close when disabling + withAnimation { + isPresented = false + } + } else { + // Reset newset to 0 + newsetLevel = 0 + // Set the sphere level + environmentSphereLevel = item.index + + // Reset dimming when selecting an environment (they're mutually exclusive) + dimLevel = 0 + + // Keep picker open to allow cycling + } + } +} + +private struct EnvironmentThumbnailView: View { + let displayName: String + + var body: some View { + // Remove spaces from display name for asset lookup (e.g., "Full Moon" -> "Fullmoon") + let thumbnailName = resolveThumbnailName() + + if let _ = UIImage(named: thumbnailName) { + Image(thumbnailName) + .resizable() + .aspectRatio(contentMode: .fill) + } else { + Image("placeholderthumb") + .resizable() + .aspectRatio(contentMode: .fill) + } + } + + private func resolveThumbnailName() -> String { + let baseName = "thumb_\(displayName.replacingOccurrences(of: " ", with: ""))" + + // Special case: "Full Moon" -> "Fullmoon" (lowercase 'm' in moon) + if baseName == "thumb_FullMoon" { + return "thumb_Fullmoon" + } + + // Try case-sensitive first + if UIImage(named: baseName) != nil { + return baseName + } + + // Try lowercase fallback + let lowerName = baseName.lowercased() + if UIImage(named: lowerName) != nil { + return lowerName + } + + return baseName + } +} diff --git a/Moonlight Vision/FlatDisplayStreamView.swift b/Moonlight Vision/FlatDisplayStreamView.swift new file mode 100644 index 000000000..c90a0f406 --- /dev/null +++ b/Moonlight Vision/FlatDisplayStreamView.swift @@ -0,0 +1,2702 @@ +// +// FloatingMicButton.swift +// Neo Moonlight +// +// Created by NeoVectorX + + +import SwiftUI +import RealityKit +import simd +import GameController +import ARKit +import UIKit +import AVFoundation +import QuartzCore +import os + +// MARK: - Gaze Control Calibration + +// Small upward offset to compensate for eye-to-cursor alignment in Flat Display +// Positive value moves cursor UP (compensates for cursor appearing too low) +let FLAT_GAZE_VERTICAL_OFFSET: CGFloat = 0.02 // 2% upward adjustment + +// MARK: - Thread-Safe HDR Settings + +final class FlatThreadSafeHDRSettings: @unchecked Sendable { + private var params: HDRParams + private let lock = NSLock() + init(params: HDRParams) { self.params = params } + var value: HDRParams { + get { lock.lock(); defer { lock.unlock() }; return params } + set { lock.lock(); defer { lock.unlock() }; params = newValue } + } +} + +/// SBS 3D confirmation card — proportional sizing (default × 0.8 = −20%). +private enum SBSConfirmPanelMetrics { + static let scale: CGFloat = 0.8 + static func pt(_ base: CGFloat) -> CGFloat { base * scale } +} + +/// Flat HDR menu is SwiftUI ornament; SBS/other center dialogs live on RK attachments `position.z ≈ 0.15`. This pushes the ornament forward in pts so perceived depth matches. +private enum FlatHDRPanelMetrics { + static let ornamentForwardOffsetZPts: CGFloat = 150 +} + +// MARK: - Frame Mailbox (Thread-Safe Handoff) - Flat Display Version +// Uses OSAllocatedUnfairLock for nanosecond-level access - critical for 120Hz M5 support. +final class FlatFrameMailbox: @unchecked Sendable { + // OSAllocatedUnfairLock spins briefly instead of sleeping the thread. + // This prevents missed V-Sync deadlines at 120Hz (8.3ms budget). + // The lock protects the optional DrawableQueue state directly. + private let lock = OSAllocatedUnfairLock(initialState: nil) + + func deposit(_ drawable: TextureResource.DrawableQueue) { + lock.withLock { $0 = drawable } + } + + func collect() -> TextureResource.DrawableQueue? { + lock.withLock { + let d = $0 + $0 = nil + return d + } + } +} + +// MARK: - Input Capture View + +struct FlatInputCaptureView: UIViewRepresentable { + let controllerSupport: ControllerSupport + @Binding var showKeyboard: Bool + var streamConfig: StreamConfiguration + var absoluteTouchMode: Bool + var hideSystemCursor: Bool + var reclaimFocusTrigger: Int + var isHandGazeInputDisabled: Bool + var onReturnPressed: (() -> Void)? + + func makeUIView(context: Context) -> FlatInputCaptureUIView { + let view = FlatInputCaptureUIView() + view.controllerSupport = controllerSupport + view.streamConfig = streamConfig + view.absoluteTouchMode = absoluteTouchMode + view.showVirtualKeyboard = showKeyboard + view.hideSystemCursor = hideSystemCursor + view.isHandGazeInputDisabled = isHandGazeInputDisabled + view.onReturnPressed = onReturnPressed + view.isMultipleTouchEnabled = true + view.isUserInteractionEnabled = true + view.backgroundColor = UIColor.black.withAlphaComponent(0.01) + + // Become first responder immediately to capture keyboard input + DispatchQueue.main.async { + view.becomeFirstResponder() + } + + return view + } + + func updateUIView(_ uiView: FlatInputCaptureUIView, context: Context) { + uiView.streamConfig = streamConfig + uiView.absoluteTouchMode = absoluteTouchMode + uiView.hideSystemCursor = hideSystemCursor + uiView.isHandGazeInputDisabled = isHandGazeInputDisabled + uiView.onReturnPressed = onReturnPressed + + if uiView.showVirtualKeyboard != showKeyboard { + uiView.showVirtualKeyboard = showKeyboard + } + + // Only reclaim first responder when explicitly triggered (e.g., scenePhase became .active) + // This prevents stealing keyboard focus from other visionOS apps + if uiView.lastReclaimTrigger != reclaimFocusTrigger { + uiView.lastReclaimTrigger = reclaimFocusTrigger + if !uiView.isFirstResponder { + _ = uiView.becomeFirstResponder() + } + } + } +} + +class FlatInputCaptureUIView: UIView, UIKeyInput, UIPointerInteractionDelegate { + var controllerSupport: ControllerSupport? + var streamConfig: StreamConfiguration? + var absoluteTouchMode: Bool = true + var isHandGazeInputDisabled: Bool = false + var lastReclaimTrigger: Int = 0 + var onReturnPressed: (() -> Void)? + var showVirtualKeyboard: Bool = false { + didSet { + if oldValue != showVirtualKeyboard { + reloadInputViews() + } + } + } + + var hideSystemCursor: Bool = false { + didSet { + if oldValue != hideSystemCursor { + // Remove and re-add interaction to force immediate style update + if let interaction = self.interactions.first(where: { $0 is UIPointerInteraction }) { + self.removeInteraction(interaction) + self.addInteraction(interaction) + } + } + } + } + + // Suppress software keyboard if showVirtualKeyboard is false, but still allow hardware input + override var inputView: UIView? { + return showVirtualKeyboard ? nil : UIView() + } + + // Touch state for Absolute Touch (Touchscreen) Mode + private var longPressTimer: Timer? + private var lastTouchDownLocation: CGPoint = .zero + private var lastTouchUpLocation: CGPoint = .zero + private var lastTouchUpTimestamp: TimeInterval = 0 + + // Touch state for Relative Touch (Trackpad) Mode + private var lastTouchPosition: CGPoint? = nil + private var touchStartPosition: CGPoint? = nil + private var touchStartTime: TimeInterval = 0 + private var hasMovedInTouch = false + private var touchClickTimer: Timer? = nil + private var touchModeInitialized = false + private let touchTapThreshold: CGFloat = 0.01 // 1% movement = drag, not tap + private let touchTapTimeThreshold: TimeInterval = 0.2 // 200ms = quick tap + + // Internal cursor tracking for relative movement + private var currentMouseX: Int16 = 0 + private var currentMouseY: Int16 = 0 + + // Button action constants - MUST match Limelight.h exactly! + private let BUTTON_ACTION_PRESS: Int8 = 0x07 + private let BUTTON_ACTION_RELEASE: Int8 = 0x08 + private let BUTTON_LEFT: Int32 = 0x01 + private let BUTTON_RIGHT: Int32 = 0x03 + + // Constants from AbsoluteTouchHandler - matching UIKit exactly + private let longPressActivationDelay: TimeInterval = 0.650 + private let longPressActivationDelta: CGFloat = 0.01 // 1% of screen (normalized) + private let doubleTapDeadZoneDelay: TimeInterval = 0.250 // 250ms + private let doubleTapDeadZoneDelta: CGFloat = 0.025 // 2.5% of screen (normalized) + + override init(frame: CGRect) { + super.init(frame: frame) + setupGestures() + setupPointerInteraction() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupGestures() + setupPointerInteraction() + } + + private func setupGestures() { + // We rely on standard touchesBegan/Moved/Ended for "Look and Pinch". + DispatchQueue.main.async { + self.controllerSupport?.attachGCEventInteraction(to: self) + } + } + + private func setupPointerInteraction() { + let interaction = UIPointerInteraction(delegate: self) + self.addInteraction(interaction) + } + + func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? { + if hideSystemCursor { + return UIPointerStyle.hidden() + } + return nil + } + + func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? { + // This is called when the pointer moves - send the mouse position + let location = request.location + print("[MOUSE DEBUG] Pointer moved to: (\(location.x), \(location.y))") + sendMousePosition(x: location.x, y: location.y) + return defaultRegion + } + + // CRITICAL: Override hitTest to allow touches to pass through to ornaments + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + guard isUserInteractionEnabled else { return nil } + + // No exclusion needed - ornaments are in a separate layer above + if bounds.contains(point) { + return self + } + + return nil + } + + @objc private func onLongPressStart() { + // Convert Left Click/Hold into Right Click + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT) + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_RIGHT) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + // Reclaim first responder on touch if lost (e.g., after switching to another app) + if !isFirstResponder { + _ = becomeFirstResponder() + } + + // Ignore when hand/gaze input is disabled + guard !isHandGazeInputDisabled else { return } + + // Ignore touch down events with more than one finger + guard let allTouches = event?.allTouches, allTouches.count == 1 else { + return + } + + guard let touch = touches.first else { return } + let touchLocation = touch.location(in: self) + + if absoluteTouchMode { + // GAZE CONTROL MODE: Absolute positioning (eye tracking + pinch) + // Calculate normalized coordinates for deadzone comparison + let normalizedX = touchLocation.x / bounds.width + let normalizedY = touchLocation.y / bounds.height + let lastNormalizedX = lastTouchUpLocation.x / bounds.width + let lastNormalizedY = lastTouchUpLocation.y / bounds.height + + let dx = normalizedX - lastNormalizedX + let dy = normalizedY - lastNormalizedY + let distance = sqrt(dx * dx + dy * dy) + + let timeDelta = touch.timestamp - lastTouchUpTimestamp + + // Don't reposition for finger down events within the deadzone + if timeDelta > doubleTapDeadZoneDelay || distance > doubleTapDeadZoneDelta { + sendMousePosition(x: touchLocation.x, y: touchLocation.y) + } + + // Press the left button down + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT) + + // Start the long press timer + longPressTimer?.invalidate() + longPressTimer = Timer.scheduledTimer(withTimeInterval: longPressActivationDelay, repeats: false) { [weak self] _ in + self?.onLongPressStart() + } + + lastTouchDownLocation = touchLocation + } else { + // TOUCH CONTROL MODE: Relative movement (trackpad style) + lastTouchPosition = touchLocation + touchStartPosition = touchLocation + touchStartTime = touch.timestamp + hasMovedInTouch = false + + // On first touch in Touch mode, center the cursor + if !touchModeInitialized { + centerCursor() + touchModeInitialized = true + } + + // DON'T press any button yet - wait to see if it's a tap or drag + touchClickTimer?.invalidate() + touchClickTimer = Timer.scheduledTimer(withTimeInterval: touchTapTimeThreshold, repeats: false) { [weak self] _ in + guard let self = self else { return } + // If still holding after 200ms and haven't moved much, it's a click-drag + if !self.hasMovedInTouch { + LiSendMouseButtonEvent(self.BUTTON_ACTION_PRESS, self.BUTTON_LEFT) + } + } + } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + // Ignore when hand/gaze input is disabled + guard !isHandGazeInputDisabled else { return } + + // Ignore touch move events with more than one finger + guard let allTouches = event?.allTouches, allTouches.count == 1 else { + return + } + + guard let touch = touches.first else { return } + let touchLocation = touch.location(in: self) + + if absoluteTouchMode { + // GAZE CONTROL MODE: Absolute positioning + // Check if moved far enough to cancel long press + let normalizedX = touchLocation.x / bounds.width + let normalizedY = touchLocation.y / bounds.height + let lastNormalizedX = lastTouchDownLocation.x / bounds.width + let lastNormalizedY = lastTouchDownLocation.y / bounds.height + + let dx = normalizedX - lastNormalizedX + let dy = normalizedY - lastNormalizedY + let distance = sqrt(dx * dx + dy * dy) + + if distance > longPressActivationDelta { + longPressTimer?.invalidate() + longPressTimer = nil + } + + // CRITICAL: Always update cursor position in touchesMoved for Absolute Mode + sendMousePosition(x: touchLocation.x, y: touchLocation.y) + } else { + // TOUCH CONTROL MODE: Relative movement (trackpad style) + guard let lastPos = lastTouchPosition, + let startPos = touchStartPosition else { return } + + // Calculate delta + let deltaX = touchLocation.x - lastPos.x + let deltaY = touchLocation.y - lastPos.y + + // Check if we've moved significantly from start + let totalDX = touchLocation.x - startPos.x + let totalDY = touchLocation.y - startPos.y + let totalDist = sqrt(totalDX * totalDX + totalDY * totalDY) + let normalizedDist = totalDist / bounds.width + + if normalizedDist > touchTapThreshold { + hasMovedInTouch = true + // Cancel the click timer - this is a drag, not a tap + touchClickTimer?.invalidate() + touchClickTimer = nil + } + + // Send relative mouse movement + sendRelativeMouseMovement(dx: deltaX, dy: deltaY) + + lastTouchPosition = touchLocation + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + // Ignore when hand/gaze input is disabled + guard !isHandGazeInputDisabled else { return } + + guard let allTouches = event?.allTouches, allTouches.count == touches.count else { + return + } + + if absoluteTouchMode { + // GAZE CONTROL MODE: Release buttons + longPressTimer?.invalidate() + longPressTimer = nil + + // Left button up + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT) + + // Raise right button too in case we triggered a long press gesture + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT) + + if let touch = touches.first { + lastTouchUpLocation = touch.location(in: self) + lastTouchUpTimestamp = touch.timestamp + } + } else { + // TOUCH CONTROL MODE: Handle tap vs drag + guard let touch = touches.first else { return } + let holdDuration = touch.timestamp - touchStartTime + + // Cancel timers + touchClickTimer?.invalidate() + touchClickTimer = nil + longPressTimer?.invalidate() + longPressTimer = nil + + // Determine what kind of gesture this was + if !hasMovedInTouch && holdDuration < touchTapTimeThreshold { + // Quick tap without movement = CLICK + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT) + // Release after a tiny delay + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [weak self] in + guard let self = self else { return } + LiSendMouseButtonEvent(self.BUTTON_ACTION_RELEASE, self.BUTTON_LEFT) + } + } else if !hasMovedInTouch && holdDuration >= touchTapTimeThreshold { + // Held still for a while = click was already sent by timer, now release + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT) + } else { + // Movement happened = just cursor movement, no click needed + // (unless click timer fired for click-drag, in which case release it) + if holdDuration >= touchTapTimeThreshold { + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT) + } + } + + lastTouchPosition = nil + touchStartPosition = nil + hasMovedInTouch = false + } + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + touchesEnded(touches, with: event) + } + + // Get the actual video area size (aspect-fitted within the view) + private func getVideoAreaSize() -> CGSize { + guard let config = streamConfig else { return bounds.size } + + let streamAspectRatio = CGFloat(config.width) / CGFloat(config.height) + + if bounds.size.width > bounds.size.height * streamAspectRatio { + // View is wider than needed (pillarboxing) + return CGSize(width: bounds.size.height * streamAspectRatio, height: bounds.size.height) + } else { + // View is taller than needed (letterboxing) + return CGSize(width: bounds.size.width, height: bounds.size.width / streamAspectRatio) + } + } + + // Adjust coordinates to be relative to the centered video area + private func adjustCoordinatesForVideoArea(_ point: CGPoint) -> CGPoint { + let x = point.x - bounds.origin.x + let y = point.y - bounds.origin.y + + // Calculate centered video area + let videoSize = getVideoAreaSize() + let videoOrigin = CGPoint( + x: bounds.size.width / 2 - videoSize.width / 2, + y: bounds.size.height / 2 - videoSize.height / 2 + ) + + // Clamp to video region and return relative to video origin + let clampedX = min(max(x, videoOrigin.x), videoOrigin.x + videoSize.width) - videoOrigin.x + let clampedY = min(max(y, videoOrigin.y), videoOrigin.y + videoSize.height) - videoOrigin.y + + return CGPoint(x: clampedX, y: clampedY) + } + + private func sendRelativeMouseMovement(dx: CGFloat, dy: CGFloat) { + guard let config = streamConfig else { return } + + // Scale factor for sensitivity (adjust as needed) + let sensitivity: CGFloat = 2.5 + let scaledDX = dx * sensitivity + let scaledDY = dy * sensitivity + + // Update internal cursor position + currentMouseX = Int16(max(0, min(CGFloat(config.width), CGFloat(currentMouseX) + scaledDX))) + currentMouseY = Int16(max(0, min(CGFloat(config.height), CGFloat(currentMouseY) + scaledDY))) + + LiSendMousePositionEvent(currentMouseX, currentMouseY, Int16(config.width), Int16(config.height)) + } + + private func centerCursor() { + guard let config = streamConfig else { return } + + // Calculate exact center pixels + let centerX = Int16(config.width / 2) + let centerY = Int16(config.height / 2) + + // Update internal tracking + currentMouseX = centerX + currentMouseY = centerY + + print("[Touch Mode] Centering cursor: \(centerX), \(centerY)") + LiSendMousePositionEvent(centerX, centerY, Int16(config.width), Int16(config.height)) + } + + private func sendMousePosition(x: CGFloat, y: CGFloat) { + guard let config = streamConfig else { return } + + // DEBUG: Print actual bounds and stream config + print("[MOUSE DEBUG] Input: (\(x), \(y)) | Bounds: \(bounds.size) | Stream: \(config.width)x\(config.height)") + + // Adjust coordinates to video area (handles letterboxing/pillarboxing) + let adjustedPoint = adjustCoordinatesForVideoArea(CGPoint(x: x, y: y)) + + // Now map from video area coordinates to stream pixel coordinates + let videoSize = getVideoAreaSize() + print("[MOUSE DEBUG] VideoSize: \(videoSize) | Adjusted: (\(adjustedPoint.x), \(adjustedPoint.y))") + + let normX = adjustedPoint.x / videoSize.width + // Apply vertical offset to compensate for eye-to-cursor alignment + // Subtracting moves cursor UP (since Y increases downward) + let normY = (adjustedPoint.y / videoSize.height) - FLAT_GAZE_VERTICAL_OFFSET + + let streamX = normX * CGFloat(config.width) + let streamY = normY * CGFloat(config.height) + + let clampedX = Int16(min(max(streamX, 0), CGFloat(config.width - 1))) + let clampedY = Int16(min(max(streamY, 0), CGFloat(config.height - 1))) + + print("[MOUSE DEBUG] Stream coords: (\(clampedX), \(clampedY))") + + LiSendMousePositionEvent(clampedX, clampedY, Int16(config.width), Int16(config.height)) + } + + override var canBecomeFocused: Bool { true } + override var canBecomeFirstResponder: Bool { true } + var hasText: Bool { true } + + func insertText(_ text: String) { + // Handle Return/Enter key specially - it comes as "\n" or "\r" + if text == "\n" || text == "\r" { + print("[Keyboard] Return key pressed") + // Send Enter key: keycode 0x0D (13), scancode for Enter + LiSendKeyboardEvent(0x0D, 0x03, 0) // Key Down + usleep(50 * 1000) + LiSendKeyboardEvent(0x0D, 0x04, 0) // Key Up + + // Notify parent view to close keyboard + DispatchQueue.main.async { [weak self] in + self?.onReturnPressed?() + } + return + } + + // For all other characters, send as UTF-8 text + let cString = text.cString(using: .utf8) + cString?.withUnsafeBufferPointer { ptr in + if let base = ptr.baseAddress { + LiSendUtf8TextEvent(base, UInt32(text.utf8.count)) + } + } + } + + func deleteBackward() { + LiSendKeyboardEvent(0x08, 0x03, 0) + usleep(50 * 1000) + LiSendKeyboardEvent(0x08, 0x04, 0) + } +} + +// MARK: - Main View + +struct FlatDisplayStreamView: View { + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.scenePhase) private var scenePhase + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.pushWindow) private var pushWindow + + @Binding var streamConfig: StreamConfiguration? + var needsHdr: Bool + + var body: some View { + if let config = streamConfig { + // SESSION TOKEN GUARD: If this view's sessionUUID doesn't match the + // ViewModel's activeSessionToken, this is a "ghost" view from a dying + // window. Render black and skip all logic to prevent resource collision. + if config.sessionUUID == viewModel.activeSessionToken { + _FlatDisplayStreamView( + streamConfig: Binding( + get: { config }, + set: { streamConfig = $0 } + ), + needsHdr: needsHdr + ) + // CRITICAL SAFETY NET: Force SwiftUI to destroy the inner view (which holds + // all @State including streamMan) when sessionUUID changes. This prevents + // "ghost" views from persisting with stale state after a session change. + .id(config.sessionUUID) + } else { + // Ghost view detected - render black and do nothing + Color.black + .ignoresSafeArea() + .onAppear { + debugLog("👻 Ghost view detected (UUID \(config.sessionUUID) != active \(viewModel.activeSessionToken)). Suppressing.") + recoverFromStaleWindow() + } + } + } else { + // During window transition (dismiss -> wait -> open), config may be nil. + // Show black screen to prevent zombie view from initializing. + Color.black + .ignoresSafeArea() + .onAppear { + recoverFromStaleWindow() + } + } + } + + private func recoverFromStaleWindow() { + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + if !viewModel.activelyStreaming && viewModel.streamState == .idle { + print("[FlatDisplay] Stale window detected - dismissing and opening mainView") + openWindow(id: "mainView") + dismissWindow(id: "flatDisplayWindow") + } + } + } +} + +struct _FlatDisplayStreamView: View { + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.scenePhase) private var scenePhase + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.pushWindow) private var pushWindow + + @Binding var streamConfig: StreamConfiguration + var needsHdr: Bool + + @State private var streamMan: StreamManager? + @State private var controllerSupport: ControllerSupport? + @State private var isHandGazeInputDisabled = false // Long press on control mode button to disable hand/gaze input + @ObservedObject var connectionCallbacks: ObservableConnectionManager = .init() + @ObservedObject private var coopCoordinator = CoopSessionCoordinator.shared + + @State private var texture: TextureResource + @State private var screen: ModelEntity = ModelEntity() + @State private var surfaceMaterial: ShaderGraphMaterial? + + // Frame Mailbox for stutter-free, dizziness-free video display + private let frameMailbox = FlatFrameMailbox() + + @State private var lastUpdateSize: CGSize = .zero + @State private var lastPhysicalWidth: Float = 0 + @AppStorage("removeRoundedCorners") private var removeRoundedCorners: Bool = false + @AppStorage("darkControlsMode") private var darkControlsMode: Bool = false + + @State private var safeHDRSettings = FlatThreadSafeHDRSettings( + params: HDRParams(boost: 1.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, pqExposure: 1.0, mode: 0) + ) + @StateObject private var hdrParams = HDRTestParams() + @StateObject private var hdrPanelSettings = HDRSettings() + + @State private var showVirtualKeyboard = false + @State private var keyboardInput: String = " " + @FocusState private var isKeyboardFocused: Bool + @State private var hideControls: Bool = true + @State private var controlsExpanded: Bool = false + @State private var hideTimer: Timer? + @State private var hasPerformedTeardown = false + @State private var windowDecommissioned = false + @State private var spatialAudioMode: Bool = true + @State private var soundStageSize: SoundStageSize = .medium + @State private var statsOverlayText: String = "" + @State private var statsTimer: Timer? + @State private var controlsHighlighted: Bool = false + @State private var isMenuOpen = false + @State private var renderGateOpen: Bool = true + @State private var dimLevel: Int = 0 + @State private var correctedResolution: (Int, Int)? = nil + @State private var correctedResolutionVersion: Int = 0 + @State private var needsResume = false + @State private var videoMode: VideoMode = .standard2D + @State private var show3DConfirm = false + @State private var showHDRPanel = false + + @State private var showInlinePresetOverlay: Bool = false + @State private var presetOverlayText: String = "" + @State private var presetOverlayIcon: String = "camera.filters" + @State private var presetOverlayTimer: Timer? + @State private var presetCooldownUntil: Date? = nil + + // Co-op invite button state + @State private var inviteButtonSent: Bool = false + @State private var showDisconnectConfirm: Bool = false + + @State private var hostingWindow: UIWindow? + + @State private var isHDRTexture: Bool = false + + @State private var streamEpoch: Int = 0 + @State private var startingStream: Bool = false + @State private var firstFrameSeenEpoch: Int = -1 + @State private var watchdogIDR1: DispatchWorkItem? + @State private var watchdogIDR2: DispatchWorkItem? + @State private var guestAggressiveIDRTimer: Timer? + @State private var reclaimKeyboardFocus: Int = 0 + + let brandPurple = Color(red: 0.7, green: 0.3, blue: 0.9) + + /// Detects if the stream is a typical SBS 3D format (32:9 aspect ratio) + var isSBSVideo: Bool { + let ratio = Float(streamConfig.width) / Float(streamConfig.height) + return abs(ratio - (32.0 / 9.0)) < 0.01 + } + + var screenAspect: Float { + if let (w, h) = correctedResolution { + // When SBS 3D mode is enabled and video is 32:9, use half-width for correct aspect + if videoMode == .sideBySide3D, abs(Float(w) / Float(h) - (32.0 / 9.0)) < 0.01 { + return Float(h) / Float(w / 2) + } else { + return Float(h) / Float(w) + } + } else { + // When SBS 3D mode is enabled and video is 32:9, use half-width for correct aspect + if videoMode == .sideBySide3D && isSBSVideo { + return Float(streamConfig.height) / Float(streamConfig.width / 2) + } else { + return Float(streamConfig.height) / Float(streamConfig.width) + } + } + } + + var cornerRadiusFraction: Float { removeRoundedCorners ? 0.0 : 0.012 } + + init(streamConfig: Binding, needsHdr: Bool) { + self._streamConfig = streamConfig + self.needsHdr = needsHdr + + // DEBUG: Log view creation with sessionUUID to verify fresh instance + debugLog("🟢 INIT - sessionUUID: \(streamConfig.wrappedValue.sessionUUID)") + + let width = Int(streamConfig.wrappedValue.width) + let height = Int(streamConfig.wrappedValue.height) + let bytesPerPixel = needsHdr ? 8 : 4 + let data = Data(count: bytesPerPixel * width * height) + + // Safe texture creation with fallback + let initialTexture: TextureResource + do { + initialTexture = try TextureResource( + dimensions: .dimensions(width: width, height: height), + format: .raw(pixelFormat: needsHdr ? .rgba16Float : .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: data, bytesPerRow: bytesPerPixel * width)]) + ) + } catch { + print("⚠️ Failed to create initial texture: \(error). Using fallback.") + let fallbackData = Data(count: 4) + initialTexture = try! TextureResource( + dimensions: .dimensions(width: 1, height: 1), + format: .raw(pixelFormat: .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: fallbackData, bytesPerRow: 4)]) + ) + } + _texture = State(initialValue: initialTexture) + + _isHDRTexture = State(initialValue: needsHdr) + } + + // Calculate aspect-fit size for the video within a container + private func calculateVideoSize(containerSize: CGSize) -> CGSize { + let streamAspect = CGFloat(streamConfig.width) / CGFloat(streamConfig.height) + let containerAspect = containerSize.width / containerSize.height + + if containerAspect > streamAspect { + // Container wider - pillarbox + let height = containerSize.height + let width = height * streamAspect + return CGSize(width: width, height: height) + } else { + // Container taller - letterbox + let width = containerSize.width + let height = width / streamAspect + return CGSize(width: width, height: height) + } + } + + var body: some View { + let mainContent = ZStack { + GeometryReader { proxy in + let fitSize = calculateVideoSize(containerSize: proxy.size) + + ZStack { + RealityView { content, attachments in + setupRealityView(content: content, attachments: attachments) + + // --- THE HEARTBEAT FIX --- + // This forces RealityKit to check the mailbox at display refresh rate. + _ = content.subscribe(to: SceneEvents.Update.self) { _ in + if let newFrame = frameMailbox.collect() { + texture.replace(withDrawables: newFrame) + } + } + + } update: { content, attachments in + updateRealityView(content: content, attachments: attachments, size: fitSize) + } attachments: { + // THE INVISIBLE RULER - 100 points wide for calibration + Attachment(id: "calibrationRuler") { + Color.clear.frame(width: 100, height: 100) + } + + Attachment(id: "presetPopup") { + if showInlinePresetOverlay { + CenterPresetPopup( + text: presetOverlayText, + icon: presetOverlayIcon, + width: presetOverlayText.contains("Input Disabled") || presetOverlayText.contains("Input Enabled") ? 713 : 713 + ) + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + + Attachment(id: "coopJoinNotification") { + if coopCoordinator.friendJoinedNotification { + CenterPresetPopup(text: "Guest Joined!", icon: "person.badge.plus.fill") + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + + Attachment(id: "coopDisconnectNotification") { + if coopCoordinator.disconnectNotification { + CenterPresetPopup(text: coopCoordinator.disconnectMessage, icon: "person.badge.minus.fill") + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + + Attachment(id: "coopConnectingOverlay") { + // Show for co-op guests while waiting for video stream + if viewModel.isCoopSession && + viewModel.assignedControllerSlot == 1 && + viewModel.streamState == .starting { + CoopConnectingPopup() + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + + Attachment(id: "sbsConfirm") { + if show3DConfirm || showDisconnectConfirm { + confirmationsOverlay + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + } else { + Color.clear.frame(width: 1, height: 1) + } + } + } + .frame(width: fitSize.width, height: fitSize.height) + + if let support = controllerSupport { + FlatInputCaptureView( + controllerSupport: support, + showKeyboard: $showVirtualKeyboard, + streamConfig: streamConfig, + absoluteTouchMode: viewModel.streamSettings.absoluteTouchMode, + hideSystemCursor: true, // Always hide - PC renders its own cursor + reclaimFocusTrigger: reclaimKeyboardFocus, + isHandGazeInputDisabled: isHandGazeInputDisabled + ) + .frame(width: fitSize.width, height: fitSize.height) + .position(x: proxy.size.width / 2, y: proxy.size.height / 2) + .allowsHitTesting(viewModel.activelyStreaming) + } + } + .position(x: proxy.size.width / 2, y: proxy.size.height / 2) + } + + WindowResolver { win in + if hostingWindow !== win { + hostingWindow = win + } + } + .allowsHitTesting(false) + .frame(width: 0, height: 0) + + // Hidden TextField to trigger keyboard via @FocusState + TextField("", text: $keyboardInput) + .focused($isKeyboardFocused) + .opacity(0.001) + .frame(width: 1, height: 1) + .allowsHitTesting(false) + .onSubmit { + // When user hits return, send the Return key to the stream + print("[Keyboard] Submit detected, sending Return key") + let returnKey = "\n" + let cString = returnKey.cString(using: .utf8) + cString?.withUnsafeBufferPointer { ptr in + if let base = ptr.baseAddress { + LiSendUtf8TextEvent(base, UInt32(returnKey.utf8.count)) + } + } + + // Then close the keyboard and clear text + showVirtualKeyboard = false + isKeyboardFocused = false + keyboardInput = "" + } + } + .onTapGesture { + // Only handle tap if NOT in touchscreen mode + guard !viewModel.streamSettings.absoluteTouchMode else { return } + guard viewModel.activelyStreaming else { return } + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + fixAudioForCurrentMode() + } + .preferredSurroundingsEffect(dimLevel == 1 ? .systemDark : nil) + .persistentSystemOverlays(hideControls ? .hidden : .visible) + + let withOrnaments: AnyView = AnyView( + mainContent + .ornament(attachmentAnchor: OrnamentAttachmentAnchor.scene(.top), contentAlignment: Alignment.bottom) { + topControlsBar + .padding(.bottom, 8) + } + .ornament(attachmentAnchor: OrnamentAttachmentAnchor.scene(.bottom), contentAlignment: Alignment.top) { + VStack(spacing: 12) { + if viewModel.streamSettings.showMicButton { + FloatingMicButton() + .padding(.top, -12) + .transition(.move(edge: .bottom).combined(with: .opacity)) + } + + if viewModel.streamSettings.statsOverlay { + statsOverlayView + .padding(.top, 8) + .transition(.opacity.combined(with: .move(edge: .bottom))) + } + } + } + // HDR ornament centered on window + offset(z:) toward viewer to match RK dialogs (e.g. sbsConfirm at entity z ≈ 0.15), which sit visibly off the texture plane. + .ornament(visibility: showHDRPanel ? .visible : .hidden, attachmentAnchor: OrnamentAttachmentAnchor.scene(UnitPoint.center), contentAlignment: .center) { + HDRControlPanel( + settings: hdrPanelSettings, + isPresented: $showHDRPanel, + onLiveUpdate: { updateHDRParamsFromPanel() }, + attachmentLayoutScale: 1.0, + dimInactiveGradingControlsWhenReferenceHDR: true + ) + .offset(z: FlatHDRPanelMetrics.ornamentForwardOffsetZPts) + } + ) + + let withLifecycle: AnyView = AnyView( + withOrnaments + .task { await setupMaterial() } + .onAppear(perform: setupScene) + .onDisappear(perform: teardownScene) + .onTapGesture { + // Only handle tap if NOT in touchscreen mode + guard !viewModel.streamSettings.absoluteTouchMode else { return } + guard viewModel.activelyStreaming else { return } + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + fixAudioForCurrentMode() + } + ) + + withLifecycle + .onChange(of: viewModel.shouldCloseStream) { _, shouldClose in + if shouldClose && !hasPerformedTeardown { + DispatchQueue.main.async { triggerCloseSequence() } + } + } + .onChange(of: scenePhase) { oldValue, newValue in + if newValue == .background { + if !isMenuOpen && viewModel.activelyStreaming, streamMan != nil { + print("Suspending stream due to background (Menu is not open)") + needsResume = true + startingStream = false + viewModel.isSuspendingForBackground = true + streamMan?.stopStream() + streamMan = nil + controllerSupport?.cleanup() + controllerSupport = nil + } + } else if newValue == .active { + // Trigger keyboard focus reclaim whenever window becomes active + reclaimKeyboardFocus += 1 + + if needsResume { + print("Resuming stream from background") + viewModel.isSuspendingForBackground = false + needsResume = false + self.renderGateOpen = true + self.hasPerformedTeardown = false + self.startingStream = false + controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + connectionCallbacks.controllerSupport = controllerSupport + startStreamIfNeeded() + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + self.refreshAfterResume() + } + } else if viewModel.activelyStreaming { + // Health check: If stream should be running but isn't, restart it + if streamMan == nil { + print("[FlatDisplay] Stream died while inactive - restarting") + self.renderGateOpen = true + self.hasPerformedTeardown = false + self.startingStream = false + controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + connectionCallbacks.controllerSupport = controllerSupport + startStreamIfNeeded() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + self.refreshAfterResume() + } + } + } + } + .onChange(of: viewModel.streamSettings.statsOverlay) { _, newValue in + if newValue { startStatsTimer() } else { statsTimer?.invalidate(); statsTimer = nil; statsOverlayText = "" } + } + .onChange(of: viewModel.activelyStreaming) { _, newValue in + guard !windowDecommissioned else { return } // Zombie window — ignore + if newValue { + // FIX: Defer state modification to prevent "Modifying state during view update" warnings + DispatchQueue.main.async { + self.renderGateOpen = true + } + ensureStreamStartedIfNeeded() + dismissWindow(id: "mainView") + } + } + .onChange(of: hostingWindow) { _, _ in + applyWindowAspectRatioLock() + } + .onChange(of: correctedResolutionVersion) { _, _ in + applyWindowAspectRatioLock() + } + .onChange(of: videoMode) { _, _ in + applyWindowAspectRatioLock() + updateScreenMaterial() + } + .onChange(of: viewModel.streamSettings.swapABXYButtons) { _, newValue in + controllerSupport?.setSwapABXYButtons(newValue) + } + .onChange(of: hdrPanelSettings.brightness) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.contrast) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.saturation) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.pqExposure) { _, _ in updateHDRParamsFromPanel() } + .onChange(of: hdrPanelSettings.referenceHDR) { _, _ in updateHDRParamsFromPanel() } + .onReceive(NotificationCenter.default.publisher(for: .resumeStreamFromMenu)) { _ in + handleResume() + } + .onReceive(NotificationCenter.default.publisher(for: .mainViewWindowClosed)) { _ in + isMenuOpen = false + } + .onReceive(NotificationCenter.default.publisher(for: Notification.Name("RKStreamFirstFrameShown"))) { _ in + if firstFrameSeenEpoch != streamEpoch { + print("[FlatDisplay] First frame (RK) observed; epoch=\(streamEpoch)") + firstFrameSeenEpoch = streamEpoch + self.renderGateOpen = true + rebindScreenMaterial() + cancelFirstFrameWatchdogs() + } + } + .onReceive(NotificationCenter.default.publisher(for: Notification.Name("StreamFirstFrameShownNotification"))) { _ in + if firstFrameSeenEpoch != streamEpoch { + print("[FlatDisplay] First frame (UIKit) observed; epoch=\(streamEpoch)") + firstFrameSeenEpoch = streamEpoch + self.renderGateOpen = true + rebindScreenMaterial() + cancelFirstFrameWatchdogs() + } + } + } + + // MARK: - Controls + + /// Center button: tap to expand the dynamic menu. + private var flatCollapsedControlsView: some View { + Button { + if hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + } + withAnimation(.easeInOut(duration: 0.3)) { + controlsExpanded = true + } + startHideTimer() + } label: { + Image(systemName: "ellipsis.circle.fill") + .font(.system(size: 24.07)) + .frame(width: 50, height: 50) + } + .buttonStyle(.plain) + } + + @ViewBuilder + private var topControlsBar: some View { + Group { + if viewModel.streamSettings.useCollapsedControlsMenu { + flatDynamicControlsBar + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : (darkControlsMode ? 0.12 : 0.5)) : (darkControlsMode ? 0.01 : 0.05)) + .animation(Animation.easeInOut(duration: 0.25), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.25), value: hideControls) + .allowsHitTesting(true) + } else { + flatOriginalControlsBar + } + } + } + + private var flatOriginalControlsBar: some View { + flatControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .glassBackgroundEffect() + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : (darkControlsMode ? 0.12 : 0.5)) : (darkControlsMode ? 0.01 : 0.05)) + .animation(Animation.easeInOut(duration: 0.25), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.25), value: hideControls) + .allowsHitTesting(true) + } + + /// Original bar content (no accordion); used when dynamic menu is off. + private var flatControlsBarContent: some View { + HStack(spacing: 20) { + makeControlButton(label: "Home", systemImage: "house.fill") { + if isMenuOpen { + dismissWindow(id: "mainView") + isMenuOpen = false + } else { + pushWindow(id: "mainView") + isMenuOpen = true + } + fixAudioForCurrentMode() + } + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlsHighlighted = false + hideControls = false + spatialAudioMode.toggle() + fixAudioForCurrentMode() + presetOverlayText = spatialAudioMode ? "Audio: Spatial" : "Audio: Stereo" + presetOverlayIcon = spatialAudioMode ? "person.spatialaudio.fill" : "headphones" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + startHideTimer() + } label: { + Label(spatialAudioMode ? "Spatial Audio" : "Direct Audio", systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + } + .labelStyle(.iconOnly) + .simultaneousGesture(LongPressGesture(minimumDuration: 0.5).onEnded { _ in + guard spatialAudioMode else { return } + soundStageSize = soundStageSize.next() + fixAudioForCurrentMode() + presetOverlayText = "Sound Stage: \(soundStageSize.rawValue)" + presetOverlayIcon = "person.spatialaudio.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }) + makeControlButton(label: "Dim", systemImage: dimLevel == 0 ? "lightbulb.fill" : "lightbulb") { + dimLevel = dimLevel == 0 ? 1 : 0 + UserDefaults.standard.set(dimLevel, forKey: "ambient.dimming.level") + viewModel.streamSettings.dimPassthrough = (dimLevel != 0) + presetOverlayText = dimLevel == 0 ? "Dimming: Off" : "Dimming: On" + presetOverlayIcon = dimLevel == 0 ? "lightbulb.fill" : "lightbulb" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + } + makeControlButton(label: "Preset", systemImage: "camera.filters") { + guard canChangePreset() else { return } + let next = (viewModel.streamSettings.uikitPreset + 1) % 4 + viewModel.streamSettings.uikitPreset = next + applyCurvedUIKitPreset(next) + presetCooldownUntil = Date().addingTimeInterval(0.3) + presentFilterPresetCenterPopup(selectedPreset: next) + startHideTimer() + } + if viewModel.streamSettings.enableHdr { + makeControlButton( + label: showHDRPanel ? "Close HDR" : "HDR", + systemImage: "wand.and.stars" + ) { + showHDRPanel.toggle() + if showHDRPanel { + updateHDRParamsFromPanel() + } + startHideTimer() + } + } + makeControlButton(label: videoMode == .standard2D ? "Standard" : "3D", systemImage: "view.3d") { + if videoMode == .standard2D { show3DConfirm = true } + else { + videoMode = .standard2D + applyWindowAspectRatioLock() + presetOverlayText = "Standard Display" + presetOverlayIcon = "view.3d" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + } + startHideTimer() + } + makeControlButton(label: viewModel.streamSettings.statsOverlay ? "Hide Stats" : "Show Stats", systemImage: "wifi") { + viewModel.streamSettings.statsOverlay.toggle() + if viewModel.streamSettings.statsOverlay { + startStatsTimer() + } else { + statsTimer?.invalidate() + } + startHideTimer() + } + if viewModel.streamSettings.showTaskManagerButton { + makeControlButton(label: "Task Manager", systemImage: "list.bullet.circle") { + sendTaskManager() + startHideTimer() + } + } + makeControlButton(label: showVirtualKeyboard ? "Hide Keyboard" : "Show Keyboard", systemImage: showVirtualKeyboard ? "keyboard.fill" : "keyboard") { + showVirtualKeyboard.toggle() + isKeyboardFocused = showVirtualKeyboard + startHideTimer() + } + if viewModel.streamSettings.showControllerBattery { + BatteryIndicatorView( + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer + ) + } + LongPressControlBtn( + label: viewModel.streamSettings.absoluteTouchMode ? "Gaze Control" : "Touch Control", + systemImage: isHandGazeInputDisabled ? "lock.fill" : (viewModel.streamSettings.absoluteTouchMode ? "eye.fill" : "hand.point.up.left.fill"), + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer, + primaryAction: { + viewModel.streamSettings.absoluteTouchMode.toggle() + UserDefaults.standard.set(viewModel.streamSettings.absoluteTouchMode, forKey: "flat.absoluteTouchMode") + presetOverlayText = viewModel.streamSettings.absoluteTouchMode ? "Gaze Control" : "Touch Control" + presetOverlayIcon = viewModel.streamSettings.absoluteTouchMode ? "eye.fill" : "hand.point.up.left.fill" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + }, + longPressAction: { + isHandGazeInputDisabled.toggle() + presetOverlayText = isHandGazeInputDisabled ? "Screen Input Disabled" : "Screen Input Enabled" + presetOverlayIcon = isHandGazeInputDisabled ? "lock.fill" : (viewModel.streamSettings.absoluteTouchMode ? "eye.fill" : "hand.point.up.left.fill") + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { showInlinePresetOverlay = false } + } + } + ) + if viewModel.isCoopSession { + HStack(spacing: 6) { + Image(systemName: "person.2.fill").font(.system(size: 16, weight: .semibold)) + Text("2P").font(.system(size: 14, weight: .bold)) + Text("(\(CoopSessionCoordinator.shared.participants.count)/2)") + .font(.system(size: 12, weight: .medium)) + .foregroundColor(.white.opacity(0.8)) + } + .fixedSize() + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background(RoundedRectangle(cornerRadius: 8).fill(Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.3))) + } + if viewModel.isCoopSession { + let coordinator = CoopSessionCoordinator.shared + if coordinator.isHosting && coordinator.participants.count < 2 { + coopInviteButton + } + } + if viewModel.isCoopSession { + coopDisconnectButton + } + } + } + + /// Dynamic bar: collapsed = center only (no pill); expanded = full bar with pill. Both branches animate opacity/scale for smooth expand and collapse. + private var flatDynamicControlsBar: some View { + ZStack { + flatCollapsedControlsView + .padding(.horizontal, 24) + .padding(.vertical, 12) + .opacity(controlsExpanded ? 0 : 1) + .scaleEffect(controlsExpanded ? 0.88 : 1) + .allowsHitTesting(!controlsExpanded) + flatControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .glassBackgroundEffect() + .opacity(controlsExpanded ? 1 : 0) + .scaleEffect(controlsExpanded ? 1 : 0.88) + .allowsHitTesting(controlsExpanded) + } + .animation(.spring(response: 0.38, dampingFraction: 0.82), value: controlsExpanded) + } + + private func makeControlButton(label: String, systemImage: String, action: @escaping () -> Void) -> some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlsHighlighted = false + hideControls = false + action() + startHideTimer() + } label: { + Label(label, systemImage: systemImage) + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + } + .labelStyle(.iconOnly) + } + + private var coopInviteButton: some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + + + let coordinator = CoopSessionCoordinator.shared + Task { + await coordinator.reInviteGuest() + } + + // Show "Sent" feedback for 3 seconds + inviteButtonSent = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + inviteButtonSent = false + } + + startHideTimer() + } label: { + HStack(spacing: 6) { + Image(systemName: inviteButtonSent ? "checkmark" : "paperplane") + .font(.system(size: 14, weight: .medium)) + Text(inviteButtonSent ? "Sent" : "Invite") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + .animation(.easeInOut(duration: 0.2), value: inviteButtonSent) + } + + private var coopDisconnectButton: some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + + showDisconnectConfirm = true + } label: { + HStack(spacing: 6) { + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.system(size: 14, weight: .medium)) + Text("Leave") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + } + + private func sendTaskManager() { + DispatchQueue.global(qos: .userInteractive).async { + let MODIFIER_CTRL: Int8 = 0x02 + let MODIFIER_SHIFT: Int8 = 0x01 + let modifiers = MODIFIER_CTRL | MODIFIER_SHIFT + let ESC_KEY: Int16 = 0x1B + + + + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x03, modifiers) // Key Down + usleep(50 * 1000) + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x04, modifiers) // Key Up + } + } + + @ViewBuilder + private var statsOverlayView: some View { + if viewModel.streamSettings.statsOverlay { + VStack(spacing: 6) { + Text(statsOverlayText.isEmpty ? "Collecting stats..." : statsOverlayText) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(.white) + .multilineTextAlignment(.center) + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.92)) + ) + .allowsHitTesting(false) + } + } + + // MARK: - RealityView Setup + + func setupRealityView(content: RealityViewContent, attachments: RealityViewAttachments) { + let baseWidth: Float = 1.0 + let baseHeight = baseWidth * screenAspect + + // Safe mesh generation with fallback + let mesh: MeshResource + do { + mesh = try generateCurvedRoundedPlane( + width: baseWidth, + aspectRatio: screenAspect, + resolution: (256, 256), + curveMagnitude: 0, + cornerRadiusFraction: cornerRadiusFraction + ) + } catch { + print("⚠️ Failed to generate flat mesh: \(error). Using simple plane fallback.") + mesh = .generatePlane(width: baseWidth, height: baseHeight) + } + + let material = UnlitMaterial(texture: texture) + screen = ModelEntity(mesh: mesh, materials: [material]) + screen.position = SIMD3(0, 0, 0) + + content.add(screen) + + // Add the invisible ruler for calibration + if let ruler = attachments.entity(for: "calibrationRuler") { + ruler.components.set(OpacityComponent(opacity: 0.0)) + content.add(ruler) + } + + attachAttachments(attachments: attachments, width: baseWidth, height: baseHeight) + } + + func updateRealityView(content: RealityViewContent, attachments: RealityViewAttachments, size: CGSize) { + guard size.width > 10, size.height > 10 else { return } + if abs(size.width - lastUpdateSize.width) < 1.0 && abs(size.height - lastUpdateSize.height) < 1.0 { + return + } + lastUpdateSize = size + + // DYNAMIC CALIBRATION - Measure the ruler to get exact points-to-meters conversion + if let ruler = attachments.entity(for: "calibrationRuler") { + let rulerBounds = ruler.visualBounds(relativeTo: nil) + let physicalRulerWidth = rulerBounds.extents.x + + if physicalRulerWidth > 0 { + // Ruler is 100 points wide, so metersPerPoint = physicalWidth / 100 + let metersPerPoint = physicalRulerWidth / 100.0 + + // Calculate target physical width for video mesh + let targetPhysicalWidth = Float(size.width) * metersPerPoint + + // Scale the mesh (base is 1.0 meter) + let scale = targetPhysicalWidth + + // Only update if changed significantly + if abs(scale - screen.scale.x) > 0.0001 { + screen.scale = SIMD3(scale, scale, 1.0) + lastPhysicalWidth = scale + } + } + } + + let physicalHeight = screen.scale.x * screenAspect + updateAttachments(attachments: attachments, width: screen.scale.x, height: physicalHeight) + } + + private func attachAttachments(attachments: RealityViewAttachments, width: Float, height: Float) { + if let popupEnt = attachments.entity(for: "presetPopup") { + screen.addChild(popupEnt) + popupEnt.position = [0, 0, 0.15] + + let bounds = popupEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(popupEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + popupEnt.scale = [scale, scale, scale] + } + } + + // Co-op join notification (centered, same as presetPopup) + if let joinEnt = attachments.entity(for: "coopJoinNotification") { + screen.addChild(joinEnt) + joinEnt.position = [0, 0, 0.15] + + let bounds = joinEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(joinEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + joinEnt.scale = [scale, scale, scale] + } + } + + // Co-op disconnect notification (centered, same as presetPopup) + if let disconnectEnt = attachments.entity(for: "coopDisconnectNotification") { + screen.addChild(disconnectEnt) + disconnectEnt.position = [0, 0, 0.15] + + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } + } + + // Co-op connecting overlay (centered, same as presetPopup) + if let connectingEnt = attachments.entity(for: "coopConnectingOverlay") { + screen.addChild(connectingEnt) + connectingEnt.position = [0, 0, 0.15] + + let bounds = connectingEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(connectingEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + connectingEnt.scale = [scale, scale, scale] + } + } + + // SBS 3D confirmation dialog (centered, floating in front) + if let sbsEnt = attachments.entity(for: "sbsConfirm") { + screen.addChild(sbsEnt) + sbsEnt.position = [0, 0, 0.15] + + let bounds = sbsEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(sbsEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = show3DConfirm ? 0.3 * Float(SBSConfirmPanelMetrics.scale) : 0.3 + let scale = desiredLocalWidth / unscaledWidth + sbsEnt.scale = [scale, scale, scale] + } + } + + } + + private func updateAttachments(attachments: RealityViewAttachments, width: Float, height: Float) { + if let popupEnt = attachments.entity(for: "presetPopup") { + if popupEnt.parent !== screen { screen.addChild(popupEnt) } + let bounds = popupEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(popupEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + popupEnt.scale = [scale, scale, scale] + } + } + + // Co-op join notification + if let joinEnt = attachments.entity(for: "coopJoinNotification") { + if joinEnt.parent !== screen { screen.addChild(joinEnt) } + let bounds = joinEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(joinEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + joinEnt.scale = [scale, scale, scale] + } + } + + // Co-op disconnect notification + if let disconnectEnt = attachments.entity(for: "coopDisconnectNotification") { + if disconnectEnt.parent !== screen { screen.addChild(disconnectEnt) } + let bounds = disconnectEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(disconnectEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + disconnectEnt.scale = [scale, scale, scale] + } + } + + // Co-op connecting overlay + if let connectingEnt = attachments.entity(for: "coopConnectingOverlay") { + if connectingEnt.parent !== screen { screen.addChild(connectingEnt) } + let bounds = connectingEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(connectingEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = 0.25 + let scale = desiredLocalWidth / unscaledWidth + connectingEnt.scale = [scale, scale, scale] + } + } + + // SBS 3D confirmation dialog + if let sbsEnt = attachments.entity(for: "sbsConfirm") { + if sbsEnt.parent !== screen { screen.addChild(sbsEnt) } + let bounds = sbsEnt.visualBounds(relativeTo: screen) + if bounds.extents.x > 0 { + let currentScaleX = max(sbsEnt.scale.x, 0.0001) + let unscaledWidth = Float(bounds.extents.x) / currentScaleX + let desiredLocalWidth: Float = show3DConfirm ? 0.3 * Float(SBSConfirmPanelMetrics.scale) : 0.3 + let scale = desiredLocalWidth / unscaledWidth + sbsEnt.scale = [scale, scale, scale] + } + } + + } + + private func rebindScreenMaterial() { + // Rebind material based on current video mode + updateScreenMaterial() + } + + private func refreshAfterResume() { + LiRequestIdrFrame() + rebindScreenMaterial() + } + + private func cancelFirstFrameWatchdogs() { + watchdogIDR1?.cancel() + watchdogIDR2?.cancel() + watchdogIDR1 = nil + watchdogIDR2 = nil + guestAggressiveIDRTimer?.invalidate() + guestAggressiveIDRTimer = nil + } + + // MARK: - HDR & Presets + + /// Pushes persisted HDR panel values into `safeHDRSettings` right before `DrawableVideoDecoder` is created, + /// ensuring the first frame matches UserDefaults even if lifecycle ordering was off. + private func syncHDRSettingsForStreamStart() { + applyCurvedUIKitPreset(viewModel.streamSettings.uikitPreset) + } + + private func applyCurvedUIKitPreset(_ preset: Int32) { + var params = safeHDRSettings.value + let isHdr = viewModel.streamSettings.enableHdr + + if isHdr { + switch preset { + case 1: + hdrParams.mode = 1 + params.boost = 1.0 + params.saturation = 1.05 + params.contrast = 1.005 + params.brightness = 0.0 + case 2: + hdrParams.mode = 1 + params.boost = 1.05 + params.saturation = 1.15 + params.contrast = 1.01 + params.brightness = 0.0 + case 3: + hdrParams.mode = 2 + params.boost = 0.99 + params.saturation = 0.87 + params.contrast = 1.005 + params.brightness = 0.01 + default: + hdrParams.mode = 1 + params.boost = 1.00 + params.saturation = 1.00 + params.contrast = 1.00 + params.brightness = 0.00 + } + + let hrBoost: Float = 1.40 + params.boost = Swift.min(Swift.max(params.boost * hrBoost, 1.0), 1.50) + params.contrast = Swift.min(Swift.max(params.contrast, 1.00), 1.20) + params.saturation = Swift.min(Swift.max(params.saturation, 0.85), 1.15) + params.brightness = 0.0 + } else { + switch preset { + case 1: + params.boost = 0.98 + params.saturation = 1.05 + params.contrast = 1.002 + params.brightness = 0.0 + params.mode = 1 + case 2: + params.boost = 1.05 + params.saturation = 1.15 + params.contrast = 1.005 + params.brightness = 0.0 + params.mode = 1 + case 3: + params.boost = 1.02 + params.saturation = 0.90 + params.contrast = 1.005 + params.brightness = 0.0 + params.mode = 1 + default: + params.boost = 1.00 + params.saturation = 1.00 + params.contrast = 1.00 + params.brightness = 0.00 + params.mode = 0 + } + } + if preset == 0 { + params.boost = hdrPanelSettings.brightness + params.contrast = hdrPanelSettings.contrast + params.saturation = hdrPanelSettings.saturation + params.brightness = 0.0 + if isHdr { + let hrB: Float = 1.40 + params.boost = Swift.min(Swift.max(params.boost * hrB, 1.0), 1.50) + params.contrast = Swift.min(Swift.max(params.contrast, 1.00), 1.20) + params.saturation = Swift.min(Swift.max(params.saturation, 0.85), 1.15) + } + } + if isHdr { + params.mode = hdrParams.mode + } + params.pqExposure = hdrPanelSettings.pqExposure + params.hdrGradeFlags = hdrPanelSettings.referenceHDR ? 1 : 0 + safeHDRSettings.value = params + + // HDR params are applied via hdrSettingsProvider on every frame - no IDR needed + } + + // Live update from HDR panel sliders — must match stream start logic for Custom preset (uikitPreset == 0) + // to prevent image "snap" when opening HDR panel + private func updateHDRParamsFromPanel() { + if viewModel.streamSettings.uikitPreset == 0 { + // Custom preset: use same HDR headroom/clamps as stream start + applyCurvedUIKitPreset(0) + } else { + // Non-custom presets: raw copy from panel (legacy behavior for non-zero presets) + var params = safeHDRSettings.value + params.boost = hdrPanelSettings.brightness + params.contrast = hdrPanelSettings.contrast + params.saturation = hdrPanelSettings.saturation + params.pqExposure = hdrPanelSettings.pqExposure + params.brightness = 0.0 + params.hdrGradeFlags = hdrPanelSettings.referenceHDR ? 1 : 0 + safeHDRSettings.value = params + } + } + + private func presentFilterPresetCenterPopup(selectedPreset: Int32) { + presetOverlayText = presetName(for: selectedPreset) + presetOverlayIcon = "camera.filters" + showInlinePresetOverlay = true + presetOverlayTimer?.invalidate() + + let needsReferenceHdrOffHint = selectedPreset != 0 + && viewModel.streamSettings.enableHdr + && hdrPanelSettings.referenceHDR + + if needsReferenceHdrOffHint { + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.35, repeats: false) { _ in + DispatchQueue.main.async { + self.presetOverlayText = "DISABLE REFERENCE HDR TO USE FILTER PRESETS" + self.presetOverlayIcon = "wand.and.stars" + self.presetOverlayTimer?.invalidate() + self.presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 2.1, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + } + } + } else { + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.15)) { + self.showInlinePresetOverlay = false + } + } + } + } + } + + private func presetName(for preset: Int32) -> String { + switch preset { + case 0: return "FILTER: Default" + case 1: return "FILTER: Cinematic" + case 2: return "FILTER: Vi\u{200A}vid" // Hair space between I and V + case 3: return "FILTER: Realistic" + default: return "FILTER: Default" + } + } + + private func canChangePreset() -> Bool { + guard let cooldownUntil = presetCooldownUntil else { return true } + return Date() >= cooldownUntil + } + + // MARK: - Scene Lifecycle & Helpers + + private func setupScene() { + debugLog("📍 setupScene called - activelyStreaming: \(viewModel.activelyStreaming), hasPerformedTeardown: \(hasPerformedTeardown), windowDecommissioned: \(windowDecommissioned)") + + if !viewModel.activelyStreaming { return } + + // Force recreation of ControllerSupport with the LATEST streamConfig. + // This fixes the issue where 'init' captured a stale config (wrong player slot) + // and @State persisted it. + debugLog("[FlatDisplay] Re-initializing ControllerSupport with slotOffset: \(streamConfig.controllerSlotOffset)") + self.controllerSupport = ControllerSupport(config: streamConfig, delegate: DummyControllerDelegate()) + + // Set controller support reference for rumble forwarding + self.connectionCallbacks.controllerSupport = self.controllerSupport + + // CRITICAL: Reset teardown flag to allow proper cleanup on next disconnect + self.hasPerformedTeardown = false + self.windowDecommissioned = false // Window is alive again — allow it to react to state + self.renderGateOpen = true + viewModel.isStreamViewAlive = true + dismissWindow(id: "mainView") + isMenuOpen = false + + viewModel.streamSettings.statsOverlay = false + statsTimer?.invalidate() + statsTimer = nil + statsOverlayText = "" + + var stored = UserDefaults.standard.integer(forKey: "ambient.dimming.level") + if stored > 1 { stored = 0 } + dimLevel = stored + + // Load saved touch control preference + viewModel.streamSettings.absoluteTouchMode = UserDefaults.standard.bool(forKey: "flat.absoluteTouchMode") + + startStreamIfNeeded() + spatialAudioMode = true + + hideTimer?.invalidate() + hideTimer = nil + hideControls = false + + if viewModel.streamSettings.uikitPreset != 0 { + viewModel.streamSettings.uikitPreset = 0 + } + applyCurvedUIKitPreset(0) + + applyWindowAspectRatioLock() + } + + private func teardownScene() { + debugLog("📍 teardownScene called - hasPerformedTeardown: \(hasPerformedTeardown)") + statsTimer?.invalidate() + statsTimer = nil + viewModel.isStreamViewAlive = false + if !hasPerformedTeardown { performCompleteTeardown() } + } + + private func ensureStreamStartedIfNeeded() { startStreamIfNeeded() } + + private func performCompleteTeardown() { + guard !hasPerformedTeardown else { + debugLog("⚠️ performCompleteTeardown SKIPPED - already performed") + return + } + hasPerformedTeardown = true + + debugLog("🔴 TEARDOWN START - streamMan exists: \(streamMan != nil)") + + // CRITICAL: Close render gate BEFORE stopping stream to prevent race conditions + renderGateOpen = false + + cancelFirstFrameWatchdogs() + startingStream = false + + statsTimer?.invalidate() + hideTimer?.invalidate() + presetOverlayTimer?.invalidate() + + controllerSupport?.cleanup() + controllerSupport = nil + + if let sm = streamMan { + print("[FlatDisplay] Stopping StreamManager (waiting for LiStopConnection completion)...") + streamMan = nil // Clear reference now to prevent double-stop + + // Tell the serializer a stop is beginning — no new connection can start until + // notifyStopComplete() is called inside the real completion block below. + ConnectionSerializer.shared.notifyStopBegun() + + sm.stopStream(completion: { + DispatchQueue.main.async { + print("[FlatDisplay] 🔴 TEARDOWN COMPLETE — LiStopConnection finished") + // Ungate the serializer — new connections may now proceed. + ConnectionSerializer.shared.notifyStopComplete() + NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + } + }) + } else { + print("[FlatDisplay] 🔴 TEARDOWN COMPLETE (no stream to stop)") + NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + } + } + + private func triggerCloseSequence() { + windowDecommissioned = true // Silence this window so it can't interfere as a zombie + performCompleteTeardown() + viewModel.activelyStreaming = false // CRITICAL FIX: Match CurvedDisplay behavior + viewModel.shouldCloseStream = false + dismissWindow(id: "flatDisplayWindow") + } + + private func fixAudioForCurrentMode() { + if spatialAudioMode { + AudioHelpers.fixAudioForSurroundForCurrentWindow(soundStageSize: soundStageSize) + } else { + AudioHelpers.fixAudioForDirectStereo() + } + } + + @ViewBuilder + private var confirmationsOverlay: some View { + if show3DConfirm { + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) + + VStack(spacing: SBSConfirmPanelMetrics.pt(24)) { + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandNavy, brandNavy.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: SBSConfirmPanelMetrics.pt(64), height: SBSConfirmPanelMetrics.pt(64)) + .shadow(color: brandOrange.opacity(0.5), radius: SBSConfirmPanelMetrics.pt(18), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + Image(systemName: "view.3d") + .font(.system(size: SBSConfirmPanelMetrics.pt(28), weight: .bold)) + .foregroundStyle(.white) + } + + VStack(spacing: SBSConfirmPanelMetrics.pt(8)) { + Text("Enable SBS 3D") + .font(.system(size: SBSConfirmPanelMetrics.pt(22), weight: .bold)) + .foregroundStyle(.white) + Text("Use software such as ReShade + Depth3D on your host PC to utilize SBS mode.") + .font(.system(size: SBSConfirmPanelMetrics.pt(15), weight: .regular)) + .foregroundStyle(.white.opacity(0.75)) + .multilineTextAlignment(.center) + .padding(.horizontal, SBSConfirmPanelMetrics.pt(8)) + } + + VStack(spacing: SBSConfirmPanelMetrics.pt(12)) { + Button { + show3DConfirm = false + videoMode = .sideBySide3D + applyWindowAspectRatioLock() + + presetOverlayText = "SBS 3D Enabled" + presetOverlayIcon = "view.3d" + showInlinePresetOverlay = true + + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } + } + } label: { + HStack(spacing: SBSConfirmPanelMetrics.pt(10)) { + Text("Enable SBS 3D") + .font(.system(size: SBSConfirmPanelMetrics.pt(17), weight: .semibold)) + } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, SBSConfirmPanelMetrics.pt(14)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .fill( + LinearGradient( + colors: [brandOrange, brandOrange.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1.5) + ) + ) + .shadow(color: brandOrange.opacity(0.5), radius: SBSConfirmPanelMetrics.pt(18), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + } + .buttonStyle(.plain) + + Button { + show3DConfirm = false + } label: { + Text("Cancel") + .font(.system(size: SBSConfirmPanelMetrics.pt(17), weight: .medium)) + .foregroundStyle(.white.opacity(0.75)) + .frame(maxWidth: .infinity) + .padding(.vertical, SBSConfirmPanelMetrics.pt(14)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .fill(.ultraThinMaterial) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(16), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.15), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1) + ) + ) + ) + } + .buttonStyle(.plain) + } + } + .padding(SBSConfirmPanelMetrics.pt(28)) + .background( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(24), style: .continuous) + .fill(brandNavy.opacity(0.4)) + .shadow(color: .black.opacity(0.3), radius: SBSConfirmPanelMetrics.pt(20), x: 0, y: SBSConfirmPanelMetrics.pt(10)) + ) + .overlay( + RoundedRectangle(cornerRadius: SBSConfirmPanelMetrics.pt(24), style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.3), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: SBSConfirmPanelMetrics.pt(1.5) + ) + ) + .frame(width: SBSConfirmPanelMetrics.pt(420)) + .allowsHitTesting(true) + } else if showDisconnectConfirm { + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + let brandRed = Color(red: 0.9, green: 0.3, blue: 0.3) + + VStack(spacing: 24) { + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandNavy, brandNavy.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: 64, height: 64) + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.system(size: 28, weight: .bold)) + .foregroundStyle(.white) + } + + VStack(spacing: 8) { + Text("Leave Co-op Session?") + .font(.system(size: 22, weight: .bold)) + .foregroundStyle(.white) + Text("This will disconnect you from the session and end the stream.") + .font(.system(size: 15, weight: .regular)) + .foregroundStyle(.white.opacity(0.75)) + .multilineTextAlignment(.center) + .padding(.horizontal, 8) + } + + VStack(spacing: 12) { + Button { + showDisconnectConfirm = false + Task { @MainActor in + // userDidRequestDisconnect handles quit request + co-op cleanup + endSession + viewModel.userDidRequestDisconnect() + openWindow(id: "mainView") + dismissWindow(id: "flatDisplayWindow") + } + } label: { + HStack(spacing: 10) { + Text("Leave Session") + .font(.system(size: 17, weight: .semibold)) + } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + .background( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill( + LinearGradient( + colors: [brandRed, brandRed.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) + } + .buttonStyle(.plain) + + Button { + showDisconnectConfirm = false + } label: { + Text("Cancel") + .font(.system(size: 17, weight: .medium)) + .foregroundStyle(.white.opacity(0.75)) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + .background( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(.ultraThinMaterial) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.15), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + ) + } + .buttonStyle(.plain) + } + } + .padding(28) + .background( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .fill(brandNavy.opacity(0.92)) + .overlay( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + ) + .shadow(color: .black.opacity(0.25), radius: 30, x: 0, y: 16) + .frame(width: 420) + .allowsHitTesting(true) + } + } + + private func handleResume() { + dismissWindow(id: "mainView") + isMenuOpen = false + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + fixAudioForCurrentMode() + } + + // MARK: - SBS 3D Material Management + + private func setupMaterial() async { + if surfaceMaterial == nil { + do { + var material = try await ShaderGraphMaterial(named: "/Root/SBSMaterial", from: "SBSMaterial.usda") + try material.setParameter(name: "texture", value: .textureResource(self.texture)) + self.surfaceMaterial = material + print("[FlatDisplay] SBS material loaded successfully") + } catch { + print("[FlatDisplay] ⚠️ Failed to load SBS material: \(error)") + } + } + } + + private func updateScreenMaterial() { + if videoMode == .sideBySide3D { + if var mat = surfaceMaterial { + do { + try mat.setParameter(name: "texture", value: .textureResource(self.texture)) + surfaceMaterial = mat + screen.model?.materials = [mat] + print("[FlatDisplay] Switched to SBS 3D material") + } catch { + print("[FlatDisplay] ⚠️ Failed to set SBS material parameter: \(error)") + screen.model?.materials = [UnlitMaterial(texture: texture)] + } + } else { + print("[FlatDisplay] ⚠️ SBS material not loaded, using standard material") + screen.model?.materials = [UnlitMaterial(texture: texture)] + } + } else { + screen.model?.materials = [UnlitMaterial(texture: self.texture)] + print("[FlatDisplay] Switched to standard 2D material") + } + } + + private func startHideTimer() { + hideTimer?.invalidate() + hideTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in + DispatchQueue.main.async { + if viewModel.activelyStreaming { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation(.easeOut(duration: 0.3)) { + self.hideControls = true + self.controlsHighlighted = false + } + } + } else { + withAnimation(.easeOut(duration: 0.3)) { + self.hideControls = true + self.controlsHighlighted = false + } + } + } + } + } + } + + private func startHighlightTimer() { + hideTimer?.invalidate() + hideTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in + DispatchQueue.main.async { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation(.easeOut(duration: 0.3)) { + self.controlsHighlighted = false + self.hideControls = true + } + } + } else { + withAnimation(.easeOut(duration: 0.3)) { + self.controlsHighlighted = false + self.hideControls = true + } + } + } + } + } + + private func startStatsTimer() { + statsTimer?.invalidate() + statsTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in + guard self.viewModel.activelyStreaming else { return } + if let streamMan = self.streamMan, let stats = streamMan.getStatsOverlayText() { + self.statsOverlayText = stats + } + } + } + + private func applyWindowAspectRatioLock() { + guard viewModel.activelyStreaming else { return } + + // Create effective config - for SBS 3D mode, use half width for correct aspect ratio + let effectiveConfig: StreamConfiguration + if videoMode == .sideBySide3D && isSBSVideo { + effectiveConfig = StreamConfiguration() + effectiveConfig.width = streamConfig.width / 2 // Half width for one eye + effectiveConfig.height = streamConfig.height + } else { + effectiveConfig = streamConfig + } + + guard let win = hostingWindow else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + if let w = self.hostingWindow { + applyAspectRatioLock(streamConfiguration: effectiveConfig, targetWindow: w) + } + } + return + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + applyAspectRatioLock(streamConfiguration: effectiveConfig, targetWindow: win) + } + } + + // MARK: - Stream Management + + private func startStreamIfNeeded() { + guard streamMan == nil, !startingStream else { + print("[FlatDisplay] Stream start skipped (streamMan exists: \(streamMan != nil), startingStream: \(startingStream))") + return + } + + startingStream = true + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + guard !self.hasPerformedTeardown, self.viewModel.activelyStreaming, self.streamMan == nil else { + print("[FlatDisplay] Aborting stream start - Teardown: \(self.hasPerformedTeardown), Streaming: \(self.viewModel.activelyStreaming), Exists: \(self.streamMan != nil)") + self.startingStream = false + return + } + + self.streamEpoch &+= 1 + self.firstFrameSeenEpoch = -1 + let myEpoch = self.streamEpoch + print("[FlatDisplay] 🚀 Starting stream (epoch \(myEpoch))") + + // CRITICAL: Sync HDR settings from panel to safeHDRSettings BEFORE decoder creation + self.syncHDRSettingsForStreamStart() + + self.renderGateOpen = true + self.ensureHDRTextureMatchesSetting() + + self.controllerSupport = ControllerSupport(config: self.streamConfig, delegate: DummyControllerDelegate()) + + // Set controller support reference for rumble forwarding + self.connectionCallbacks.controllerSupport = self.controllerSupport + + // Capture texture locally for thread-safe background access + let localTexture = self.texture + + self.streamMan = StreamManager( + config: self.streamConfig, + rendererProvider: { + DrawableVideoDecoder( + texture: localTexture, + callbacks: self.connectionCallbacks, + aspectRatio: self.screenAspect, + useFramePacing: self.streamConfig.useFramePacing, + enableHDR: self.viewModel.streamSettings.enableHdr, + hdrSettingsProvider: { [safeHDRSettings] in safeHDRSettings.value }, + enhancementsProvider: { + let p = self.viewModel.streamSettings.uikitPreset + switch p { + case 0: return (1.0, 1.0, 0.0) + case 1: return (1.15, 1.0, 0.0) + case 2: return (1.25, 1.0, 0.0) + case 3: return (0.90, 1.05, 0.0) + default: return (1.0, 1.0, 0.0) + } + }, + callbackToRender: { textureQueue, _, correctedResolution in + guard self.renderGateOpen else { return } + + // 1. Drop frame in mailbox (Zero latency, No blocking) + self.frameMailbox.deposit(textureQueue) + + // 2. Dispatch UI metadata to Main Thread + DispatchQueue.main.async { + guard self.renderGateOpen else { return } + if let correctedResolution { + self.correctedResolution = correctedResolution + self.correctedResolutionVersion += 1 + } + + // First Frame Logic (matches CurvedDisplay behavior) + if self.firstFrameSeenEpoch != self.streamEpoch { + self.firstFrameSeenEpoch = self.streamEpoch + print("[FlatDisplay] First frame received; epoch=\(self.streamEpoch)") + self.cancelFirstFrameWatchdogs() + + // Rebind material after short delay to ensure texture is ready + DispatchQueue.main.asyncAfter(deadline: .now() + 0.18) { + self.rebindScreenMaterial() + } + + // Force first frame to display immediately + if let firstFrame = self.frameMailbox.collect() { + self.texture.replace(withDrawables: firstFrame) + } + } + + self.controllerSupport?.connectionEstablished() + self.startHideTimer() + } + } + ) + }, + connectionCallbacks: self.connectionCallbacks + ) + + let operationQueue = OperationQueue() + if let streamMan = self.streamMan { + operationQueue.addOperation(streamMan) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { LiRequestIdrFrame() } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) { LiRequestIdrFrame() } + + let w1 = DispatchWorkItem { + if self.streamEpoch == myEpoch && self.firstFrameSeenEpoch != myEpoch && !self.hasPerformedTeardown { + print("[FlatDisplay] Watchdog @0.9s → Requesting IDR (epoch \(myEpoch))") + LiRequestIdrFrame() + } + } + let w2 = DispatchWorkItem { + if self.streamEpoch == myEpoch && self.firstFrameSeenEpoch != myEpoch && !self.hasPerformedTeardown { + print("[FlatDisplay] Watchdog @1.8s → Requesting IDR (epoch \(myEpoch))") + LiRequestIdrFrame() + } + } + self.watchdogIDR1 = w1 + self.watchdogIDR2 = w2 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.9, execute: w1) + DispatchQueue.main.asyncAfter(deadline: .now() + 1.8, execute: w2) + + // AGGRESSIVE GUEST-SIDE IDR REQUESTING + // Co-op guests have independent streams - they must request their own IDR frames + if self.viewModel.isCoopSession && self.viewModel.assignedControllerSlot == 1 { + print("[FlatDisplay] 🎮 CO-OP GUEST: Starting aggressive IDR requesting") + var requestCount = 0 + let maxRequests = 120 // 60 seconds at 500ms intervals + self.guestAggressiveIDRTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in + requestCount += 1 + if self.firstFrameSeenEpoch == myEpoch { + print("[FlatDisplay] 🎮 CO-OP GUEST: First frame received! Stopping IDR requests after \(requestCount) requests") + timer.invalidate() + self.guestAggressiveIDRTimer = nil + return + } + if requestCount > maxRequests { + print("[FlatDisplay] 🎮 CO-OP GUEST: Max IDR requests reached (\(maxRequests)), stopping") + timer.invalidate() + self.guestAggressiveIDRTimer = nil + return + } + print("[FlatDisplay] 🎮 CO-OP GUEST: Requesting IDR frame #\(requestCount)") + LiRequestIdrFrame() + } + } + + self.startingStream = false + } + } + + private func ensureHDRTextureMatchesSetting() { + let desiredHDR = viewModel.streamSettings.enableHdr + if desiredHDR == isHDRTexture { return } + + let width = Int(streamConfig.width) + let height = Int(streamConfig.height) + let bytesPerPixel = desiredHDR ? 8 : 4 + let data = Data(count: bytesPerPixel * width * height) + + // Safe texture recreation with fallback + do { + texture = try TextureResource( + dimensions: .dimensions(width: width, height: height), + format: .raw(pixelFormat: desiredHDR ? .rgba16Float : .bgra8Unorm_srgb), + contents: .init(mipmapLevels: [.mip(data: data, bytesPerRow: bytesPerPixel * width)]) + ) + isHDRTexture = desiredHDR + screen.model?.materials = [UnlitMaterial(texture: texture)] + } catch { + print("⚠️ Failed to recreate texture for HDR toggle: \(error). Keeping existing texture.") + // Keep existing texture rather than crash + } + } +} + +private struct WindowResolver: UIViewRepresentable { + let onResolve: (UIWindow) -> Void + func makeUIView(context: Context) -> _WindowResolverView { + let v = _WindowResolverView() + v.onResolve = onResolve + return v + } + func updateUIView(_ uiView: _WindowResolverView, context: Context) {} +} +private final class _WindowResolverView: UIView { + var onResolve: ((UIWindow) -> Void)? + override func didMoveToWindow() { + super.didMoveToWindow() + if let w = window { + onResolve?(w) + } + } +} + +func generateCurvedRoundedPlane( + width: Float, + aspectRatio: Float, + resolution: (UInt32, UInt32), + curveMagnitude: Float, + cornerRadiusFraction: Float +) throws -> MeshResource { + var descr = MeshDescriptor(name: "curved_rounded_plane") + let height = width * aspectRatio + let cornerRadius = max(0.0, min(1.0, cornerRadiusFraction)) * width + + let resX = max(2, Int(resolution.0)) + let resY = max(2, Int(resolution.1)) + let vertexCount = resX * resY + + let numQuadsX = resX - 1 + let numQuadsY = resY - 1 + let triangleCount = numQuadsX * numQuadsY * 2 + let indexCount = triangleCount * 3 + + var positions: [SIMD3] = .init(repeating: .zero, count: vertexCount) + var uvs: [SIMD2] = .init(repeating: .zero, count: vertexCount) + var indices: [UInt32] = .init(repeating: 0, count: indexCount) + + let maxCurveAngle: Float = (5.5 * .pi / 6.0) + let currentAngle = maxCurveAngle * max(0.0, min(curveMagnitude, 1.0)) + let halfAngle = currentAngle / 2.0 + let radius: Float = (abs(halfAngle) < 0.0001) ? .infinity : (width / (2.0 * sin(halfAngle))) + + let uvInset: Float = 0.0005 + + var vIndex = 0 + var iIndex = 0 + for y in 0.. 0.0 { + let halfW = width * 0.5 + let halfH = height * 0.5 + let rx = halfW - cornerRadius + let ry = halfH - cornerRadius + + var px = xPlane + var py = yPlane + + let sx = (abs(px) - rx) + let sy = (abs(py) - ry) + + if sx > 0.0 || sy > 0.0 { + let dx = max(sx, 0.0) + let dy = max(sy, 0.0) + let len = simd_length(SIMD2(dx, dy)) + if len > cornerRadius { + let norm = simd_normalize(SIMD2(dx, dy)) + let clamped = norm * cornerRadius + let signX: Float = (px >= 0) ? 1.0 : -1.0 + let signY: Float = (py >= 0) ? 1.0 : -1.0 + px = signX * (rx + clamped.x) + py = signY * (ry + clamped.y) + } + } + + xPlane = px + yPlane = py + } + + let xPos: Float + let zPos: Float + if radius.isFinite && radius > 0 && currentAngle > 0.0001 { + let theta = (u - 0.5) * currentAngle + xPos = radius * sin(theta) + zPos = radius * (cos(halfAngle) - cos(theta)) + } else { + xPos = xPlane + zPos = 0.0 + } + + positions[vIndex] = [xPos, yPlane, zPos] + let uTex = u * (1.0 - 2.0 * uvInset) + uvInset + uvs[vIndex] = [uTex, vTex] + + if x < numQuadsX && y < numQuadsY { + let current = UInt32(vIndex) + let nextRow = current + UInt32(resX) + + let topLeft = current + let topRight = topLeft + 1 + let bottomLeft = nextRow + let bottomRight = bottomLeft + 1 + + indices[iIndex + 0] = topLeft + indices[iIndex + 1] = bottomLeft + indices[iIndex + 2] = bottomRight + + indices[iIndex + 3] = topLeft + indices[iIndex + 4] = bottomRight + indices[iIndex + 5] = topRight + + iIndex += 6 + } + + vIndex += 1 + } + } + + descr.positions = MeshBuffers.Positions(positions) + descr.textureCoordinates = MeshBuffers.TextureCoordinates(uvs) + descr.primitives = .triangles(indices) + + return try MeshResource.generate(from: [descr]) +} diff --git a/Moonlight Vision/FloatingMicButton.swift b/Moonlight Vision/FloatingMicButton.swift new file mode 100644 index 000000000..4c316c0f1 --- /dev/null +++ b/Moonlight Vision/FloatingMicButton.swift @@ -0,0 +1,66 @@ +// +// FloatingMicButton.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// + +import SwiftUI + +struct FloatingMicButton: View { + @StateObject private var micManager = RemoteMicManager() + + var body: some View { + Button(action: { + micManager.toggleMute() + }) { + micIcon + } + .buttonStyle(.plain) + .padding(20) + } + + @ViewBuilder + private var micIcon: some View { + ZStack { + Circle() + .fill(.ultraThinMaterial) + .frame(width: 30, height: 30) + .overlay( + Circle() + .fill(iconGradient) + ) + .shadow( + color: iconShadowColor, + radius: micManager.isMuted ? 5 : 8, + x: 0, + y: 3 + ) + + Image(systemName: micManager.isMuted ? "mic.slash.fill" : "mic.fill") + .font(.system(size: 12, weight: .semibold)) + .foregroundStyle(.white) + } + } + + // MARK: - Computed Properties + + private var iconGradient: LinearGradient { + LinearGradient( + colors: micManager.isMuted + ? [.red.opacity(0.3), .red.opacity(0.2)] + : [.blue.opacity(0.3), .blue.opacity(0.2)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + } + + private var iconShadowColor: Color { + micManager.isMuted ? .red.opacity(0.4) : .blue.opacity(0.4) + } +} + +#Preview { + FloatingMicButton() + .frame(width: 400, height: 400) +} diff --git a/Moonlight Vision/HDRSettings.swift b/Moonlight Vision/HDRSettings.swift index 3d8ba66b2..8ecc76008 100644 --- a/Moonlight Vision/HDRSettings.swift +++ b/Moonlight Vision/HDRSettings.swift @@ -2,70 +2,90 @@ // HDRSettings.swift // Moonlight Vision // -// Created by AI Assistant on 1/19/25. +// Created by AI Assistant on 1/19/25. Updated May 2026 by NeoVector X. // Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. // import Foundation import Combine +private enum HDRSettingsMigration { + /// One-shot: restores pre-overhaul trims for installs that persisted contrast/sat both 1.0. + static let legacyTrimsKey = "hdrTrimsRestoredLegacy_v1" +} + +/// Robust Float reading from UserDefaults — handles Float, Double, or NSNumber storage +private func persistedFloat(forKey key: String, default defaultValue: Float) -> Float { + guard let v = UserDefaults.standard.object(forKey: key) else { return defaultValue } + switch v { + case let f as Float: return f + case let d as Double: return Float(d) + case let n as NSNumber: return n.floatValue + default: return defaultValue + } +} + class HDRSettings: ObservableObject { @Published var brightness: Float { - didSet { - UserDefaults.standard.set(brightness, forKey: "hdrBrightness") - } + didSet { UserDefaults.standard.set(brightness, forKey: "hdrBrightness") } } - + @Published var contrast: Float { - didSet { - UserDefaults.standard.set(contrast, forKey: "hdrContrast") - } + didSet { UserDefaults.standard.set(contrast, forKey: "hdrContrast") } } - + @Published var saturation: Float { - didSet { - UserDefaults.standard.set(saturation, forKey: "hdrSaturation") - } + didSet { UserDefaults.standard.set(saturation, forKey: "hdrSaturation") } } - - @Published var luminance: Float { - didSet { - UserDefaults.standard.set(luminance, forKey: "hdrLuminance") - } - } - - @Published var gamma: Float { - didSet { - UserDefaults.standard.set(gamma, forKey: "hdrGamma") - } + + // Exposure trim — applied after brightness in Metal (PQ + SDR paths for consistent panel behavior). + @Published var pqExposure: Float { + didSet { UserDefaults.standard.set(pqExposure, forKey: "hdrPqExposure") } } - - @Published var peakBrightness: Float { - didSet { - UserDefaults.standard.set(peakBrightness, forKey: "hdrPeakBrightness") - } + + /// Minimal client grading: PQ + gamut + one tone map (no panel boost/sat/con/radial in shader). + @Published var referenceHDR: Bool { + didSet { UserDefaults.standard.set(referenceHDR, forKey: "hdrReferenceMode") } } - + init() { - // Load from UserDefaults with default values - self.brightness = UserDefaults.standard.object(forKey: "hdrBrightness") as? Float ?? 1.35 - self.contrast = UserDefaults.standard.object(forKey: "hdrContrast") as? Float ?? 1.15 - self.saturation = UserDefaults.standard.object(forKey: "hdrSaturation") as? Float ?? 1.4 - self.luminance = UserDefaults.standard.object(forKey: "hdrLuminance") as? Float ?? 300 - self.gamma = UserDefaults.standard.object(forKey: "hdrGamma") as? Float ?? 2.2 - self.peakBrightness = UserDefaults.standard.object(forKey: "hdrPeakBrightness") as? Float ?? 800 + // Match pre-overhaul defaults (NeoMoonlight Vision): strong SDR/headset match without flat “clinical” mids. + let defaultsBrightness: Float = 1.35 + let defaultsContrast: Float = 1.15 + let defaultsSaturation: Float = 1.40 + + var contrastIn = persistedFloat(forKey: "hdrContrast", default: defaultsContrast) + var saturationIn = persistedFloat(forKey: "hdrSaturation", default: defaultsSaturation) + + let alreadyMigrated = UserDefaults.standard.bool(forKey: HDRSettingsMigration.legacyTrimsKey) + if !alreadyMigrated { + UserDefaults.standard.set(true, forKey: HDRSettingsMigration.legacyTrimsKey) + // Brief “neutral 1/1/…” window left dull trims in UserDefaults; restore historical punch. + if persistedFloat(forKey: "hdrContrast", default: defaultsContrast) == 1.0 + && persistedFloat(forKey: "hdrSaturation", default: defaultsSaturation) == 1.0 { + contrastIn = defaultsContrast + saturationIn = defaultsSaturation + UserDefaults.standard.set(contrastIn, forKey: "hdrContrast") + UserDefaults.standard.set(saturationIn, forKey: "hdrSaturation") + } + } + + self.brightness = persistedFloat(forKey: "hdrBrightness", default: defaultsBrightness) + self.contrast = contrastIn + self.saturation = saturationIn + self.pqExposure = persistedFloat(forKey: "hdrPqExposure", default: 1.0) + self.referenceHDR = UserDefaults.standard.bool(forKey: "hdrReferenceMode") } - + func save() { - // Values are automatically saved in didSet + // Values auto-saved in each didSet. } - + func reset() { - brightness = 1.35 - contrast = 1.15 - saturation = 1.4 - luminance = 300 - gamma = 2.2 - peakBrightness = 800 + brightness = 1.35 + contrast = 1.15 + saturation = 1.40 + pqExposure = 1.0 + // Intentionally leave referenceHDR unchanged — user toggles a pipeline mode, not a trim. } -} \ No newline at end of file +} diff --git a/Moonlight Vision/HDRTestStreamView.swift b/Moonlight Vision/HDRTestStreamView.swift index 3c60a9af4..b1ec43126 100644 --- a/Moonlight Vision/HDRTestStreamView.swift +++ b/Moonlight Vision/HDRTestStreamView.swift @@ -468,10 +468,11 @@ struct _HDRTestStreamView: View { contrast: hdrSettings.contrast, saturation: hdrSettings.saturation, brightness: 0.0, + pqExposure: hdrSettings.pqExposure, mode: hdrSettings.mode ) }, - callbackToRender: { texture, correctedResolution in + callbackToRender: { texture, _, correctedResolution in DispatchQueue.main.async { if let correctedResolution = correctedResolution { streamConfig.width = Int32(correctedResolution.0) @@ -683,8 +684,9 @@ struct _HDRTestStreamView: View { } final class HDRTestParams: ObservableObject { - @Published var boost: Float = 1.0 - @Published var contrast: Float = 1.0 + @Published var boost: Float = 1.0 + @Published var contrast: Float = 1.0 @Published var saturation: Float = 1.0 - @Published var mode: Int32 = 1 -} \ No newline at end of file + @Published var pqExposure: Float = 1.0 + @Published var mode: Int32 = 1 +} diff --git a/Moonlight Vision/MainContentView.swift b/Moonlight Vision/MainContentView.swift index 658e34072..3111f62b0 100644 --- a/Moonlight Vision/MainContentView.swift +++ b/Moonlight Vision/MainContentView.swift @@ -418,6 +418,7 @@ struct ComputersTabView: View { @Binding var showDeletionTriggeredMessage: Bool @State private var selectedHostForDetail: TemporaryHost? + @State private var showCoopFlow = false @State private var headerIconPulseScale: CGFloat = 1.0 @State private var headerIconGlowRotation: Double = 0.0 @Environment(\.openWindow) private var openWindow @@ -430,12 +431,10 @@ struct ComputersTabView: View { var body: some View { ZStack { VStack(spacing: 0) { - header - ScrollView { VStack(spacing: 20) { if viewModel.hostsWithPairState.isEmpty { - EmptyStateCard().padding(.top, 40) + EmptyStateCard().padding(.top, 16) } else { ForEach(viewModel.hostsWithPairState, id: \.id) { host in ComputerCard3D( @@ -456,34 +455,35 @@ struct ComputersTabView: View { } } - Spacer().frame(height: 180) + // Standalone Co-op Card (always visible) + StandaloneCoopCard(onTap: { + showCoopFlow = true + }) + .padding(.top, 32) + + Spacer().frame(height: 240) } .padding(.horizontal, 24) - .padding(.vertical, 24) + .padding(.top, 40) } } - VStack { - Spacer() - DiscoveryToggleCard(isRefreshingDiscovery: $isRefreshingDiscovery) { - isRefreshingDiscovery.toggle() - if isRefreshingDiscovery { viewModel.beginRefresh() } - else { viewModel.stopRefresh() } - } - .padding(.horizontal, 24) - .padding(.bottom, 56) - } - - VStack { + // Management cards and version text at bottom (fixed position) + VStack(spacing: 8) { Spacer() - Text("KEPLER EDITION V11.1") + + header + .padding(.horizontal, 24) + + Text("PLATO EDITION V12.1") .font(.custom("Fredoka-Medium", size: 14)) .kerning(2.0) .foregroundColor(Color(red: 0.482, green: 0.502, blue: 0.863)) .frame(maxWidth: .infinity) - .padding(.bottom, 25) + .padding(.top, 8) + .padding(.bottom, 16) + .allowsHitTesting(false) } - .allowsHitTesting(false) } .sheet(item: $selectedHostForDetail) { host in if canShowModal, let index = viewModel.hosts.firstIndex(where: { $0.id == host.id }) { @@ -495,6 +495,12 @@ struct ComputersTabView: View { .environmentObject(viewModel) } } + .sheet(isPresented: $showCoopFlow) { + if canShowModal { + CoopModeSelectionView(isPresented: $showCoopFlow) + .environmentObject(viewModel) + } + } .alert("Add Computer", isPresented: Binding(get: { canShowModal && addingHost }, set: { addingHost = $0 })) { TextField("IP Address or Hostname", text: $newHostIp) Button("Add") { @@ -570,64 +576,129 @@ struct ComputersTabView: View { } private var header: some View { - VStack(alignment: .leading, spacing: 12) { - HStack(spacing: 20) { - // My Computers Icon - ZStack { - Circle() - .fill( - LinearGradient( - colors: [brandBlue.opacity(0.3), brandBlue.opacity(0.15)], - startPoint: .topLeading, - endPoint: .bottomTrailing + HStack(spacing: 16) { + // My Computers Section (Left) + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 12) { + // My Computers Icon + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandBlue.opacity(0.3), brandBlue.opacity(0.15)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) ) - ) - .frame(width: 64, height: 64) - - Image(systemName: "desktopcomputer.and.macbook") - .font(.system(size: 20, weight: .semibold)) - .foregroundStyle(LinearGradient(colors: [.white, .white.opacity(0.9)], startPoint: .top, endPoint: .bottom)) - } - .frame(width: 64, height: 64) - - VStack(alignment: .leading, spacing: 6) { - Text("My Computers") - .font(.system(size: 18, weight: .bold)) - .foregroundColor(.white) + .frame(width: 52, height: 52) + + Image(systemName: "desktopcomputer.and.macbook") + .font(.system(size: 18, weight: .semibold)) + .foregroundStyle(LinearGradient(colors: [.white, .white.opacity(0.9)], startPoint: .top, endPoint: .bottom)) + } + .frame(width: 52, height: 52) - HStack(spacing: 8) { - Circle().fill(brandBlue).frame(width: 8, height: 8) - Text("\(viewModel.hostsWithPairState.count) computer\(viewModel.hostsWithPairState.count == 1 ? "" : "s")") - .font(.subheadline) - .foregroundColor(.white.opacity(0.7)) + VStack(alignment: .leading, spacing: 4) { + Text("My Computers") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.white) + + HStack(spacing: 6) { + Circle().fill(brandBlue).frame(width: 7, height: 7) + Text("\(viewModel.hostsWithPairState.count) computer\(viewModel.hostsWithPairState.count == 1 ? "" : "s")") + .font(.system(size: 12)) + .foregroundColor(.white.opacity(0.7)) + } } } - Spacer() - Button { addingHost = true } label: { - HStack(spacing: 8) { + HStack(spacing: 6) { Image(systemName: "plus.circle.fill") - .font(.system(size: 18, weight: .semibold)) + .font(.system(size: 16, weight: .semibold)) Text("Add PC") .fontWeight(.semibold) + .font(.system(size: 14)) } .foregroundColor(.white) - .padding(.horizontal, 20) - .padding(.vertical, 14) + .frame(maxWidth: .infinity) + .padding(.vertical, 12) .background(buttonBackground(color: Color(red: 0.85, green: 0.6, blue: 0.95))) - .shadow(color: Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.4), radius: 16, x: 0, y: 8) + .shadow(color: Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.4), radius: 12, x: 0, y: 6) } .buttonStyle(ScaleButtonStyle()) } + .padding(20) + .frame(maxWidth: .infinity) + .background(cardBackground) + .shadow(color: .black.opacity(0.15), radius: 20, x: 0, y: 10) + + // Network Discovery Section (Right) + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 12) { + // Network Discovery Icon + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandBlue.opacity(0.3), brandBlue.opacity(0.15)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: 52, height: 52) + + Image(systemName: isRefreshingDiscovery ? "antenna.radiowaves.left.and.right" : "network") + .font(.system(size: 18, weight: .semibold)) + .foregroundStyle(LinearGradient(colors: [.white, .white.opacity(0.9)], startPoint: .top, endPoint: .bottom)) + } + .frame(width: 52, height: 52) + + VStack(alignment: .leading, spacing: 4) { + Text("Network Discovery") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.white) + + HStack(spacing: 6) { + Circle() + .fill(isRefreshingDiscovery ? .green : .gray) + .frame(width: 7, height: 7) + .shadow(color: isRefreshingDiscovery ? .green.opacity(0.8) : .gray.opacity(0.8), radius: 4, x: 0, y: 2) + + Text(isRefreshingDiscovery ? "Scanning..." : "Tap to scan") + .font(.system(size: 12)) + .foregroundColor(.white.opacity(0.7)) + } + } + } + + Button { + isRefreshingDiscovery.toggle() + if isRefreshingDiscovery { viewModel.beginRefresh() } + else { viewModel.stopRefresh() } + } label: { + HStack(spacing: 6) { + Image(systemName: isRefreshingDiscovery ? "stop.circle.fill" : "play.circle.fill") + .font(.system(size: 16, weight: .semibold)) + Text(isRefreshingDiscovery ? "Stop" : "Start") + .fontWeight(.semibold) + .font(.system(size: 14)) + } + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 12) + .background(buttonBackground(color: brandBlue)) + .shadow(color: brandBlue.opacity(0.4), radius: 12, x: 0, y: 6) + } + .buttonStyle(ScaleButtonStyle()) + } + .padding(20) + .frame(maxWidth: .infinity) + .background(cardBackground) + .shadow(color: .black.opacity(0.15), radius: 20, x: 0, y: 10) } - .padding(28) - .background(cardBackground) - .shadow(color: .black.opacity(0.15), radius: 30, x: 0, y: 15) - .padding(.horizontal, 24) - .padding(.top, 16) } private func buttonBackground(color: Color) -> some View { @@ -883,7 +954,11 @@ struct ComputerCard3D: View { @ViewBuilder private var resumeButton: some View { Button { - NotificationCenter.default.post(name: Notification.Name("ResumeStreamFromMenu"), object: nil) + if viewModel.isStreamViewAlive { + NotificationCenter.default.post(name: Notification.Name("ResumeStreamFromMenu"), object: nil) + } else { + viewModel.shouldRelaunchStream = true + } } label: { Text("Resume") .fontWeight(.semibold) @@ -1042,7 +1117,7 @@ struct EmptyStateCard: View { .blur(radius: 20) Image(systemName: "desktopcomputer") - .font(.system(size: 48, weight: .light)) + .font(.system(size: 36, weight: .light)) .foregroundStyle( LinearGradient( colors: [brandBlue, brandBlue.opacity(0.6)], @@ -1052,19 +1127,20 @@ struct EmptyStateCard: View { ) } - VStack(spacing: 8) { + VStack(spacing: 6) { Text("No Computers Found") - .font(.title3) + .font(.headline) .fontWeight(.semibold) .foregroundColor(.white) Text("Add your gaming PC to get started") - .font(.subheadline) + .font(.caption) .foregroundColor(.white.opacity(0.6)) } } .frame(maxWidth: .infinity) - .padding(48) + .padding(.vertical, 32) + .padding(.horizontal, 40) .background( RoundedRectangle(cornerRadius: 20) .fill(.ultraThinMaterial) @@ -1172,6 +1248,134 @@ struct DiscoveryToggleCard: View { } } +// MARK: - Standalone Co-op Card +struct StandaloneCoopCard: View { + let onTap: () -> Void + + let brandPink = Color(red: 1.0, green: 0.6, blue: 0.8) + + var body: some View { + Button(action: onTap) { + HStack(spacing: 16) { + // Icon + ZStack { + Circle() + .fill( + LinearGradient( + colors: [brandPink.opacity(0.3), brandPink.opacity(0.15)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .frame(width: 64, height: 64) + + Image(systemName: "person.2.fill") + .font(.system(size: 28, weight: .semibold)) + .foregroundColor(brandPink) + } + + // Text + VStack(alignment: .leading, spacing: 8) { + Text("Co-op Play") + .font(.system(size: 22, weight: .bold)) + .foregroundColor(.white) + + HStack(spacing: 8) { + Circle() + .fill(brandPink) + .frame(width: 10, height: 10) + .shadow(color: brandPink.opacity(0.8), radius: 4, x: 0, y: 2) + + Text("Play together via SharePlay") + .font(.system(size: 14)) + .foregroundColor(.white.opacity(0.7)) + } + } + + Spacer() + + // Co-op Button (styled like the original) + HStack(spacing: 8) { + Image(systemName: "play.circle.fill") + .font(.system(size: 18, weight: .semibold)) + Text("Connect") + .fontWeight(.semibold) + } + .foregroundColor(.white) + .opacity(0) + .padding(.horizontal, 20) + .padding(.vertical, 14) + .overlay( + HStack(spacing: 8) { + Image(systemName: "person.2.fill") + .font(.system(size: 18, weight: .semibold)) + Text("Co-op") + .fontWeight(.semibold) + } + .foregroundColor(.white) + ) + .background( + ZStack { + // Shadow layer + RoundedRectangle(cornerRadius: 14) + .fill(brandPink.opacity(0.3)) + .offset(y: 4) + .blur(radius: 6) + + // Main button with gradient and stroke + RoundedRectangle(cornerRadius: 14) + .fill( + LinearGradient( + colors: [brandPink, brandPink.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 14) + .strokeBorder( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) + } + ) + .shadow(color: brandPink.opacity(0.4), radius: 16, x: 0, y: 8) + } + .padding(20) + .background( + ZStack { + // Shadow layer + RoundedRectangle(cornerRadius: 20) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.90)) + .offset(y: 6) + .blur(radius: 12) + + // Main background with gradient border + RoundedRectangle(cornerRadius: 20) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.90)) + .overlay( + RoundedRectangle(cornerRadius: 20) + .strokeBorder( + LinearGradient( + colors: [.white.opacity(0.15), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + } + ) + } + .buttonStyle(ScaleButtonStyle()) + } +} + // MARK: - Scale Button Style struct ScaleButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { @@ -1183,4 +1387,4 @@ struct ScaleButtonStyle: ButtonStyle { #Preview { MainContentView().environmentObject(MainViewModel.shared) -} +} \ No newline at end of file diff --git a/Moonlight Vision/MainContentViewAttachment.swift b/Moonlight Vision/MainContentViewAttachment.swift index 1f27fec55..e0282af34 100644 --- a/Moonlight Vision/MainContentViewAttachment.swift +++ b/Moonlight Vision/MainContentViewAttachment.swift @@ -27,6 +27,10 @@ struct MainContentViewAttachment: View { struct HostedMainContentView: UIViewRepresentable { @EnvironmentObject var viewModel: MainViewModel + func makeCoordinator() -> Coordinator { + Coordinator() + } + func makeUIView(context: Context) -> UIView { let hostingController = UIHostingController(rootView: MainContentView() @@ -34,6 +38,8 @@ struct HostedMainContentView: UIViewRepresentable { .environment(\.isEmbeddedInCurved, true) ) + context.coordinator.hostingController = hostingController + hostingController.view.backgroundColor = .clear hostingController.view.isOpaque = false @@ -43,4 +49,8 @@ struct HostedMainContentView: UIViewRepresentable { func updateUIView(_ uiView: UIView, context: Context) { // Updates are handled automatically by SwiftUI's environment } + + class Coordinator { + var hostingController: AnyObject? + } } \ No newline at end of file diff --git a/Moonlight Vision/MainViewModel.swift b/Moonlight Vision/MainViewModel.swift index 5762741a2..ff9496025 100644 --- a/Moonlight Vision/MainViewModel.swift +++ b/Moonlight Vision/MainViewModel.swift @@ -56,6 +56,14 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback // Central lifecycle state @Published var streamState: StreamLifecycleState = .idle + + /// Tracks whether an immersive space is currently open. + /// Used to prevent "Unable to dismiss an Immersive Space since none is opened" crashes. + @Published var isImmersiveSpaceOpen: Bool = false + + /// Active session token - views must match this to run logic. + /// Ghost views with stale tokens render black and do nothing. + @Published var activeSessionToken: String = "" @Published var isMainViewVisible: Bool = false @@ -65,6 +73,24 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback @Published var reconnectCooldownUntil: Date? = nil @Published var isSwappingRenderers: Bool = false + + /// True when the stream view (CurvedDisplay/FlatDisplay) is alive and listening for notifications. + /// Used by Resume button to decide whether to post a notification or re-launch the immersive space. + @Published var isStreamViewAlive: Bool = false + + /// Set by Resume button when the stream view is dead and needs to be re-launched. + /// Observed by MoonlightVisionApp to re-open the immersive space. + @Published var shouldRelaunchStream: Bool = false + + /// Set true before stopStream() during background suspend so that the + /// resulting ConnectionLost notification is ignored (it's not a real disconnect). + @Published var isSuspendingForBackground: Bool = false + + // Co-op Session State + @Published var isCoopSession: Bool = false + @Published var assignedControllerSlot: Int = 0 + @Published var coopPartnerName: String? + var coopBitrateOverride: Int32? = nil // Set by co-op host view private var lastSwapAt: Date? = nil private let minSwapInterval: TimeInterval = 1.2 @@ -83,14 +109,35 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback print("INITING MAIN MODEL") boxArtCache = NSCache() dataManager = DataManager() - CryptoManager.generateKeyPairUsingSSL() - clientCert = CryptoManager.readCertFromFile() + + // Clean up any co-op hosts that were saved to database (now they're memory-only) + dataManager.removeCoopHosts() + + // Read cert if it already exists (fast path for subsequent launches) + clientCert = CryptoManager.readCertFromFile() ?? Data() uniqueId = IdManager.getUniqueId() streamSettings = dataManager.getSettings() super.init() + + // Generate cert on background thread if needed (expensive on first launch) + DispatchQueue.global(qos: .userInitiated).async { [weak self] in + CryptoManager.generateKeyPairUsingSSL() + let cert = CryptoManager.readCertFromFile() + DispatchQueue.main.async { + if let cert = cert { + self?.clientCert = cert + print("[Init] Certificate ready (background)") + } + } + } + + // Load gaze control settings from UserDefaults (not stored in Core Data) + streamSettings.curvedGazeUseTouchMode = UserDefaults.standard.bool(forKey: "curved.gazeUseTouchMode") + streamSettings.gazeCursorOffsetX = UserDefaults.standard.integer(forKey: "gaze.cursorOffsetX") + streamSettings.gazeCursorOffsetY = UserDefaults.standard.integer(forKey: "gaze.cursorOffsetY") appManager = AppAssetManager(callback: self) - discoveryManager = DiscoveryManager(hosts: hosts, andCallback: self) + discoveryManager = DiscoveryManager(hosts: hosts, andCallback: self, uniqueId: uniqueId, cert: clientCert) // Observe first-frame and teardown events to drive lifecycle state let center = NotificationCenter.default @@ -98,6 +145,10 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback center.addObserver(forName: Notification.Name("StreamFirstFrameShownNotification"), object: nil, queue: .main) { [weak self] _ in guard let self else { return } Task { @MainActor in + guard self.streamState == .starting else { + print("[Lifecycle] Ignoring stale StreamFirstFrameShown (current state: \(self.streamState.rawValue))") + return + } print("[Lifecycle] First frame shown (UIKit). streamState -> running") self.streamState = .running } @@ -106,6 +157,10 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback center.addObserver(forName: Notification.Name("RKStreamFirstFrameShown"), object: nil, queue: .main) { [weak self] _ in guard let self else { return } Task { @MainActor in + guard self.streamState == .starting else { + print("[Lifecycle] Ignoring stale RKStreamFirstFrameShown (current state: \(self.streamState.rawValue))") + return + } print("[Lifecycle] First frame shown (RealityKit). streamState -> running") self.streamState = .running } @@ -118,6 +173,41 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback center.addObserver(forName: Notification.Name("RKStreamDidTeardown"), object: nil, queue: .main) { [weak self] _ in self?.onTeardownComplete() } + + // StreamStartFailed is posted by stageFailed/launchFailed when a connection + // attempt fails before reaching .running. This is separate from RKStreamDidTeardown + // (which fires when an old stream's cleanup completes) to avoid a race where an old + // teardown arriving during a new stream's .starting phase incorrectly resets state. + // Defer to next run loop to avoid "Modifying state during view update" when the + // notification is delivered during a SwiftUI update. + center.addObserver(forName: Notification.Name("StreamStartFailed"), object: nil, queue: .main) { [weak self] _ in + DispatchQueue.main.async { self?.onStreamStartFailed() } + } + + // ConnectionLost is posted by connectionTerminated to trigger the view's + // teardown flow without prematurely resetting streamState. This ensures + // shouldCloseStream is set so the view calls performCompleteTeardown, + // which waits for LiStopConnection() to finish before posting RKStreamDidTeardown. + center.addObserver(forName: Notification.Name("ConnectionLost"), object: nil, queue: .main) { [weak self] _ in + DispatchQueue.main.async { + guard let self else { return } + print("[Lifecycle] ConnectionLost received.") + + if self.isSuspendingForBackground { + print("[Lifecycle] Ignoring ConnectionLost — app is suspending for background") + return + } + + // Only trigger shouldCloseStream if we're in a state where the view + // needs to clean up. During user-initiated disconnect, shouldCloseStream + // is already being set by beginDisconnect. + if self.streamState == .running || self.streamState == .starting { + print("[Lifecycle] Setting streamState -> stopping and shouldCloseStream for view teardown") + self.streamState = .stopping + self.shouldCloseStream = true + } + } + } } private func onTeardownComplete() { @@ -131,6 +221,26 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback self.currentlyStreamingAppId = nil self.streamState = .idle + // FIXED: Clear cooldown immediately after successful teardown + self.reconnectCooldownUntil = nil + + // Clean up co-op session state + // CRITICAL: endSession() is called HERE (after stream stopped) not earlier. + // This ensures LiStopConnection() can send quit packets before SharePlay dies. + if self.isCoopSession { + debugLog("[Lifecycle] Stream teardown complete. NOW ending SharePlay session safely.") + self.isCoopSession = false + self.assignedControllerSlot = 0 + self.coopPartnerName = nil + self.coopBitrateOverride = nil + + // End the SharePlay session in the coordinator + Task { + await CoopSessionCoordinator.shared.endSession() + debugLog("[Lifecycle] SharePlay endSession() completed") + } + } + // If we are not in a swap operation, the disconnect is complete. if !self.isSwappingRenderers { self.activelyStreaming = false @@ -138,6 +248,39 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback } } + /// Handles connection attempts that fail before reaching .running (stageFailed/launchFailed). + /// Unlike onTeardownComplete, this specifically targets the .starting state so that a stale + /// teardown from an old stream can't accidentally reset a new stream's state. + /// + /// Instead of jumping directly to .idle, we transition to .stopping and set shouldCloseStream + /// so the view (FlatDisplay/CurvedDisplay) tears down its resources (streamMan, immersive space). + /// The view's teardown will then post RKStreamDidTeardown → onTeardownComplete → .idle. + private func onStreamStartFailed() { + guard streamState == .starting else { + print("[Lifecycle] Ignoring StreamStartFailed because state is not 'starting' (current: \(streamState.rawValue))") + return + } + print("[Lifecycle] Stream start failed. Triggering view teardown (streamState -> stopping)") + self.streamState = .stopping + self.shouldCloseStream = true + self.reconnectCooldownUntil = nil + + if self.isCoopSession { + print("[Lifecycle] Cleaning up co-op session after start failure") + self.isCoopSession = false + self.assignedControllerSlot = 0 + self.coopPartnerName = nil + self.coopBitrateOverride = nil + Task { + await CoopSessionCoordinator.shared.endSession() + } + } + + if !self.isSwappingRenderers { + self.activelyStreaming = false + } + } + var hostsWithPairState: [TemporaryHost] { let filteredHosts = hosts.filter { host in let isPaired = host.pairState == .paired @@ -447,7 +590,23 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback return nil } + // Check cooldown without blocking UI thread + if let cooldown = reconnectCooldownUntil, cooldown.timeIntervalSinceNow > 0 { + let remaining = cooldown.timeIntervalSinceNow + print("[Safety] Cannot start stream - cooldown active for \(String(format: "%.1f", remaining))s") + return nil // Caller will handle gracefully with error message + } + let config = StreamConfiguration() + + // CRITICAL: Sync the config's sessionUUID with the activeSessionToken. + // This ensures the view created with this config will pass the token guard. + // If activeSessionToken is empty (first stream), generate one now. + if activeSessionToken.isEmpty { + activeSessionToken = UUID().uuidString + } + config.sessionUUID = activeSessionToken + debugLog("[Stream] Created StreamConfiguration with sessionUUID: \(config.sessionUUID) (matches activeSessionToken)") guard let host = app.host() else { print("stream - ERROR: App \(app.name) has no associated host.") @@ -476,13 +635,36 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback config.frameRate = streamSettings.framerate config.height = streamSettings.height config.width = streamSettings.width - config.bitRate = streamSettings.bitrate + + // Use co-op bitrate if in co-op session and override is set + if isCoopSession, let coopBitrate = coopBitrateOverride { + config.bitRate = coopBitrate + print("stream - Co-op mode: Using co-op bitrate \(coopBitrate / 1000) Mbps") + } else { + config.bitRate = streamSettings.bitrate + print("stream - Using standard bitrate \(streamSettings.bitrate / 1000) Mbps") + } + config.optimizeGameSettings = streamSettings.optimizeGames config.playAudioOnPC = streamSettings.playAudioOnPC config.useFramePacing = streamSettings.useFramePacing config.swapABXYButtons = streamSettings.swapABXYButtons - config.multiController = streamSettings.multiController - config.gamepadMask = ControllerSupport.getConnectedGamepadMask(config, settings: streamSettings) + + // Co-op session: Use assigned controller slot. Otherwise, auto-detect connected gamepads. + if isCoopSession { + config.multiController = false // Force single controller mode in co-op to prevent conflicts + // FIX: Set gamepadMask to match the controller slot (Host: 0x1, Guest: 0x2) + // This ensures each player claims only their own controller slot during connection + config.gamepadMask = Int32(1 << assignedControllerSlot) + config.controllerSlotOffset = Int32(assignedControllerSlot) + print("stream - Co-op mode: Using controller slot \(assignedControllerSlot), mask: 0x\(String(config.gamepadMask, radix: 16)), slotOffset: \(config.controllerSlotOffset)") + } else { + config.multiController = streamSettings.multiController + config.gamepadMask = ControllerSupport.getConnectedGamepadMask(config, settings: streamSettings) + config.controllerSlotOffset = 0 + print("stream - Solo mode: multiController=\(config.multiController), mask=\(config.gamepadMask), slotOffset=0") + } + config.audioConfiguration = (0x63f << 16) | (8 << 8) | 0xca // 7.1 Surround config.serverCodecModeSupport = host.serverCodecModeSupport @@ -587,7 +769,7 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback // Check cooldown guard canReconnectNow() else { let remaining = reconnectCooldownRemaining() - print("[Safety] Cannot start stream - cooldown active (\(remaining)s remaining)") + print("[Safety] Cannot start stream - cooldown active (\(String(format: "%.1f", remaining))s remaining)") return false } @@ -597,15 +779,80 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback return false } + // CRITICAL FIX: Ensure shouldCloseStream is false + guard !shouldCloseStream else { + print("[Safety] Cannot start stream - shouldCloseStream is still true from previous disconnect") + return false + } + + // CRITICAL FIX: Ensure activelyStreaming is false to prevent double-init + guard !activelyStreaming else { + print("[Safety] Cannot start stream - activelyStreaming is already true") + return false + } + return true } + + /// Defensively cleans up any stale state before starting a new stream. + /// Call this when the user explicitly wants to start a new connection. + func prepareForNewStream() { + debugLog("[Safety] prepareForNewStream() - streamState: \(streamState.rawValue), activelyStreaming: \(activelyStreaming)") + + // CRITICAL: Generate new session token FIRST. + // This INSTANTLY invalidates any ghost views holding an old token. + // Ghost views will check this token and render black instead of running logic. + let newToken = UUID().uuidString + activeSessionToken = newToken + debugLog("[Safety] Generated new activeSessionToken: \(newToken)") + + // If we're stuck in stopping state for too long, force reset + if streamState == .stopping { + print("[Safety] ⚠️ Force resetting stuck 'stopping' state to 'idle'") + streamState = .idle + } + + // Clear stale shouldCloseStream flag + if shouldCloseStream { + print("[Safety] ⚠️ Clearing stale shouldCloseStream flag") + shouldCloseStream = false + } + + // Clear stale activelyStreaming flag (if no stream is actually running) + if activelyStreaming && streamState == .idle { + print("[Safety] ⚠️ Clearing stale activelyStreaming flag") + activelyStreaming = false + } + + // Clear any expired cooldown + if let cooldown = reconnectCooldownUntil, cooldown.timeIntervalSinceNow <= 0 { + print("[Safety] Clearing expired cooldown") + reconnectCooldownUntil = nil + } + + // Clear swapping flag if stuck + if isSwappingRenderers && streamState == .idle { + print("[Safety] ⚠️ Clearing stuck isSwappingRenderers flag") + isSwappingRenderers = false + } + } func userDidRequestDisconnect() { print("[ViewModel] User requested disconnect. Setting activelyStreaming to false.") - self.activelyStreaming = false - - // Let the UI update before we start the teardown + + // Defer state updates to the next run loop to prevent "Modifying state during view update" warnings DispatchQueue.main.async { + self.activelyStreaming = false + + // Note: Do NOT call endSession() here! + // SharePlay must stay alive until AFTER LiStopConnection() finishes, + // otherwise the C-library hangs waiting for network ACKs that will never come. + // endSession() will be called in onTeardownComplete() after stream stops. + + if self.isCoopSession { + print("[ViewModel] Co-op session active - will end SharePlay AFTER stream teardown") + } + self.beginDisconnect() } } @@ -618,11 +865,59 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback return } - print("[ViewModel] Setting state to 'stopping'. Firing 'shouldCloseStream'.") + print("[ViewModel] Setting state to 'stopping'. Sending quit request to server.") self.streamState = .stopping - self.shouldCloseStream = true - - beginReconnectCooldown(2.0) + + // FIXED: Reduce cooldown since teardown completion now clears it automatically + beginReconnectCooldown(1.5) + + // Send quit request and wait for it to complete BEFORE triggering teardown + if let appId = currentlyStreamingAppId, + let host = hosts.first(where: { $0.appList.contains(where: { $0.id == appId || $0.name == appId }) }) { + + print("[ViewModel] ✅ Found host: \(host.name) for app: \(appId)") + print("[ViewModel] 📡 Creating quit request to \(host.activeAddress ?? "unknown")") + + let httpManager = HttpManager(host: host) + let httpResponse = HttpResponse() + let quitRequest = HttpRequest(for: httpResponse, with: httpManager?.newQuitAppRequest()) + + print("[ViewModel] 🚀 Executing quit request synchronously...") + + // Execute on background queue to avoid blocking UI + DispatchQueue.global(qos: .userInitiated).async { + httpManager?.executeRequestSynchronously(quitRequest) + + DispatchQueue.main.async { + if httpResponse.isStatusOk() { + print("[ViewModel] ✅ Quit request SUCCESS - Server responded OK") + } else { + print("[ViewModel] ❌ Quit request FAILED - Server error: \(httpResponse.statusMessage ?? "none")") + } + + // FIXED: Shorter delay since quit is now synchronous + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + print("[ViewModel] Quit request completed. Now firing 'shouldCloseStream'.") + self.shouldCloseStream = true + } + } + } + + // Safety timeout: if quit request hangs (server unreachable, network stall), + // force teardown after 8s so the app doesn't get stuck in .stopping forever. + DispatchQueue.main.asyncAfter(deadline: .now() + 8.0) { [weak self] in + guard let self, self.streamState == .stopping, !self.shouldCloseStream else { return } + print("[ViewModel] ⚠️ Quit request timed out after 8s — forcing shouldCloseStream") + self.shouldCloseStream = true + } + } else { + print("[ViewModel] ⚠️ WARNING: No active app found (appId: \(currentlyStreamingAppId ?? "nil")), skipping quit request") + + // No quit request needed, proceed directly to teardown + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.shouldCloseStream = true + } + } Task { await cleanupAudioSession() @@ -669,12 +964,14 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback var fired = false var obs1: NSObjectProtocol? var obs2: NSObjectProtocol? + var obs3: NSObjectProtocol? func cleanup(label: String, timedOut: Bool = false) { if fired { return } fired = true if let o = obs1 { center.removeObserver(o) } if let o = obs2 { center.removeObserver(o) } + if let o = obs3 { center.removeObserver(o) } Task { @MainActor in if timedOut { @@ -697,6 +994,9 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback obs2 = center.addObserver(forName: Notification.Name("RKStreamDidTeardown"), object: nil, queue: .main) { _ in cleanup(label: "RKStreamDidTeardown") } + obs3 = center.addObserver(forName: Notification.Name("StreamStartFailed"), object: nil, queue: .main) { _ in + cleanup(label: "StreamStartFailed") + } DispatchQueue.main.asyncAfter(deadline: .now() + timeout) { cleanup(label: "timeout", timedOut: true) @@ -748,8 +1048,43 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback } // END SwapSafetyGuardrails + // MARK: - Centralized Safe Teardown + + /// Safely tears down stream UI: dismisses any lingering UIKit presentations (e.g. error alerts), + /// closes all stream windows, then updates state on the next run loop to avoid "Modifying state during view update" crashes. + @MainActor + func performSafeTeardown(dismissWindow: DismissWindowAction, dismissImmersiveSpace: DismissImmersiveSpaceAction?) async { + print("[ViewModel] Performing safe asynchronous teardown.") + + // 1. Force dismiss any lingering UIKit alerts/presentations + if let classicVC = _UIKitStreamView.controllerReference.object { + classicVC.presentedViewController?.dismiss(animated: false) + } + + // FIX: 150ms so the UIKit presentation is fully deallocated before SwiftUI destroys the window + try? await Task.sleep(for: .milliseconds(150)) + + // 2. Dismiss all streaming windows + dismissWindow(id: "classicStreamingWindow") + dismissWindow(id: "flatDisplayWindow") + + // 3. Dismiss immersive space if one exists + if let dismissImmersiveSpace = dismissImmersiveSpace { + await dismissImmersiveSpace() + self.isImmersiveSpaceOpen = false + } + + // 4. Update state asynchronously to prevent "Modifying state during view update" warnings + DispatchQueue.main.async { + self.activelyStreaming = false + self.streamState = .idle + self.shouldCloseStream = false + self.isStreamViewAlive = false + } + } + // MARK: - Renderer Swap Support - + @MainActor func performRendererSwap(openWindow: OpenWindowAction, openImmersiveSpace: OpenImmersiveSpaceAction, dismissWindow: DismissWindowAction, dismissImmersiveSpace: DismissImmersiveSpaceAction? = nil) async { if let last = lastSwapAt { @@ -781,11 +1116,11 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback let configToRestore = self.currentStreamConfig let appIdToRestore = self.currentlyStreamingAppId let currentRenderer = streamSettings.renderer - let targetRenderer: Renderer = (currentRenderer == .classic || currentRenderer == .classicMetal) ? .curvedDisplay : .classicMetal + let targetRenderer: Renderer = (currentRenderer == .classicMetal) ? .curvedDisplay : .classicMetal - // PRE-CLOSE: If we're on the classic window, try dismissing it up-front to avoid hanging "Disconnected" view. - if currentRenderer == .classic || currentRenderer == .classicMetal { - print("[ViewModel] Swap: Pre-closing classicStreamingWindow") + // PRE-CLOSE: If we're on the flat display window, try dismissing it up-front + if currentRenderer == .classicMetal { + print("[ViewModel] Swap: Pre-closing flatDisplayWindow") dismissWindow(id: Renderer.classicMetal.windowId) } @@ -799,24 +1134,15 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback // END SwapSafetyGuardrails print("[ViewModel] ✅ Swap: Teardown confirmed.") - - // 4. Dismiss the old surface (again, post-teardown to be extra sure) - if targetRenderer == .classicMetal { - print("[ViewModel] Swap: Dismissing immersive space (post-teardown)") - await dismissImmersiveSpace?() - // BEGIN SwapSafetyGuardrails: immersive dismissal settle buffer INCREASED for reliability - try? await Task.sleep(for: .milliseconds(1800)) - // END SwapSafetyGuardrails - } else { - print("[ViewModel] Swap: Dismissing classicStreamingWindow (post-teardown)") - dismissWindow(id: "classicStreamingWindow") - // BEGIN SwapSafetyGuardrails: window server settle buffer INCREASED for curved reopening - try? await Task.sleep(for: .milliseconds(1800)) - // END SwapSafetyGuardrails - } + + // 4. Safe teardown: dismiss any UIKit presentations, all stream windows, and immersive space + await performSafeTeardown(dismissWindow: dismissWindow, dismissImmersiveSpace: dismissImmersiveSpace) + try? await Task.sleep(for: .milliseconds(300)) // 5. Update settings for the new renderer streamSettings.renderer = targetRenderer + // Persist renderer choice immediately so it survives app restarts/reboots + streamSettings.save() // 6. Restore the stream config and "arm" the system for reconnection self.currentStreamConfig = configToRestore @@ -839,11 +1165,11 @@ class MainViewModel: NSObject, ObservableObject, DiscoveryCallback, PairCallback } } - // 8. Best-effort cleanup for any stray classic windows + // 8. Best-effort cleanup for any stray flat display windows if targetRenderer == .curvedDisplay { DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { - print("[ViewModel] Swap: Post-open cleanup of classicStreamingWindow (safety)") - dismissWindow(id: "classicStreamingWindow") + print("[ViewModel] Swap: Post-open cleanup of flatDisplayWindow (safety)") + dismissWindow(id: "flatDisplayWindow") } } diff --git a/Moonlight Vision/MetalVideoDecoderRenderer.swift b/Moonlight Vision/MetalVideoDecoderRenderer.swift index ecfeaba48..3f08c5cbf 100644 --- a/Moonlight Vision/MetalVideoDecoderRenderer.swift +++ b/Moonlight Vision/MetalVideoDecoderRenderer.swift @@ -6,6 +6,7 @@ import AVFoundation import CoreFoundation +import CoreMedia import CoreVideo import Foundation import Metal @@ -13,6 +14,7 @@ import MetalKit import QuartzCore import UIKit import VideoToolbox +import simd // MARK: - Metal Video Decoder Renderer for UIKit (Enhanced HDR 2D Mode) @@ -90,22 +92,68 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { print("MetalVideoDecoderRenderer: hdrContrast changed to \(hdrContrast)") } } + @objc dynamic public var hdrPqExposure: Float = 1.0 { + didSet { + print("MetalVideoDecoderRenderer: hdrPqExposure changed to \(hdrPqExposure)") + } + } @objc dynamic public var hdrLuminosity: Float = 1.0 @objc dynamic public var hdrGamma: Float = 1.0 @objc dynamic public var presetActive: Bool = false @objc dynamic public var presetMode: Int32 = 0 // 0=Power Curve, 1=ACES, 2=ACES+Vibrance private var logCounter: Int = 0 - - // HDR enhancement parameters struct for passing to shader - private struct ShaderHDRParams { - var boost: Float // luminosity - var contrast: Float // gamma/contrast + + // Fragment buffer layouts for `draw(in:)` — must match `Shaders.metal`. + // Declared on the class (not inside `draw`) so local `let` names never collide with + // struct property names (Swift otherwise reports “Cannot find … in scope” after the `if`). + private struct MetalCopyShaderHDRParams { + var isPQ: UInt32 + var primariesType: UInt32 + var extendedScene: UInt32 = 0 + var reserved0: UInt32 = 0 + var hdrEdrHeadroom: Float + var pad: Float = 0 + var alignPad: SIMD2 = .zero + var maxContentNits: Float = 0 + var maxFrameAvgNits: Float = 0 + var padHdrMeta: SIMD2 = .zero + var yuvMatrix: simd_float3x3 + var yuvOffset: simd_float3 + } + + private struct MetalCopyFullHDRParams { + var boost: Float + var contrast: Float var saturation: Float var brightness: Float - var mode: Int32 // 0,1,2 + var pqExposure: Float + var mode: Int32 + var hdrGradeFlags: UInt32 } - + + private struct MetalCopyLegacySDRFrameParams { + var presetIndex: UInt32 = 0 + var isPQ: UInt32 + var isBT2020Matrix: UInt32 + var isBT2020Primaries: UInt32 + } + + private struct MetalCopyLegacySDRFullParams { + var boost: Float + var contrast: Float + var saturation: Float + var brightness: Float + var mode: Int32 + } + + private struct MetalCopyColorEnhancementUniforms { + var saturation: Float + var contrast: Float + var warmth: Float + var padding1: Float + } + // MARK: - Initialization @objc(initWithView:callbacks:streamAspectRatio:useFramePacing:enableHDR:) @@ -121,12 +169,10 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { // Setup Metal view - use exact bounds self.metalView = MTKView(frame: view.bounds, device: MTLCreateSystemDefaultDevice()) self.metalView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + // CRITICAL FIX: Let the system manage scaling and drawable size + // DO NOT force contentScaleFactor - this causes softness self.metalView.autoResizeDrawable = true - // Ensure 16pt rounded corners at the UIKit layer - view.layer.cornerRadius = 16 - view.layer.masksToBounds = true - self.metalView.layer.cornerRadius = 16 - self.metalView.layer.masksToBounds = true if enableHDR { metalFormat = .bgra10_xr @@ -135,8 +181,13 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { if let metalLayer = metalView.layer as? CAMetalLayer { metalLayer.wantsExtendedDynamicRangeContent = true metalLayer.pixelFormat = .bgra10_xr - metalLayer.cornerRadius = 16 - metalLayer.masksToBounds = true + + // CRITICAL: Disable all implicit filtering for maximum sharpness + metalLayer.magnificationFilter = .nearest + metalLayer.minificationFilter = .nearest + metalLayer.allowsEdgeAntialiasing = false + metalLayer.framebufferOnly = true + if let extendedColorSpace = CGColorSpace(name: CGColorSpace.extendedLinearDisplayP3) { metalLayer.colorspace = extendedColorSpace print("MetalVideoDecoderRenderer: Set extended color space (EDR XR)") @@ -147,13 +198,17 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { } else { metalFormat = .bgra8Unorm_srgb metalView.colorPixelFormat = .bgra8Unorm_srgb + + // CRITICAL: Disable all implicit filtering for SDR too if let metalLayer = metalView.layer as? CAMetalLayer { - metalLayer.cornerRadius = 16 - metalLayer.masksToBounds = true + metalLayer.magnificationFilter = .nearest + metalLayer.minificationFilter = .nearest + metalLayer.allowsEdgeAntialiasing = false + metalLayer.framebufferOnly = true } } - // Ensure view is visible and properly configured + // CRITICAL: Keep layer OPAQUE for maximum sharpness (no compositor blur) self.metalView.isHidden = false self.metalView.alpha = 1.0 self.metalView.backgroundColor = .black @@ -161,6 +216,9 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { self.metalView.layer.isOpaque = true self.metalView.clearsContextBeforeDrawing = false + // CRITICAL: NO corner radius, NO masking - keep completely raw + // Let SwiftUI overlay handle the visual rounding + self.callbacks = callbacks self.streamAspectRatio = streamAspectRatio self.framePacing = useFramePacing @@ -182,6 +240,8 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { super.init() + // self.applyRoundedCornerMask(to: self.metalView) + decoderCallback.decompressionOutputRefCon = Unmanaged.passUnretained(self).toOpaque() NotificationCenter.default.addObserver(self, selector: #selector(handleForceStop), name: .forceStopRendering, object: nil) @@ -271,15 +331,13 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { self.frameRate = frameRate self.videoWidth = Int(videoWidth) self.videoHeight = Int(videoHeight) - print("MetalVideoDecoderRenderer: Setup with format=\(videoFormat), \(videoWidth)x\(videoHeight)@\(frameRate)fps") - + // Configure cache attributes let cacheAttributes: [String: Any] = [ kCVMetalTextureCacheMaximumTextureAgeKey as String: 1, ] - - // Let VideoToolbox choose the best pixel format - don't force anything + let textureAttributes: [String: Any] = { var attrs: [String: Any] = [ kCVPixelBufferMetalCompatibilityKey as String: true, @@ -311,7 +369,7 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { if let parent = self.parentView { parent.bringSubviewToFront(self.metalView) } - print("MetalVideoDecoderRenderer: Metal view visible, frame=\(self.metalView.frame)") + print("MetalVideoDecoderRenderer: Metal view visible, frame=\(self.metalView.frame), drawableSize=\(self.metalView.drawableSize)") } } @@ -435,7 +493,7 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { if hdrEnabled { attributes[kCVPixelBufferPixelFormatTypeKey] = kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange } - + VTDecompressionSessionCreate( allocator: kCFAllocatorDefault, formatDescription: formatDesc, @@ -460,6 +518,11 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { return DR_NEED_IDR } + guard let session = session else { + free(dataPtr) + return DR_NEED_IDR + } + guard let sampleBuffer = createSampleBuffer( dataPtr: dataPtr, length: Int(length), @@ -471,7 +534,7 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { } VTDecompressionSessionDecodeFrame( - session!, + session, sampleBuffer: sampleBuffer, flags: [._EnableAsynchronousDecompression], frameRefcon: nil, @@ -534,7 +597,8 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { let frameData = Data(bytesNoCopy: dataPtr, count: Int(length), deallocator: .none) return createAV1FormatDescriptionForIDRFrame(frameData) } else { - abort() + // Unsupported video format - return nil to request IDR + return nil } } @@ -613,7 +677,11 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { do { return try frameData.withUnsafeBytes { (buffer: UnsafeRawBufferPointer) -> CMFormatDescription in var mutableBuffer = UnsafeMutableBufferPointer(mutating: buffer.bindMemory(to: UInt8.self)) - return try CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C(mutableBuffer) + return try CMVideoFormatDescriptionCreateFromAV1SequenceHeaderOBUWithAV1C( + mutableBuffer, + masteringDisplayColorVolume: masteringDisplayColorVolume, + contentLightLevelInfo: contentLightLevelInfo + ) } } catch { print("MetalVideoDecoderRenderer: AV1 format description creation failed: \(error)") @@ -775,7 +843,12 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { // DON'T deallocate - the buffer is managed by C code let blockBufferLength = buffer.count + naluIndices.filter(\.threeByteHeader).count - let blockBuffer = try! CMBlockBuffer(length: blockBufferLength, flags: .assureMemoryNow) + + // Safe allocation with graceful frame dropping on OOM + guard let blockBuffer = try? CMBlockBuffer(length: blockBufferLength, flags: .assureMemoryNow) else { + print("⚠️ Failed to allocate CMBlockBuffer (\(blockBufferLength) bytes) - dropping frame due to memory pressure") + return nil + } var contiguousBuffer: CMBlockBuffer! if !CMBlockBufferIsRangeContiguous(blockBuffer, atOffset: 0, length: 0) { @@ -898,6 +971,27 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { print("[MetalRenderer] 🛑 ForceStopRendering received. Pausing MTKView.") self.metalView.isPaused = true } + + // MARK: - Corner Masking + + /* + private func applyRoundedCornerMask(to view: MTKView) { + let maskLayer = CAShapeLayer() + let rect = view.bounds + let cornerRadius: CGFloat = 16 + let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).cgPath + maskLayer.path = path + view.layer.mask = maskLayer + } + + private func updateRoundedCornerMask() { + guard let maskLayer = metalView.layer.mask as? CAShapeLayer else { return } + let rect = metalView.bounds + let cornerRadius: CGFloat = 16 + let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).cgPath + maskLayer.path = path + } + */ } // MARK: - MTKViewDelegate @@ -905,6 +999,8 @@ class MetalVideoDecoderRenderer: NSObject, AnyVideoDecoderRenderer { extension MetalVideoDecoderRenderer: MTKViewDelegate { func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { print("MetalVideoDecoderRenderer: Drawable size changed to \(size.width) x \(size.height)") + + // updateRoundedCornerMask() } func draw(in view: MTKView) { @@ -954,8 +1050,13 @@ extension MetalVideoDecoderRenderer: MTKViewDelegate { isBiPlanar = (planeCount >= 2) && (cbcrFormat != .invalid) } - // 4. Setup Pipeline - let fragmentName = isBiPlanar ? "copyFragmentShaderHDR_EDR" : "copyFragmentShaderHEVC_EDR" + // 4. Setup Pipeline — HDR uses unified shader; SDR uses TestFlight-era legacy fragments. + let fragmentName: String = { + if hdrEnabled { + return isBiPlanar ? "copyFragmentShaderHDR_HDRUnified_UIKit" : "copyFragmentShaderHEVC_HDRUnified_UIKit" + } + return isBiPlanar ? "copyFragmentShaderHDR_EDR_UIKit" : "copyFragmentShaderHEVC_EDR_UIKit" + }() if isBiPlanar { if copyPipelineStateYUV == nil || lastCopyFragment != fragmentName { @@ -1020,65 +1121,121 @@ extension MetalVideoDecoderRenderer: MTKViewDelegate { return } - // 7. BUFFER 0: HDR Params (Detect from PixelBuffer with safe string comparison) - struct HDRParams { var presetIndex: UInt32; var isPQ: UInt32; var isBT2020Matrix: UInt32; var isBT2020Primaries: UInt32 } - - // Force PQ mode when HDR is enabled (AV1 streams often don't set transfer function tag) - // If user enabled HDR, assume PQ encoding regardless of metadata - var isPQ: UInt32 = hdrEnabled ? 1 : 0 - var isBT2020Primaries: UInt32 = 0 - var isBT2020Matrix: UInt32 = 0 - - // Still check attachments for color space, with HDR fallback - if let primAttachment = CVBufferCopyAttachment(pb, kCVImageBufferColorPrimariesKey, nil), - let primVal = primAttachment as? String { - if primVal == "ITU_R_2020" { isBT2020Primaries = 1 } - else if primVal == "ITU_R_709_2" { isBT2020Primaries = 0 } + // 7. BUFFER 0: ShaderHDRParams — must match Metal struct exactly + var isPQ = false + if let tfVal = CVBufferCopyAttachment(pb, kCVImageBufferTransferFunctionKey, nil) as? String { + isPQ = (tfVal == "SMPTE_ST_2084_PQ") + } + if !isPQ, let fd = formatDesc, + let tfAny = CMFormatDescriptionGetExtension(fd, extensionKey: kCMFormatDescriptionExtension_TransferFunction) { + if let s = tfAny as? String { + isPQ = (s == "SMPTE_ST_2084_PQ") + } else if CFGetTypeID(tfAny) == CFStringGetTypeID() { + isPQ = CFEqual(tfAny as! CFString, kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ) + } + } + + var primariesFromAttachment = false + var primariesType: UInt32 = 0 // 0=709, 1=2020, 2=SMPTE-C + if let primVal = CVBufferCopyAttachment(pb, kCVImageBufferColorPrimariesKey, nil) as? String { + primariesFromAttachment = true + if primVal == "ITU_R_2020" { primariesType = 1 } + else if primVal == "SMPTE_C" { primariesType = 2 } } else { - // Fallback: If HDR is on, assume Rec.2020 - isBT2020Primaries = hdrEnabled ? 1 : 0 + primariesType = (hdrEnabled && uikitPixelFormatIs10Bit(pixelFormat) && isPQ) ? 1 : 0 } - - if let mtxAttachment = CVBufferCopyAttachment(pb, kCVImageBufferYCbCrMatrixKey, nil), - let mtxVal = mtxAttachment as? String { - if mtxVal == "ITU_R_2020" { isBT2020Matrix = 1 } - else if mtxVal == "ITU_R_709_2" { isBT2020Matrix = 0 } + + var matrixFromAttachment = false + var matrixType: UInt32 = 0 // 0=709, 1=2020, 2=601 + if let mtxVal = CVBufferCopyAttachment(pb, kCVImageBufferYCbCrMatrixKey, nil) as? String { + matrixFromAttachment = true + if mtxVal == "ITU_R_2020" { matrixType = 1 } + else if mtxVal == "ITU_R_601_4" { matrixType = 2 } } else { - // Fallback: If HDR is on, assume Rec.2020 - isBT2020Matrix = hdrEnabled ? 1 : 0 + matrixType = (hdrEnabled && uikitPixelFormatIs10Bit(pixelFormat) && isPQ) ? 1 : 0 } - - // Always use presetIndex=0 for HDR (full PQ pipeline) - let presetIndex: UInt32 = hdrEnabled ? 0 : 1 - - var hdrParams = HDRParams(presetIndex: presetIndex, isPQ: isPQ, isBT2020Matrix: isBT2020Matrix, isBT2020Primaries: isBT2020Primaries) - - // Debug logging for HDR detection - logCounter += 1 - if logCounter % 120 == 0 { // Log every 2 seconds at 60fps - print("MetalVideoDecoderRenderer: HDR Debug - hdrEnabled=\(hdrEnabled), isPQ=\(isPQ), isBT2020Matrix=\(isBT2020Matrix), isBT2020Primaries=\(isBT2020Primaries), presetIndex=\(presetIndex)") + + if isPQ && hdrEnabled && !matrixFromAttachment && !primariesFromAttachment { + isPQ = false + matrixType = 0 + primariesType = 0 } - - renderEncoder.setFragmentBytes(&hdrParams, length: MemoryLayout.size, index: 0) - - // 8. BUFFER 2: Color Enhancements (CRITICAL FIX - prevent black screen) - struct ColorEnhancementUniforms { var saturation: Float; var contrast: Float; var padding1: Float; var padding2: Float } - - // Always use the properties, whether HDR or SDR - var sat = self.hdrSaturation - var con = self.hdrContrast - - // Safety clamps (prevent invalid values) - if sat < 0.1 { sat = 1.0 } - if con < 0.1 { con = 1.0 } - - // Update debug logging - if logCounter % 120 == 0 { // Log every 2 seconds at 60fps - print("MetalVideoDecoderRenderer: Applying sat=\(sat), con=\(con) to shader") + if isPQ && primariesFromAttachment && matrixFromAttachment && primariesType == 0 && matrixType == 0 { + isPQ = false } - - var enh = ColorEnhancementUniforms(saturation: sat, contrast: con, padding1: 0, padding2: 0) - renderEncoder.setFragmentBytes(&enh, length: MemoryLayout.size, index: 2) + + let is10BitBool: Bool = uikitPixelFormatIs10Bit(pixelFormat) + let isFullRangeBool: Bool = uikitPixelFormatIsFullRange(pixelFormat) + + let edrHeadroom: Float = { + #if os(visionOS) + return 2.0 + #else + let raw = UIScreen.main.currentEDRHeadroom + return Float(raw > 1.0 ? raw : UIScreen.main.potentialEDRHeadroom) + #endif + }() + + let referenceHDR = UserDefaults.standard.bool(forKey: "hdrReferenceMode") + + if hdrEnabled { + let (yuvMatrix, yuvOffset) = buildYUVMatrix(matrixType: matrixType, isFullRange: isFullRangeBool, is10Bit: is10BitBool) + let extendedScene: UInt32 = (hdrEnabled && !isPQ) ? 1 : 0 + var frameParams = MetalCopyShaderHDRParams( + isPQ: isPQ ? 1 : 0, + primariesType: primariesType, + extendedScene: extendedScene, + reserved0: 0, + hdrEdrHeadroom: edrHeadroom, + pad: 0, + alignPad: .zero, + maxContentNits: Float(hdrMetadata.maxContentLightLevel), + maxFrameAvgNits: Float(hdrMetadata.maxFrameAverageLightLevel), + padHdrMeta: .zero, + yuvMatrix: yuvMatrix, + yuvOffset: yuvOffset + ) + renderEncoder.setFragmentBytes(&frameParams, length: MemoryLayout.size, index: 0) + + var fullParams = MetalCopyFullHDRParams( + boost: hdrBrightness, + contrast: hdrContrast, + saturation: hdrSaturation, + brightness: 0.0, + pqExposure: hdrPqExposure, + mode: 0, + hdrGradeFlags: referenceHDR ? 1 : 0 + ) + renderEncoder.setFragmentBytes(&fullParams, length: MemoryLayout.size, index: 1) + } else { + var legacyFrame = MetalCopyLegacySDRFrameParams( + presetIndex: 0, + isPQ: isPQ ? 1 : 0, + isBT2020Matrix: matrixType == 1 ? 1 : 0, + isBT2020Primaries: primariesType == 1 ? 1 : 0 + ) + renderEncoder.setFragmentBytes(&legacyFrame, length: MemoryLayout.size, index: 0) + + var legacyFull = MetalCopyLegacySDRFullParams( + boost: 1.0, + contrast: 1.0, + saturation: 1.0, + brightness: 0.0, + mode: 0 + ) + renderEncoder.setFragmentBytes(&legacyFull, length: MemoryLayout.size, index: 1) + } + + logCounter += 1 + if logCounter % 120 == 0 { + print("MetalVideoDecoderRenderer: isPQ=\(isPQ), matrix=\(matrixType), primaries=\(primariesType), hdr=\(hdrEnabled), edrHeadroom=\(edrHeadroom)") + } + + // BUFFER 2: ColorEnhancementUniforms — hdrSaturation / hdrContrast from properties + let sat = hdrEnabled ? (referenceHDR ? 1.0 : max(hdrSaturation, 0.1)) : 1.0 + let con = hdrEnabled ? (referenceHDR ? 1.0 : max(hdrContrast, 0.1)) : 1.0 + var enh = MetalCopyColorEnhancementUniforms(saturation: sat, contrast: con, warmth: 0.0, padding1: 0) + renderEncoder.setFragmentBytes(&enh, length: MemoryLayout.size, index: 2) // 9. Draw renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) @@ -1087,9 +1244,42 @@ extension MetalVideoDecoderRenderer: MTKViewDelegate { commandBuffer.present(drawable) commandBuffer.commit() } + + // MARK: - Pixel Format Helpers + + private func uikitPixelFormatIs10Bit(_ pf: OSType) -> Bool { + switch pf { + case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, + kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarVideoRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarFullRange: + return true + default: + return false + } + } + + private func uikitPixelFormatIsFullRange(_ pf: OSType) -> Bool { + switch pf { + case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr8BiPlanarFullRange, + kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, + kCVPixelFormatType_420YpCbCr10PackedBiPlanarFullRange: + return true + default: + return false + } + } } // MARK: - Constants private let NALU_START_PREFIX_SIZE: Int = 3 -private let NAL_LENGTH_PREFIX_SIZE: Int = 4 +private let NAL_LENGTH_PREFIX_SIZE: Int = 4 \ No newline at end of file diff --git a/Moonlight Vision/Moonlight Vision.entitlements b/Moonlight Vision/Moonlight Vision.entitlements index 458beb803..53f614114 100644 --- a/Moonlight Vision/Moonlight Vision.entitlements +++ b/Moonlight Vision/Moonlight Vision.entitlements @@ -4,5 +4,7 @@ com.apple.developer.low-latency-streaming + com.apple.developer.group-session + \ No newline at end of file diff --git a/Moonlight Vision/MoonlightCoopActivity.swift b/Moonlight Vision/MoonlightCoopActivity.swift new file mode 100644 index 000000000..fddceef87 --- /dev/null +++ b/Moonlight Vision/MoonlightCoopActivity.swift @@ -0,0 +1,79 @@ +// +// MoonlightCoopActivity.swift +// Neo Moonlight +// +// Created by NeoVectorX 2026 +// +// + +import Foundation +import GroupActivities + +struct MoonlightCoopActivity: GroupActivity { + // PC Connection Info + let hostPCAddress: String + let hostPCName: String + let hostPCPort: UInt16 + let isInternetAccessible: Bool // Whether host has external IP + let connectionMode: String // "Local" or "Online" + + // App Info + let appID: String + let appName: String + + // Session Info + let sessionID: String + let hostFrameRate: Int32 // Frame rate must match between players + + // Pairing Data (for auto-pairing guest) + let pairingData: Data + + // GroupActivity Protocol Requirements + var metadata: GroupActivityMetadata { + var metadata = GroupActivityMetadata() + metadata.title = "Moonlight: \(appName)" + metadata.subtitle = "Co-op on \(hostPCName)" + metadata.type = .generic + + // Optional: Add fallback URL for invitations + if let url = URL(string: "moonlight://coop/\(sessionID)") { + metadata.fallbackURL = url + } + + return metadata + } +} + +// Make it Codable for SharePlay transmission +extension MoonlightCoopActivity: Codable { + enum CodingKeys: String, CodingKey { + case hostPCAddress + case hostPCName + case hostPCPort + case isInternetAccessible + case connectionMode + case appID + case appName + case sessionID + case hostFrameRate + case pairingData + } +} + +// Equatable for comparing activities +extension MoonlightCoopActivity: Equatable { + static func == (lhs: MoonlightCoopActivity, rhs: MoonlightCoopActivity) -> Bool { + return lhs.sessionID == rhs.sessionID && + lhs.hostPCAddress == rhs.hostPCAddress && + lhs.appID == rhs.appID + } +} + +// Hashable for using in collections +extension MoonlightCoopActivity: Hashable { + func hash(into hasher: inout Hasher) { + hasher.combine(sessionID) + hasher.combine(hostPCAddress) + hasher.combine(appID) + } +} diff --git a/Moonlight Vision/MoonlightVisionApp.swift b/Moonlight Vision/MoonlightVisionApp.swift index 061bfcb5f..cb204a0fb 100644 --- a/Moonlight Vision/MoonlightVisionApp.swift +++ b/Moonlight Vision/MoonlightVisionApp.swift @@ -74,11 +74,12 @@ struct MoonlightVisionApp: SwiftUI.App { streamConfig: streamConfig, needsHdr: appDelegate.mainViewModel.streamSettings.enableHdr ) + // CRITICAL: Same as flatDisplayWindow — force fresh view on each session + .id(streamConfig.wrappedValue?.sessionUUID ?? "none") .environmentObject(appDelegate.mainViewModel) .environment(\.isEmbeddedInCurved, true) .onDisappear { // Do not mutate streamConfig during swap teardown; coordinator handles lifecycle. - // Previously cleared streamConfig.wrappedValue here, which could race with swap. } .onChange(of: appDelegate.mainViewModel.isSwappingRenderers) { isSwapping in if isSwapping { return } @@ -86,12 +87,22 @@ struct MoonlightVisionApp: SwiftUI.App { } } .immersionStyle(selection: .constant(.mixed), in: .mixed, .full) - .immersiveContentBrightness(.automatic) .upperLimbVisibility(.automatic) .immersiveEnvironmentBehavior(.coexist) + .restorationBehavior(.disabled) - WindowGroup(id: "realitykitStreamingWindow", for: StreamConfiguration.self) { streamConfig in - RealityKitStreamView(streamConfig: streamConfig, needsHdr: appDelegate.mainViewModel.streamSettings.enableHdr) + // Flat Display - RealityKit in WindowGroup + WindowGroup(id: "flatDisplayWindow", for: StreamConfiguration.self) { streamConfig in + FlatDisplayStreamView( + streamConfig: streamConfig, + needsHdr: appDelegate.mainViewModel.streamSettings.enableHdr + ) + // CRITICAL: Force SwiftUI to destroy the old view and create a fresh one + // whenever a new stream session starts. Without this, SwiftUI may reuse + // the previous FlatDisplayStreamView instance with stale @State variables + // (hasPerformedTeardown=true, windowDecommissioned=true, streamMan=old ref) + // which causes a crash/black screen on co-op rejoin. + .id(streamConfig.wrappedValue?.sessionUUID ?? "none") .environmentObject(appDelegate.mainViewModel) .onDisappear { // Do not clear streamConfig here; lifecycle managed centrally to avoid races. @@ -101,25 +112,15 @@ struct MoonlightVisionApp: SwiftUI.App { AudioHelpers.fixAudioForSurroundForCurrentWindow() } } - .windowStyle(.volumetric) - .defaultSize(width: 2, height: 2, depth: 2, in: .meters) - - WindowGroup(id: "realitykitClassic3DWindow", for: StreamConfiguration.self) { streamConfig in - RealityKitClassic3DView(streamConfig: streamConfig, needsHdr: appDelegate.mainViewModel.streamSettings.enableHdr) - .environmentObject(appDelegate.mainViewModel) - .onDisappear { - // Do not clear streamConfig here; lifecycle managed centrally to avoid races. - } - .onChange(of: appDelegate.mainViewModel.isSwappingRenderers) { isSwapping in - if isSwapping { return } - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } - } - .windowStyle(.volumetric) - .defaultSize(width: 2, height: 2, depth: 2, in: .meters) + .windowStyle(.plain) + .windowResizability(.contentSize) + .restorationBehavior(.disabled) + .handlesExternalEvents(matching: ["flatDisplayWindow"]) - WindowGroup(id: "hdrTestWindow", for: StreamConfiguration.self) { streamConfig in - HDRTestStreamView(streamConfig: streamConfig) + // Classic Display - UIKit-based streaming (for keyboard+mouse compatibility) + WindowGroup(id: "classicStreamingWindow", for: StreamConfiguration.self) { $streamConfig in + UIKitStreamView(streamConfig: $streamConfig) + .id(streamConfig?.sessionUUID ?? "none") .environmentObject(appDelegate.mainViewModel) .onDisappear { // Do not clear streamConfig here; lifecycle managed centrally to avoid races. @@ -130,27 +131,28 @@ struct MoonlightVisionApp: SwiftUI.App { } } .windowStyle(.plain) - .defaultSize(width: 1920, height: 1080) .windowResizability(.contentSize) - - WindowGroup(id: "classicStreamingWindow", for: StreamConfiguration.self) { streamConfig in - UIKitStreamView(streamConfig: streamConfig) - .environmentObject(appDelegate.mainViewModel) - .onDisappear { - // Do not clear streamConfig here; lifecycle managed centrally to avoid races. - } - .onChange(of: appDelegate.mainViewModel.isSwappingRenderers) { isSwapping in - if isSwapping { return } - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } + .restorationBehavior(.disabled) + .handlesExternalEvents(matching: ["classicStreamingWindow"]) + + // Kickstarter Window - Forces visionOS to recalculate Shared Space visibility + // This enables external apps (Spotify, Discord, etc.) to appear in Curved Display mode + WindowGroup(id: "Kickstarter") { + Color.clear + .frame(width: 1, height: 1) + .opacity(0.001) // Invisible but rendered + .allowsHitTesting(false) // Let clicks pass through } .windowStyle(.plain) - .windowResizability(.contentSize) + .defaultSize(width: 0.1, height: 0.1, depth: 0.0, in: .meters) } } private struct MainRootView: View { @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + @Environment(\.openImmersiveSpace) private var openImmersiveSpace + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow @EnvironmentObject private var vm: MainViewModel let content: () -> Content @@ -160,17 +162,41 @@ private struct MainRootView: View { var body: some View { content() - .onAppear { - if vm.streamSettings.renderer != .curvedDisplay { - Task { await dismissImmersiveSpace() } - } - } - .onChange(of: vm.activelyStreaming) { active in - if !active, vm.streamSettings.renderer != .curvedDisplay { - Task { await dismissImmersiveSpace() } - } + .onChange(of: vm.shouldRelaunchStream) { shouldRelaunch in + guard shouldRelaunch else { return } + vm.shouldRelaunchStream = false + Task { await relaunchStream() } } } + + @MainActor + private func relaunchStream() async { + let renderer = vm.streamSettings.renderer + + guard let config = vm.currentStreamConfig.copy() as? StreamConfiguration else { + print("[Relaunch] Failed to copy stream config") + return + } + + let newToken = UUID().uuidString + config.sessionUUID = newToken + vm.activeSessionToken = newToken + vm.currentStreamConfig = config + vm.streamState = .starting + + print("[Relaunch] Re-opening \(renderer) with new session \(newToken)") + + if renderer == .curvedDisplay { + dismissWindow(id: "mainView") + try? await Task.sleep(for: .milliseconds(300)) + let result = try? await openImmersiveSpace(id: renderer.windowId, value: config) + print("[Relaunch] Immersive space result: \(String(describing: result))") + } else { + try? await Task.sleep(for: .milliseconds(150)) + openWindow(id: renderer.windowId, value: config) + print("[Relaunch] \(renderer.description) window opened") + } + } } @main diff --git a/Moonlight Vision/ObservableConnectionManager.swift b/Moonlight Vision/ObservableConnectionManager.swift index bbf362b3c..1705c99c8 100644 --- a/Moonlight Vision/ObservableConnectionManager.swift +++ b/Moonlight Vision/ObservableConnectionManager.swift @@ -20,6 +20,9 @@ import Combine @Published var videoShown: Bool = false @Published var showAlert = false + // Reference to ControllerSupport for rumble forwarding + weak var controllerSupport: ControllerSupport? + // Implement the protocol methods func connectionStarted() { print("Connection started") @@ -30,8 +33,13 @@ import Combine errorMessage = "Connection terminated with error code: \(errorCode)" showAlert = true - print("[RKCallbacks] Posting RKStreamDidTeardown from connectionTerminated") - NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + // Post a separate notification so the ViewModel can trigger shouldCloseStream + // for unexpected disconnects. We do NOT post RKStreamDidTeardown here because + // that would set streamState to .idle before LiStopConnection() finishes. + // The view's performCompleteTeardown will post RKStreamDidTeardown after + // LiStopConnection() fully completes via stopStreamWithCompletion. + print("[RKCallbacks] connectionTerminated - posting ConnectionLost for view cleanup") + NotificationCenter.default.post(name: Notification.Name("ConnectionLost"), object: nil) } func stageStarting(_ stageName: UnsafePointer!) { @@ -55,8 +63,8 @@ import Combine errorMessage = "Stage \(stageStr) failed with error \(errorCode)" showAlert = true - print("[RKCallbacks] Posting RKStreamDidTeardown from stageFailed") - NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + print("[RKCallbacks] Posting StreamStartFailed from stageFailed") + NotificationCenter.default.post(name: Notification.Name("StreamStartFailed"), object: nil) } } @@ -65,12 +73,15 @@ import Combine errorMessage = message showAlert = true - print("[RKCallbacks] Posting RKStreamDidTeardown from launchFailed") - NotificationCenter.default.post(name: Notification.Name("RKStreamDidTeardown"), object: nil) + print("[RKCallbacks] Posting StreamStartFailed from launchFailed") + NotificationCenter.default.post(name: Notification.Name("StreamStartFailed"), object: nil) } func rumble(_ controllerNumber: UInt16, lowFreqMotor: UInt16, highFreqMotor: UInt16) { print("Rumble controller \(controllerNumber), LowFreq: \(lowFreqMotor), HighFreq: \(highFreqMotor)") + + // Forward rumble to ControllerSupport which will handle haptics + controllerSupport?.rumble(controllerNumber, lowFreqMotor: lowFreqMotor, highFreqMotor: highFreqMotor) } func connectionStatusUpdate(_ status: Int32) { @@ -85,6 +96,9 @@ import Combine func rumbleTriggers(_ controllerNumber: UInt16, leftTrigger: UInt16, rightTrigger: UInt16) { print("Rumble triggers for controller \(controllerNumber): Left \(leftTrigger), Right \(rightTrigger)") + + // Forward trigger rumble to ControllerSupport + controllerSupport?.rumbleTriggers(controllerNumber, leftTrigger: leftTrigger, rightTrigger: rightTrigger) } func setMotionEventState(_ controllerNumber: UInt16, motionType: UInt8, reportRateHz: UInt16) { diff --git a/Moonlight Vision/ParticleManager.swift b/Moonlight Vision/ParticleManager.swift new file mode 100644 index 000000000..c73a0f4f4 --- /dev/null +++ b/Moonlight Vision/ParticleManager.swift @@ -0,0 +1,284 @@ +// +// ParticleManager.swift +// Neo Moonlight +// +// Created by NeoVectorX +// +// + +import SwiftUI +import RealityKit +import UIKit + +enum StarDistancePreset: Int, CaseIterable { + case close = 0 + case medium = 1 + case far = 2 + + var distances: (near: Float, mid: Float, distant: Float) { + switch self { + case .close: return (7.0, 11.0, 15.0) + case .medium: return (10.0, 15.0, 20.0) + case .far: return (14.0, 19.0, 25.0) + } + } + + var displayName: String { + switch self { + case .close: return "Close" + case .medium: return "Medium" + case .far: return "Far" + } + } + + func next() -> StarDistancePreset { + let allCases = Self.allCases + let currentIndex = allCases.firstIndex(of: self) ?? 0 + let nextIndex = (currentIndex + 1) % allCases.count + return allCases[nextIndex] + } +} + +@MainActor +class ParticleManager { + public let rootEntity = Entity() + private var distantStarsEmitter: Entity? + private var midStarsEmitter: Entity? + private var nearStarsEmitter: Entity? + + private var currentPreset: StarDistancePreset = .close + + // This absorbs the jitter caused by UI clicks/fades. + private var smoothedBrightness: Float = 0.0 + + init(preset: StarDistancePreset = .close) { + self.currentPreset = preset + setupEmitters() + } + + // NOTE: resetDelta removed - smoothing handles "waking up" naturally. + + // Call this from your AmbientLightEngine update block + func update(color: UIColor, brightness: Float) { + guard let distantEmitter = distantStarsEmitter, + let midEmitter = midStarsEmitter, + let nearEmitter = nearStarsEmitter else { return } + + + // This filters out high-frequency noise (UI glitches) but keeps low-frequency signal (Movie explosions). + let oldSmoothed = smoothedBrightness + + // 0.1 = Very smooth/dreamy. 0.3 = Snappy. 0.15 is the sweet spot for "Nebula". + let smoothingFactor: Float = 0.15 + smoothedBrightness += (brightness - smoothedBrightness) * smoothingFactor + + // 2. Calculate Delta from the SMOOTHED values + // This value will now be silky smooth, even if the UI stutters. + let delta = max(0, smoothedBrightness - oldSmoothed) + + // 3. Base Reactivity (Color) + var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 + color.getHue(&h, saturation: &s, brightness: &b, alpha: &a) + + // Keep saturation moderate so they look like stars, not LEDs + let particleColor = UIColor(hue: h, saturation: s, brightness: 1.0, alpha: 1.0) + + // 4. Update Physics + let baseSpeed: Float = 0.05 + + // Reaction multiplier needs to be higher now because 'smoothed' delta is smaller/gentler + let reactionMultiplier: Float = 4.0 + + let targetSpeed = baseSpeed + (delta * reactionMultiplier) + + // Birth Rate: + // Use the smoothed delta. If it's a tiny jitter (UI click), delta is ~0.001 -> No change. + // If it's a movie explosion, delta is ~0.05 -> Spawn extra stars. + let spawnBonus: Float = (delta > 0.005) ? (delta * 4000) : 0 + + // 5. Update DISTANT stars (far layer - 1.5cm) + var distantParticles = distantEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + + distantParticles.mainEmitter.color = .constant(.single(particleColor)) + distantParticles.mainEmitter.birthRate = 2000 + (spawnBonus * 0.5) // Half bonus for distant + distantParticles.speed = targetSpeed + + let distantPulseSize: Float = 0.015 + (delta * 0.05) + distantParticles.mainEmitter.size = distantPulseSize + + distantEmitter.components.set(distantParticles) + + // 6. Update MID stars (middle layer - 1.4cm) + var midParticles = midEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + + midParticles.mainEmitter.color = .constant(.single(particleColor)) + midParticles.mainEmitter.birthRate = 500 + (spawnBonus * 0.125) // Quarter bonus for mid + midParticles.speed = targetSpeed + + let midPulseSize: Float = 0.014 + (delta * 0.05) + midParticles.mainEmitter.size = midPulseSize + + midEmitter.components.set(midParticles) + + // 7. Update NEAR stars (close layer - 1.8cm) + var nearParticles = nearEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + + nearParticles.mainEmitter.color = .constant(.single(particleColor)) + nearParticles.mainEmitter.birthRate = 300 + (spawnBonus * 0.075) // Smaller bonus for near + nearParticles.speed = targetSpeed + + let nearPulseSize: Float = 0.018 + (delta * 0.05) + nearParticles.mainEmitter.size = nearPulseSize + + nearEmitter.components.set(nearParticles) + } + + func setEnabled(_ enabled: Bool) { + rootEntity.isEnabled = enabled + // No need to reset math; the lerp will catch up smoothly automatically. + } + + func updateDistancePreset(_ preset: StarDistancePreset) { + currentPreset = preset + + // Update existing emitters with new distances + guard let distantEmitter = distantStarsEmitter, + let midEmitter = midStarsEmitter, + let nearEmitter = nearStarsEmitter else { return } + + let distances = preset.distances + + // Update distant layer + var distantParticles = distantEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + distantParticles.emitterShapeSize = [distances.distant, distances.distant, distances.distant] + distantEmitter.components.set(distantParticles) + + // Update mid layer + var midParticles = midEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + midParticles.emitterShapeSize = [distances.mid, distances.mid, distances.mid] + midEmitter.components.set(midParticles) + + // Update near layer + var nearParticles = nearEmitter.components[ParticleEmitterComponent.self] ?? ParticleEmitterComponent() + nearParticles.emitterShapeSize = [distances.near, distances.near, distances.near] + nearEmitter.components.set(nearParticles) + } + + private func setupEmitters() { + // GENERATE TEXTURE: A sharp, glowing dot + guard let texture = generateStarTexture() else { return } + + let distances = currentPreset.distances + + // LAYER 1: DISTANT STARS (dense, smallest) + let distantEntity = Entity() + var distantParticles = ParticleEmitterComponent() + + distantParticles.emitterShape = .sphere + distantParticles.emitterShapeSize = [distances.distant, distances.distant, distances.distant] // Far layer + + distantParticles.mainEmitter.birthRate = 2000 // Dense starfield + distantParticles.mainEmitter.size = 0.015 // 1.5 cm + distantParticles.mainEmitter.lifeSpan = 15.0 + distantParticles.mainEmitter.sizeVariation = 0.005 + + distantParticles.mainEmitter.acceleration = [0, 0, 0] + distantParticles.mainEmitter.dampingFactor = 5.0 + distantParticles.mainEmitter.spreadingAngle = 0.0 + + distantParticles.mainEmitter.image = texture + distantParticles.mainEmitter.blendMode = .additive + + distantParticles.mainEmitter.color = .evolving( + start: .single(UIColor(red: 0.5, green: 0.3, blue: 0.8, alpha: 0.1)), + end: .single(.white.withAlphaComponent(0)) + ) + + distantEntity.components.set(distantParticles) + distantEntity.position = SIMD3(0, 1.5, 0) + + distantStarsEmitter = distantEntity + rootEntity.addChild(distantEntity) + + // LAYER 2: MID STARS (medium density, medium size) + let midEntity = Entity() + var midParticles = ParticleEmitterComponent() + + midParticles.emitterShape = .sphere + midParticles.emitterShapeSize = [distances.mid, distances.mid, distances.mid] // Middle layer + + midParticles.mainEmitter.birthRate = 500 // Medium density + midParticles.mainEmitter.size = 0.014 // 1.4 cm + midParticles.mainEmitter.lifeSpan = 15.0 + midParticles.mainEmitter.sizeVariation = 0.006 + + midParticles.mainEmitter.acceleration = [0, 0, 0] + midParticles.mainEmitter.dampingFactor = 5.0 + midParticles.mainEmitter.spreadingAngle = 0.0 + + midParticles.mainEmitter.image = texture + midParticles.mainEmitter.blendMode = .additive + + midParticles.mainEmitter.color = .evolving( + start: .single(UIColor(red: 0.5, green: 0.3, blue: 0.8, alpha: 0.1)), + end: .single(.white.withAlphaComponent(0)) + ) + + midEntity.components.set(midParticles) + midEntity.position = SIMD3(0, 1.5, 0) + + midStarsEmitter = midEntity + rootEntity.addChild(midEntity) + + // LAYER 3: NEAR STARS (sparse, largest) + let nearEntity = Entity() + var nearParticles = ParticleEmitterComponent() + + nearParticles.emitterShape = .sphere + nearParticles.emitterShapeSize = [distances.near, distances.near, distances.near] // Closest layer for parallax + + nearParticles.mainEmitter.birthRate = 300 // Sparse (creates depth) + nearParticles.mainEmitter.size = 0.018 // 1.8 cm (largest) + nearParticles.mainEmitter.lifeSpan = 15.0 + nearParticles.mainEmitter.sizeVariation = 0.007 + + nearParticles.mainEmitter.acceleration = [0, 0, 0] + nearParticles.mainEmitter.dampingFactor = 5.0 + nearParticles.mainEmitter.spreadingAngle = 0.0 + + nearParticles.mainEmitter.image = texture + nearParticles.mainEmitter.blendMode = .additive + + nearParticles.mainEmitter.color = .evolving( + start: .single(UIColor(red: 0.5, green: 0.3, blue: 0.8, alpha: 0.1)), + end: .single(.white.withAlphaComponent(0)) + ) + + nearEntity.components.set(nearParticles) + nearEntity.position = SIMD3(0, 1.5, 0) + + nearStarsEmitter = nearEntity + rootEntity.addChild(nearEntity) + } + + // Generates a sharper "Hot Core" glow texture for stars + private func generateStarTexture() -> TextureResource? { + let size = 128 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: size, height: size)) + let image = renderer.image { ctx in + let context = ctx.cgContext + // White center -> Transparent edge + let colors = [UIColor.white.cgColor, UIColor.white.withAlphaComponent(0).cgColor] as CFArray + + // Sharper falloff than smoke (starts fading at 0.2 instead of 0.0) + let locations: [CGFloat] = [0.1, 1.0] + + guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors, locations: locations) else { return } + + let center = CGPoint(x: size/2, y: size/2) + context.drawRadialGradient(gradient, startCenter: center, startRadius: 0, endCenter: center, endRadius: CGFloat(size/2), options: .drawsAfterEndLocation) + } + + return try? TextureResource.generate(from: image.cgImage!, options: .init(semantic: .color)) + } +} diff --git a/Moonlight Vision/Reactive1ChromosphereReach.swift b/Moonlight Vision/Reactive1ChromosphereReach.swift new file mode 100644 index 000000000..7037084a9 --- /dev/null +++ b/Moonlight Vision/Reactive1ChromosphereReach.swift @@ -0,0 +1,55 @@ +// +// Reactive1ChromosphereReach.swift +// Neo Moonlight +// +// Four chromosphere halo radii for Reactive 1 (dim level 2); each tap on the picker preset cycles tier. +// + +import Foundation + +enum Reactive1ChromosphereReach { + /// Stored index 0...(scales.count-1) + static let userDefaultsKey = "ambient.reactive1.reach.variant" + + /// Isotropic halo scale (`DrawableVideoDecoder.chromaHaloScale` / Chromosphere mesh). Index 0 matches historical default `1.55`. + /// If `haloScales.last` changes, update `Shaders.metal` `kChromaHaloScaleSpan` to `(last − 1.55)` so reach-tier blur ramps correctly. + static let haloScales: [Float] = [1.55, 2.08, 2.72, 3.48] + + static var tierCount: Int { haloScales.count } + + static func haloScale(forIndex index: Int) -> Float { + let i = (0.. Int { + let raw = UserDefaults.standard.integer(forKey: userDefaultsKey) + guard raw >= 0, raw < haloScales.count else { return 0 } + return raw + } + + static func saveIndex(_ index: Int) { + UserDefaults.standard.set((0.. String { + switch (0.. { + func clamp(_ value: Int) -> Int { + Swift.min(upperBound - 1, Swift.max(lowerBound, value)) + } +} diff --git a/Moonlight Vision/RealityKitInputSupport.swift b/Moonlight Vision/RealityKitInputSupport.swift index 2e984b664..dc7b8c706 100644 --- a/Moonlight Vision/RealityKitInputSupport.swift +++ b/Moonlight Vision/RealityKitInputSupport.swift @@ -160,19 +160,14 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, private var lastScrollTranslation: CGPoint = .zero private let wheelDelta: CGFloat = 120.0 - // Multi-click/drag gesture state (retuned for responsiveness) + // Click/drag gesture state private var selectPressStart: TimeInterval? - private var leftDownSent = false - private var dragTimer: Timer? - private var pendingLeftClickTimer: Timer? - private var clickQueue: [TimeInterval] = [] + private var leftDownSent = false // True when we've sent mouse-down for drag - // Tighter timings for snappier feel - private let clickMaxDuration: TimeInterval = 0.18 - private let dragHoldThreshold: TimeInterval = 0.12 - private let multiClickWindow: TimeInterval = 0.20 + // Timing: if held longer than this WITHOUT moving, it's a right-click + private let rightClickHoldThreshold: TimeInterval = 0.35 - // Movement-based early drag trigger + // Movement-based drag trigger private var lastOverlayPoint: CGPoint = .zero private var pressStartOverlayPoint: CGPoint? private let movementToDragThreshold: CGFloat = 6.0 @@ -199,7 +194,8 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, return result } - // Map visionOS pinch (.select press) to mouse down/up for click/drag + multi-click promotion + // Map visionOS pinch (.select press) to mouse down/up for click/drag + // New behavior: quick pinch = left click, hold still = right click, hold + move = drag override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { var handled = false @@ -210,16 +206,6 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, // Record where the press began (overlay coords) for movement-based drag pressStartOverlayPoint = lastOverlayPoint - - // Schedule time-based drag fallback - dragTimer?.invalidate() - dragTimer = Timer.scheduledTimer(withTimeInterval: dragHoldThreshold, repeats: false) { [weak self] _ in - guard let self = self else { return } - if self.selectPressStart != nil && !self.leftDownSent { - self.sendMouseButton(action: BUTTON_ACTION_PRESS, button: BUTTON_LEFT) - self.leftDownSent = true - } - } } // Existing keyboard mapping @@ -238,28 +224,23 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, if presses.contains(where: { $0.type == .select }) { handled = true let now = CACurrentMediaTime() - dragTimer?.invalidate() - dragTimer = nil + let duration = now - (selectPressStart ?? now) if leftDownSent { - // End of drag + // We were dragging - end the drag sendMouseButton(action: BUTTON_ACTION_RELEASE, button: BUTTON_LEFT) leftDownSent = false - selectPressStart = nil - pressStartOverlayPoint = nil + } else if duration >= rightClickHoldThreshold { + // Held long enough WITHOUT moving = RIGHT CLICK + sendRightClick() } else { - // Quick pinch -> candidate click - let started = selectPressStart ?? now - let duration = now - started - selectPressStart = nil - pressStartOverlayPoint = nil - - if duration <= clickMaxDuration { - enqueueClickAndMaybePromote(now: now) - } else { - scheduleOrSendSingleLeftClick(now: now) - } + // Quick release = LEFT CLICK (immediate, no delay) + // PC naturally handles double-click if user pinches twice fast + sendLeftClick() } + + selectPressStart = nil + pressStartOverlayPoint = nil } // Existing keyboard mapping @@ -272,36 +253,6 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, if !handled { super.pressesEnded(presses, with: event) } } - // Click promotion logic (double = right, triple = middle) - private func enqueueClickAndMaybePromote(now: TimeInterval) { - pendingLeftClickTimer?.invalidate() - pendingLeftClickTimer = nil - - clickQueue.append(now) - clickQueue = clickQueue.filter { now - $0 <= multiClickWindow } - - if clickQueue.count >= 3 { - sendMiddleClick() - clickQueue.removeAll() - } else if clickQueue.count == 2 { - sendRightClick() - clickQueue.removeAll() - } else { - scheduleOrSendSingleLeftClick(now: now) - } - } - - private func scheduleOrSendSingleLeftClick(now: TimeInterval) { - pendingLeftClickTimer?.invalidate() - pendingLeftClickTimer = Timer.scheduledTimer(withTimeInterval: multiClickWindow, repeats: false) { [weak self] _ in - guard let self = self else { return } - if self.clickQueue.count == 1 { - self.sendLeftClick() - } - self.clickQueue.removeAll() - } - } - private func sendLeftClick() { DispatchQueue.global(qos: .userInteractive).async { self.sendMouseButton(action: BUTTON_ACTION_PRESS, button: BUTTON_LEFT) @@ -318,23 +269,9 @@ class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, } } - private func sendMiddleClick() { - let BUTTON_MIDDLE: Int32 = 3 - DispatchQueue.global(qos: .userInteractive).async { - self.sendMouseButton(action: BUTTON_ACTION_PRESS, button: BUTTON_MIDDLE) - usleep(25_000) - self.sendMouseButton(action: BUTTON_ACTION_RELEASE, button: BUTTON_MIDDLE) - } - } - - // Optional: Clean up timers + // Clean up state override func removeFromSuperview() { super.removeFromSuperview() - dragTimer?.invalidate() - dragTimer = nil - pendingLeftClickTimer?.invalidate() - pendingLeftClickTimer = nil - clickQueue.removeAll() selectPressStart = nil pressStartOverlayPoint = nil } diff --git a/Moonlight Vision/RealityKitStreamView.swift b/Moonlight Vision/RealityKitStreamView.swift index 17af10692..6690623de 100644 --- a/Moonlight Vision/RealityKitStreamView.swift +++ b/Moonlight Vision/RealityKitStreamView.swift @@ -147,13 +147,140 @@ struct _RealityKitClassic3DView: View { private func rkPresetName(_ v: Int32) -> String { switch v { - case 0: return "Default" - case 1: return "Cinematic" - case 2: return "Vivid" - case 3: return "Realistic" - default: return "Default" + case 0: return "FILTER: Default" + case 1: return "FILTER: Cinematic" + case 2: return "FILTER: Vi\u{200A}vid" // Hair space between I and V + case 3: return "FILTER: Realistic" + default: return "FILTER: Default" } } + + @ViewBuilder + private var statsOverlayView: some View { + if viewModel.streamSettings.statsOverlay && !statsOverlayText.isEmpty { + VStack { + HStack { + Text(statsOverlayText) + .font(.system(size: 14, design: .monospaced)) + .foregroundColor(.white) + .padding(12) + .background(.black.opacity(0.7)) + .cornerRadius(8) + Spacer() + } + Spacer() + } + .padding() + .allowsHitTesting(false) + } + } + + private var errorOrnamentContent: some View { + VStack(alignment: .center) { + Image(systemName: "exclamationmark.triangle") + Text("Stream error") + .font(.title) + Text(connectionCallbacks.errorMessage ?? "Unknown error") + Button("Close") { + shouldClose.toggle() + dismissWindow() + } + } + .padding() + .glassBackgroundEffect() + } + + private var controlsOrnamentContent: some View { + HStack(spacing: 24) { + Button { + if hideControls && !controlsHighlighted { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + hideTimer?.invalidate() + startHighlightTimer() + } + return + } + pushWindow(id: "mainView") + startHideTimer() + } label: { + Label("Home", systemImage: "house.fill") + } + .labelStyle(.iconOnly) + + Button { + if hideControls && !controlsHighlighted { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + hideTimer?.invalidate() + startHighlightTimer() + } + return + } + videoMode = videoMode == .standard2D ? .sideBySide3D : .standard2D + if videoMode == .sideBySide3D { + screen.model?.materials = [surfaceMaterial!] + } else { + screen.model?.materials = [UnlitMaterial(texture: texture)] + } + startHideTimer() + } label: { + Label(videoMode == .standard2D ? "Standard Display" : "3D", + systemImage: videoMode == .standard2D ? "rectangle" : "rectangle.split.2x1") + } + .labelStyle(.iconOnly) + + Button { + if hideControls && !controlsHighlighted { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + hideTimer?.invalidate() + startHighlightTimer() + } + return + } + spatialAudioMode.toggle() + if spatialAudioMode { + AudioHelpers.fixAudioForSurroundForCurrentWindow() + } else { + AudioHelpers.fixAudioForDirectStereo() + } + startHideTimer() + } label: { + Label(spatialAudioMode ? "Spatial" : "Direct", + systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") + } + .labelStyle(.iconOnly) + + Button { + if hideControls && !controlsHighlighted { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + hideTimer?.invalidate() + startHighlightTimer() + } + return + } + let all: [Int32] = [0, 1, 2, 3] + let cur = viewModel.streamSettings.uikitPreset + let next = all[(all.firstIndex(of: cur) ?? -1 + 1) % all.count] + viewModel.streamSettings.uikitPreset = next + LiRequestIdrFrame() + startHideTimer() + } label: { + Label("Preset: \(rkPresetName(viewModel.streamSettings.uikitPreset))", systemImage: "camera.filters") + } + .labelStyle(.iconOnly) + } + .opacity(hideControls ? 0.05 : (controlsHighlighted ? 1.0 : 0.5)) + .animation(.easeInOut(duration: 0.3), value: hideControls) + .allowsHitTesting(true) + .padding() + } var body: some View { GeometryReader3D { proxy in @@ -196,128 +323,12 @@ struct _RealityKitClassic3DView: View { .handlesGameControllerEvents(matching: .gamepad) } .persistentSystemOverlays(hideControls ? .hidden : .visible) - .overlay { - if viewModel.streamSettings.statsOverlay && !statsOverlayText.isEmpty { - VStack { - HStack { - Text(statsOverlayText) - .font(.system(size: 14, design: .monospaced)) - .foregroundColor(.white) - .padding(12) - .background(.black.opacity(0.7)) - .cornerRadius(8) - Spacer() - } - Spacer() - } - .padding() - .allowsHitTesting(false) - } - } - .ornament(visibility: connectionCallbacks.showAlert ? .visible : .hidden , attachmentAnchor: .scene(.bottomFront), contentAlignment: .bottom) { - VStack(alignment: .center) { - Image(systemName: "exclamationmark.triangle") - Text("Stream error") - .font(.title) - Text(connectionCallbacks.errorMessage ?? "Unknown error") - Button("Close") { - shouldClose.toggle() - dismissWindow() - } - } - .padding() - .glassBackgroundEffect() + .overlay { statsOverlayView } + .ornament(visibility: connectionCallbacks.showAlert ? .visible : .hidden, attachmentAnchor: .scene(.bottomFront), contentAlignment: .bottom) { + errorOrnamentContent } .ornament(attachmentAnchor: .scene(.top), contentAlignment: .center) { - HStack(spacing: 24) { - Button { - if hideControls && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideControls = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - pushWindow(id: "mainView") - startHideTimer() - } label: { - Label("Home", systemImage: "house.fill") - } - .labelStyle(.iconOnly) - - Button { - if hideControls && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideControls = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - videoMode = videoMode == .standard2D ? .sideBySide3D : .standard2D - if videoMode == .sideBySide3D { - screen.model?.materials = [surfaceMaterial!] - } else { - screen.model?.materials = [UnlitMaterial(texture: texture)] - } - startHideTimer() - } label: { - Label(videoMode == .standard2D ? "Standard Display" : "3D", - systemImage: videoMode == .standard2D ? "rectangle" : "rectangle.split.2x1") - } - .labelStyle(.iconOnly) - - Button { - if hideControls && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideControls = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - spatialAudioMode.toggle() - if spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } - startHideTimer() - } label: { - Label(spatialAudioMode ? "Spatial" : "Direct", - systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") - } - .labelStyle(.iconOnly) - - Button { - if hideControls && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideControls = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - let all: [Int32] = [0, 1, 2, 3] - let cur = viewModel.streamSettings.uikitPreset - let next = all[(all.firstIndex(of: cur) ?? -1 + 1) % all.count] - viewModel.streamSettings.uikitPreset = next - LiRequestIdrFrame() - startHideTimer() - } label: { - Label("Preset: \(rkPresetName(viewModel.streamSettings.uikitPreset))", systemImage: "camera.filters") - } - .labelStyle(.iconOnly) - } - .opacity(hideControls ? 0.05 : (controlsHighlighted ? 1.0 : 0.5)) - .animation(.easeInOut(duration: 0.3), value: hideControls) - .allowsHitTesting(true) - .padding() + controlsOrnamentContent } .onAppear { if !viewModel.activelyStreaming { @@ -347,24 +358,25 @@ struct _RealityKitClassic3DView: View { enhancementsProvider: { let p = self.viewModel.streamSettings.uikitPreset switch p { - case 0: return (1.0, 1.0) // Default - case 1: return (1.15, 1.0) // Cinematic - case 2: return (1.25, 1.0) // Vivid - case 3: return (0.90, 1.05) // Realistic - default: return (1.0, 1.0) + case 0: return (1.0, 1.0, 0.0) // Default — neutral + case 1: return (1.15, 1.0, 0.0) // Cinematic + case 2: return (1.25, 1.0, 0.0) // Vivid + case 3: return (0.90, 1.05, 0.0) // Realistic + default: return (1.0, 1.0, 0.0) } - } - ) { texture, correctedResultion in - DispatchQueue.main.async { - if let correctedResultion = correctedResultion { - streamConfig.width = Int32(correctedResultion.0) - streamConfig.height = Int32(correctedResultion.1) + }, + callbackToRender: { texture, _, correctedResultion in + DispatchQueue.main.async { + if let correctedResultion = correctedResultion { + streamConfig.width = Int32(correctedResultion.0) + streamConfig.height = Int32(correctedResultion.1) + } + self.texture.replace(withDrawables: texture) + self.controllerSupport!.connectionEstablished() + startHideTimer() } - self.texture.replace(withDrawables: texture) - self.controllerSupport!.connectionEstablished() - startHideTimer() } - } + ) }, connectionCallbacks: self.connectionCallbacks ) @@ -546,11 +558,11 @@ struct _RealityKitStreamView: View { private func rkPresetName(_ v: Int32) -> String { switch v { - case 0: return "Default" - case 1: return "Cinematic" - case 2: return "Vivid" - case 3: return "Realistic" - default: return "Default" + case 0: return "FILTER: Default" + case 1: return "FILTER: Cinematic" + case 2: return "FILTER: Vi\u{200A}vid" // Hair space between I and V + case 3: return "FILTER: Realistic" + default: return "FILTER: Default" } } diff --git a/Moonlight Vision/RemoteMicManager.swift b/Moonlight Vision/RemoteMicManager.swift new file mode 100644 index 000000000..8f0cecb18 --- /dev/null +++ b/Moonlight Vision/RemoteMicManager.swift @@ -0,0 +1,139 @@ +// +// RemoteMicManager.swift +// Neo Moonlight +// +// Created by NeoVectorX +// +// + +import SwiftUI +import Network +import Combine + +@MainActor +class RemoteMicManager: ObservableObject { + @Published var isMuted: Bool = false + @Published var isConnected: Bool = false + @Published var inputLevel: Float = 0.0 + + private let host: NWEndpoint.Host = "127.0.0.1" + private let port: NWEndpoint.Port = 5006 + + private var connection: NWConnection? + private var visualizerTimer: Timer? + private var connectionRefreshTimer: Timer? + + init() { + setupConnection() + startVisualizer() + startConnectionRefresh() + } + + // MARK: - Network + + private func setupConnection() { + connection = NWConnection(host: host, port: port, using: .udp) + + connection?.stateUpdateHandler = { [weak self] state in + Task { @MainActor in + switch state { + case .ready: + self?.isConnected = true + print("[RemoteMic] Connected to Mic Streamer on port 5006") + case .failed(let error): + self?.isConnected = false + print("[RemoteMic] Connection failed: \(error)") + // Auto-reconnect after 3 seconds + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + self?.setupConnection() + } + case .cancelled: + self?.isConnected = false + default: + break + } + } + } + + connection?.start(queue: .global(qos: .userInitiated)) + } + + private func sendCommand(_ command: String) { + guard let data = command.data(using: .utf8) else { return } + + connection?.send(content: data, completion: .contentProcessed { [weak self] error in + if let error = error { + print("[RemoteMic] Send error: \(error)") + Task { @MainActor in + self?.setupConnection() + } + } else { + print("[RemoteMic] Sent: \(command)") + } + }) + } + + private func sendCommandWithRetry(_ command: String) { + if connection?.state != .ready { + setupConnection() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in + self?.sendCommandWithRetry(command) + } + return + } + + sendCommand(command) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { [weak self] in + self?.sendCommand(command) + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { [weak self] in + self?.sendCommand(command) + } + } + + private func startConnectionRefresh() { + connectionRefreshTimer = Timer.scheduledTimer(withTimeInterval: 30.0, repeats: true) { [weak self] _ in + Task { @MainActor in + self?.refreshConnection() + } + } + } + + private func refreshConnection() { + connection?.cancel() + setupConnection() + } + + // MARK: - Actions + + func toggleMute() { + isMuted.toggle() + let command = isMuted ? "MUTE" : "UNMUTE" + sendCommandWithRetry(command) + } + + // MARK: - Visualizer + + private func startVisualizer() { + visualizerTimer = Timer.scheduledTimer(withTimeInterval: 0.08, repeats: true) { [weak self] _ in + guard let self = self else { return } + if !self.isMuted { + // Simulate audio input levels + self.inputLevel = Float.random(in: 0.15...0.85) + } else { + self.inputLevel = 0.0 + } + } + } + + // MARK: - Cleanup + + func cleanup() { + visualizerTimer?.invalidate() + visualizerTimer = nil + connectionRefreshTimer?.invalidate() + connectionRefreshTimer = nil + connection?.cancel() + connection = nil + } +} diff --git a/Moonlight Vision/SettingsView.swift b/Moonlight Vision/SettingsView.swift index 46b510b9d..242ef5181 100644 --- a/Moonlight Vision/SettingsView.swift +++ b/Moonlight Vision/SettingsView.swift @@ -10,8 +10,82 @@ import SwiftUI struct SettingsView: View { @Binding public var settings: TemporarySettings + @AppStorage("classic.absoluteTouchMode") private var classicAbsoluteTouchMode: Bool = false + @AppStorage("settings.customBitrateMbps") private var savedCustomBitrateMbps: Int = 0 @State private var selectedAspectRatio: AspectRatio? @State private var isCustomAspectRatio: Bool = false + @State private var isCustomResolution: Bool = false + @State private var isCustomBitrate: Bool = false + @State private var customWidth: String = "" + @State private var customHeight: String = "" + @State private var customBitrateString: String = "" + /// Inline editor after picking Custom; dismisses when the user taps Confirm. + @State private var showCustomBitrateEntryRow: Bool = false + + private static func isPresetBitrate(_ bitrate: Int32) -> Bool { + bitrateTable.contains(bitrate) + } + + private func syncCustomBitrateUIFromSettings() { + if Self.isPresetBitrate(settings.bitrate) { + isCustomBitrate = false + showCustomBitrateEntryRow = false + return + } + isCustomBitrate = true + showCustomBitrateEntryRow = false + let mbps = max(1, Int(settings.bitrate / 1000)) + customBitrateString = "\(mbps)" + savedCustomBitrateMbps = mbps + } + + private var customBitrateMbpsDraft: Int? { + let digits = customBitrateString.filter { $0.isNumber } + guard let m = Int(digits), m > 0 else { return nil } + return m + } + + /// Digits-only while typing; bitrate applies when the user taps Confirm. + private func sanitizeCustomBitrateDraft() { + let filtered = customBitrateString.filter { $0.isNumber } + if filtered != customBitrateString { + customBitrateString = filtered + } + } + + private func confirmCustomBitrateEntry() { + guard let mbps = customBitrateMbpsDraft else { return } + savedCustomBitrateMbps = mbps + settings.bitrate = Int32(mbps) * 1000 + showCustomBitrateEntryRow = false + } + + /// Single-line capsule title so the bitrate row stays the same height as other menu pickers. + private var bitrateMenuCapsuleTitle: String { + if isCustomBitrate { + let n = max(1, Int(settings.bitrate / 1000)) + return "Custom (\(n) Mbps)".replacingOccurrences(of: " ", with: "\u{00A0}") + } + return "\(settings.bitrate / 1000) Mbps" + } + + private var resolutionSelection: Binding { + Binding( + get: { + isCustomResolution ? Resolution(width: -1, height: -1) : settings.resolution + }, + set: { newValue in + if newValue.width == -1 && newValue.height == -1 { + isCustomResolution = true + customWidth = String(settings.resolution.width) + customHeight = String(settings.resolution.height) + } else { + isCustomResolution = false + settings.resolution = newValue + } + } + ) + } var body: some View { ScrollView { @@ -30,10 +104,14 @@ struct SettingsView: View { Text("Resolution") .foregroundColor(.white) Spacer() - Picker("", selection: $settings.resolution) { + Picker("", selection: resolutionSelection) { + Text("Custom").tag(Resolution(width: -1, height: -1)) + ForEach(Self.resolutionsGroupedByType, id: \.0) { aspectRatio, resolutions in - ForEach(resolutions, id: \.self) { resolution in - Text(resolution.description).tag(resolution) + Section(header: Text(aspectRatio.displayString)) { + ForEach(resolutions, id: \.self) { resolution in + Text(resolution.description).tag(resolution) + } } } } @@ -41,26 +119,104 @@ struct SettingsView: View { } .padding(.vertical, 4) - HStack { - Text("Aspect Ratio") - .foregroundColor(.white) - Spacer() - Picker("", selection: $selectedAspectRatio) { - ForEach(Self.resolutionsGroupedByType.map { $0.0 }, id: \.self) { aspectRatio in - Text(aspectRatio.displayString).tag(aspectRatio as AspectRatio?) - } - } - .pickerStyle(.menu) - .onChange(of: selectedAspectRatio) { newValue in - if let newAspectRatio = newValue { - Task { @MainActor in - updateResolutionForAspectRatio(newAspectRatio) + // Custom Resolution Input Panel + if isCustomResolution { + VStack(spacing: 12) { + HStack(spacing: 12) { + VStack(alignment: .leading, spacing: 4) { + Text("Width") + .font(.caption) + .foregroundColor(.white.opacity(0.6)) + + TextField("", text: $customWidth) + .textFieldStyle(.plain) + .keyboardType(.numberPad) + .foregroundColor(.white) + .padding(10) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.1)) + ) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(Color.white.opacity(0.2), lineWidth: 1) + ) + .onChange(of: customWidth) { _, newValue in + let filtered = newValue.filter { $0.isNumber } + if filtered != newValue { + customWidth = filtered + } + if let width = Int(filtered), width > 0, + let height = Int(customHeight), height > 0 { + settings.resolution = Resolution(width: width, height: height) + } + } + } + + Text("×") + .font(.system(size: 20, weight: .light)) + .foregroundColor(.white.opacity(0.5)) + .padding(.top, 18) + + VStack(alignment: .leading, spacing: 4) { + Text("Height") + .font(.caption) + .foregroundColor(.white.opacity(0.6)) + + TextField("", text: $customHeight) + .textFieldStyle(.plain) + .keyboardType(.numberPad) + .foregroundColor(.white) + .padding(10) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.1)) + ) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(Color.white.opacity(0.2), lineWidth: 1) + ) + .onChange(of: customHeight) { _, newValue in + let filtered = newValue.filter { $0.isNumber } + if filtered != newValue { + customHeight = filtered + } + if let width = Int(customWidth), width > 0, + let height = Int(filtered), height > 0 { + settings.resolution = Resolution(width: width, height: height) + } + } } - isCustomAspectRatio = false } + + Text("Enter custom resolution (e.g., 3440×1440)") + .font(.caption) + .foregroundColor(.white.opacity(0.5)) } + .padding(.top, 8) } - .padding(.vertical, 4) + + // Aspect Ratio picker hidden - redundant with grouped resolution picker + // HStack { + // Text("Aspect Ratio") + // .foregroundColor(.white) + // Spacer() + // Picker("", selection: $selectedAspectRatio) { + // ForEach(Self.resolutionsGroupedByType.map { $0.0 }, id: \.self) { aspectRatio in + // Text(aspectRatio.displayString).tag(aspectRatio as AspectRatio?) + // } + // } + // .pickerStyle(.menu) + // .onChange(of: selectedAspectRatio) { newValue in + // if let newAspectRatio = newValue { + // Task { @MainActor in + // updateResolutionForAspectRatio(newAspectRatio) + // } + // isCustomAspectRatio = false + // } + // } + // } + // .padding(.vertical, 4) HStack { Text("Framerate") @@ -75,50 +231,328 @@ struct SettingsView: View { } .padding(.vertical, 4) - HStack { - Text("Bitrate") - .foregroundColor(.white) - Spacer() - Picker("", selection: $settings.bitrate) { - ForEach(Self.bitrateTable, id: \.self) { bitrate in - Text("\(bitrate / 1000) Mbps").tag(bitrate) + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Bitrate") + .foregroundColor(.white) + Spacer() + Menu { + Button("Custom…") { + isCustomBitrate = true + showCustomBitrateEntryRow = true + if savedCustomBitrateMbps > 0 { + customBitrateString = "\(savedCustomBitrateMbps)" + } else { + customBitrateString = "\(max(1, Int(settings.bitrate / 1000)))" + } + } + Divider() + ForEach(Self.bitrateTable, id: \.self) { br in + Button("\(br / 1000) Mbps") { + isCustomBitrate = false + showCustomBitrateEntryRow = false + settings.bitrate = br + } + } + } label: { + Text(bitrateMenuCapsuleTitle) + .lineLimit(1) + .minimumScaleFactor(0.72) } } - .pickerStyle(.menu) - } - .padding(.vertical, 4) - - if settings.bitrate > 300000 { - Label("Bitrates exceeding 300 Mbps require an extreme high-performance network.", systemImage: "wifi.exclamationmark") - .font(.caption) - .foregroundStyle(.orange) + .padding(.vertical, 4) + + if isCustomBitrate && showCustomBitrateEntryRow { + HStack(spacing: 10) { + TextField("", text: $customBitrateString) + .textFieldStyle(.plain) + .keyboardType(.numberPad) + .multilineTextAlignment(.center) + .font(.system(size: 17, weight: .medium, design: .rounded).monospacedDigit()) + .foregroundColor(.white) + .padding(.horizontal, 8) + .padding(.vertical, 10) + .frame(width: 88) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.1)) + ) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(Color.white.opacity(0.2), lineWidth: 1) + ) + .onChange(of: customBitrateString) { _, _ in + sanitizeCustomBitrateDraft() + } + + Text("Mbps") + .font(.subheadline) + .foregroundColor(.white.opacity(0.85)) + + Button(action: confirmCustomBitrateEntry) { + Text("Confirm") + .font(.subheadline.weight(.semibold)) + .foregroundColor(.white.opacity(0.92)) + .padding(.horizontal, 12) + .padding(.vertical, 10) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.white.opacity(0.18)) + ) + } + .buttonStyle(.plain) + .disabled(customBitrateMbpsDraft == nil) + + Spacer(minLength: 0) + } .padding(.top, 8) + } + + if settings.bitrate > 300000 { + Label("Bitrates exceeding 300 Mbps require an extreme high-performance network.", systemImage: "wifi.exclamationmark") + .font(.caption) + .foregroundStyle(.orange) + } } - HStack { - Text("Renderer") - .foregroundColor(.white) - Spacer() - Picker("Renderer", selection: $settings.renderer) { - Text(Renderer.classic.description).tag(Renderer.classic) - Text(Renderer.curvedDisplay.description).tag(Renderer.curvedDisplay) + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Display Mode") + .foregroundColor(.white) + Spacer() + Picker("Display Mode", selection: $settings.renderer) { + Text(Renderer.classicMetal.description).tag(Renderer.classicMetal) + Text(Renderer.curvedDisplay.description).tag(Renderer.curvedDisplay) + Text(Renderer.classicDisplay.description).tag(Renderer.classicDisplay) + } + .pickerStyle(.menu) + .onChange(of: settings.renderer) { _, _ in + settings.save() + } + } + + if settings.renderer == .curvedDisplay { + Text("Curved Display offers an immersive experience with customizable screen curvature, 360° environments, and advanced visual effects. External apps are not visible in this mode.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } else if settings.renderer == .classicMetal { + Text("Flat Display provides a traditional flat screen experience with RealityKit rendering and modern visual enhancements. External apps remain visible.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } else if settings.renderer == .classicDisplay { + Text("Classic Display uses the original UIKit rendering for improved compatibility with keyboard and mouse input. External apps remain visible.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) } - .pickerStyle(.menu) } .padding(.vertical, 4) } // Display Settings SettingsSection(title: "Display Settings") { - HStack { - Text("Touch Mode") + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Curved Display Default Controls") + .foregroundColor(.white) + Spacer() + Picker("", selection: $settings.curvedDefaultControlMode) { + Text("Gaze/Touch Control").tag(2) // gazeControl = 2 + Text("Screen Adjust").tag(0) // screenMove = 0 + Text("Controller").tag(1) // controller = 1 + } + .pickerStyle(.menu) + .onChange(of: settings.curvedDefaultControlMode) { _, newValue in + UserDefaults.standard.set(newValue, forKey: "curved.defaultControlMode") + } + } + + Text("Choose the default control at the top when streaming. **Gaze Control/Touch Control**: Move the cursor with your eyes or drag and double pinch to click. **Screen Adjust**: Drag or resize the display using hand gestures. **Controller**: Use a game controller connected to Vision Pro bluetooth. You can switch between modes anytime during streaming.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + + // Gaze Control Method + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Curved Display Control Method") + .foregroundColor(.white) + Spacer() + Picker("", selection: $settings.curvedGazeUseTouchMode) { + Text("Gaze (Eye Tracking)").tag(false) + Text("Touch (Hand Drag)").tag(true) + } + .pickerStyle(.menu) + .onChange(of: settings.curvedGazeUseTouchMode) { _, newValue in + UserDefaults.standard.set(newValue, forKey: "curved.gazeUseTouchMode") + } + } + + Text("Choose how you control the cursor in Gaze Control mode:") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + .padding(.bottom, 4) + + Text("**Gaze (Eye Tracking)**: Look where you want the cursor to go, then pinch to click. Quick double pinch = click, hold pinch = right-click.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + + + Text("**Touch (Hand Drag)**: Works like a trackpad. Pinch and drag to move the cursor. Quick double pinch = click, hold pinch = right-click.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + + // Gaze Cursor Calibration + VStack(alignment: .leading, spacing: 8) { + Text("Gaze Cursor Calibration") .foregroundColor(.white) - Spacer() - Picker("", selection: $settings.absoluteTouchMode) { - Text("Touchpad").tag(false) - Text("Touchscreen").tag(true) + + // Horizontal and Vertical controls on one line + HStack(spacing: 8) { + // Horizontal: - LEFT, + RIGHT + Button(action: { + if settings.gazeCursorOffsetX > -100 { + settings.gazeCursorOffsetX -= 2 + UserDefaults.standard.set(settings.gazeCursorOffsetX, forKey: "gaze.cursorOffsetX") + } + }) { + Text("- LEFT") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(Color.white.opacity(0.1)) + .cornerRadius(6) + } + .buttonStyle(.plain) + + Text(settings.gazeCursorOffsetX >= 0 ? "+\(settings.gazeCursorOffsetX)" : "\(settings.gazeCursorOffsetX)") + .foregroundColor(.white) + .frame(width: 35) + + Button(action: { + if settings.gazeCursorOffsetX < 100 { + settings.gazeCursorOffsetX += 2 + UserDefaults.standard.set(settings.gazeCursorOffsetX, forKey: "gaze.cursorOffsetX") + } + }) { + Text("+ RIGHT") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(Color.white.opacity(0.1)) + .cornerRadius(6) + } + .buttonStyle(.plain) + .padding(.trailing, 30) + + // Vertical: - DOWN, + UP + Button(action: { + if settings.gazeCursorOffsetY > -100 { + settings.gazeCursorOffsetY -= 2 + UserDefaults.standard.set(settings.gazeCursorOffsetY, forKey: "gaze.cursorOffsetY") + } + }) { + Text("- DOWN") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(Color.white.opacity(0.1)) + .cornerRadius(6) + } + .buttonStyle(.plain) + + Text(settings.gazeCursorOffsetY >= 0 ? "+\(settings.gazeCursorOffsetY)" : "\(settings.gazeCursorOffsetY)") + .foregroundColor(.white) + .frame(width: 35) + + Button(action: { + if settings.gazeCursorOffsetY < 100 { + settings.gazeCursorOffsetY += 2 + UserDefaults.standard.set(settings.gazeCursorOffsetY, forKey: "gaze.cursorOffsetY") + } + }) { + Text("+ UP") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(Color.white.opacity(0.1)) + .cornerRadius(6) + } + .buttonStyle(.plain) + .padding(.trailing, 20) + + Button(action: { + settings.gazeCursorOffsetX = 0 + settings.gazeCursorOffsetY = 0 + UserDefaults.standard.set(0, forKey: "gaze.cursorOffsetX") + UserDefaults.standard.set(0, forKey: "gaze.cursorOffsetY") + }) { + Text("Reset") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .padding(.horizontal, 12) + .padding(.vertical, 4) + .background(Color.white.opacity(0.1)) + .cornerRadius(6) + } + .buttonStyle(.plain) } - .pickerStyle(.menu) + + Text("Fine-tune gaze cursor alignment if the cursor appears offset from where you're looking in Curved Display mode.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Flat Display Default Controls") + .foregroundColor(.white) + Spacer() + Picker("", selection: $settings.absoluteTouchMode) { + Text("Touch Control").tag(false) + Text("Gaze Control").tag(true) + } + .pickerStyle(.menu) + } + + Text("Choose your default cursor control method. **Gaze Control**: Use your eyes and pinch to control the cursor. Quick double pinch = click, hold pinch = right-click. **Touch Control**: Use trackpad-style hand dragging with pinch to control cursor. Quick double pinch = click, hold pinch = right-click. Toggle between modes anytime during streaming.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 8) { + HStack { + Text("Classic Display Default Controls") + .foregroundColor(.white) + Spacer() + Picker("", selection: $classicAbsoluteTouchMode) { + Text("Touch Control").tag(false) + Text("Gaze Control").tag(true) + } + .pickerStyle(.menu) + } + + Text("Choose your cursor control method for Classic Display. **Gaze Control**: Touch position follows your gaze. **Touch Control**: Trackpad-style relative movement. This setting is applied when the stream starts and cannot be changed mid-stream.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) } .padding(.vertical, 4) @@ -136,32 +570,136 @@ struct SettingsView: View { } .padding(.vertical, 4) - Toggle("Statistics Overlay", isOn: $settings.statsOverlay) - .padding(.vertical, 4) - - Toggle("Hide VisionOS Cursor", isOn: $settings.hideSystemCursor) + if settings.renderer == .curvedDisplay { + VStack(alignment: .leading, spacing: 8) { + Toggle("Hide Hands in 360° Environments", isOn: $settings.hideHandsIn360Environment) + .onChange(of: settings.hideHandsIn360Environment) { _, _ in + settings.save() + } + + Text("When enabled, your hands and arms will be hidden when a 360° environment is active.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .fixedSize(horizontal: false, vertical: true) + } .padding(.vertical, 4) + } } - // Controller & Audio Settings - SettingsSection(title: "Controller & Audio") { + // Additional Options + SettingsSection(title: "Additional Options") { + VStack(alignment: .leading, spacing: 4) { HStack { - Text("Multi-Controller Mode") + Text("Controller Mode") .foregroundColor(.white) Spacer() Picker("", selection: $settings.multiController) { - Text("Single").tag(false) - Text("Auto").tag(true) + Text("Single / Co-op").tag(false) + Text("Multi").tag(true) } .pickerStyle(.menu) + } + Text("Single/Co-op: Single player or co-op requires this mode. Multi: Multiple controllers connected to the same Vision Pro.") + .font(.caption) + .foregroundColor(.gray) } .padding(.vertical, 4) Toggle("Swap A/B and X/Y Buttons", isOn: $settings.swapABXYButtons) .padding(.vertical, 4) - Toggle("Play Audio on PC", isOn: $settings.playAudioOnPC) - .padding(.vertical, 4) + VStack(alignment: .leading, spacing: 4) { + Toggle("Play Audio on PC", isOn: $settings.playAudioOnPC) + + Text("Plays audio on your PC speakers/headphones instead of streaming to Vision Pro.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Mic Streamer Compatibility Mode", isOn: $settings.showMicButton) + + Text("Adds a mute button to control Mic Streamer app while in Curved Display mode.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Show Task Manager Button", isOn: Binding( + get: { settings.showTaskManagerButton }, + set: { newValue in + settings.showTaskManagerButton = newValue + UserDefaults.standard.set(newValue, forKey: "showTaskManagerButton") + } + )) + + Text("Adds a button to the top controls that quickly opens Task Manager on your PC.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Show Controller Battery Level", isOn: Binding( + get: { settings.showControllerBattery }, + set: { newValue in + settings.showControllerBattery = newValue + UserDefaults.standard.set(newValue, forKey: "showControllerBattery") + } + )) + + Text("Displays battery level and charging status for the primary controller.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Dynamic Controls Menu", isOn: Binding( + get: { settings.useCollapsedControlsMenu }, + set: { newValue in + settings.useCollapsedControlsMenu = newValue + UserDefaults.standard.set(newValue, forKey: "useCollapsedControlsMenu") + } + )) + + Text("Top bar becomes a single less distracting icon that expands on tap. Turn off for the classic always-visible bar.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Remove Rounded Corners", isOn: Binding( + get: { settings.removeRoundedCorners }, + set: { newValue in + settings.removeRoundedCorners = newValue + UserDefaults.standard.set(newValue, forKey: "removeRoundedCorners") + } + )) + + Text("Disables the rounded corners on the stream display. Requires relaunch.") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) + + VStack(alignment: .leading, spacing: 4) { + Toggle("Dark Mode", isOn: Binding( + get: { settings.darkControlsMode }, + set: { newValue in + settings.darkControlsMode = newValue + UserDefaults.standard.set(newValue, forKey: "darkControlsMode") + } + )) + + Text("Further reduces control bar visibility for enhanced immersion in dark environments. (Flat and Curved display mode only)") + .font(.caption) + .foregroundColor(.gray) + } + .padding(.vertical, 4) } // Advanced Settings @@ -209,15 +747,21 @@ struct SettingsView: View { .padding(.top, 4) } - HStack { - Text("Frame Pacing") - .foregroundColor(.white) - Spacer() - Picker("", selection: $settings.useFramePacing) { - Text("Lowest Latency").tag(false) - Text("Smoothest Video").tag(true) + VStack(alignment: .leading, spacing: 4) { + HStack { + Text("Frame Pacing") + .foregroundColor(.white) + Spacer() + Picker("", selection: $settings.useFramePacing) { + Text("Lowest Latency").tag(false) + Text("Smoothest Video").tag(true) + } + .pickerStyle(.menu) } - .pickerStyle(.menu) + + Text("Lowest Latency: minimal lag, ideal for competitive games. Smoothest Video: no stutters, ideal for cinematic games.") + .font(.caption) + .foregroundColor(.gray) } .padding(.vertical, 4) } @@ -230,6 +774,25 @@ struct SettingsView: View { .onAppear { selectedAspectRatio = settings.resolution.aspectRatio isCustomAspectRatio = !Self.resolutionTable.contains(settings.resolution) + + // Check if current resolution is custom (not in preset table) + if !Self.resolutionTable.contains(settings.resolution) { + isCustomResolution = true + customWidth = String(settings.resolution.width) + customHeight = String(settings.resolution.height) + } + + // Load curved display default control mode from UserDefaults + settings.curvedDefaultControlMode = UserDefaults.standard.integer(forKey: "curved.defaultControlMode") + + // Load gaze control method from UserDefaults + settings.curvedGazeUseTouchMode = UserDefaults.standard.bool(forKey: "curved.gazeUseTouchMode") + + // Load gaze cursor calibration from UserDefaults + settings.gazeCursorOffsetX = UserDefaults.standard.integer(forKey: "gaze.cursorOffsetX") + settings.gazeCursorOffsetY = UserDefaults.standard.integer(forKey: "gaze.cursorOffsetY") + + syncCustomBitrateUIFromSettings() } .onChange(of: settings.resolution) { _, newValue in selectedAspectRatio = newValue.aspectRatio @@ -348,15 +911,17 @@ extension SettingsView { case AspectRatio(width: 4, height: 3): "4:3" case AspectRatio(width: 64, height: 27): - "'21:9' 2560x1080 or 5120x2160" + "21:9" case AspectRatio(width: 43, height: 18): - "'21:9' 3440x1440" + "21:9" case AspectRatio(width: 24, height: 10): - "24:10 3840x1600" + "24:10" + case AspectRatio(width: 32, height: 10): + "32:10" case AspectRatio(width: 64, height: 18): "32:9" default: - "\(width)-by-\(height)" + "\(width):\(height)" } } @@ -369,15 +934,17 @@ extension SettingsView { case AspectRatio(width: 4, height: 3): return "4:3" case AspectRatio(width: 64, height: 27): - return "'21:9' 2560x1080 or 5120x2160" + return "21:9" case AspectRatio(width: 43, height: 18): - return "'21:9' 3440x1440" + return "21:9" case AspectRatio(width: 24, height: 10): - return "24:10 3840x1600" + return "24:10" + case AspectRatio(width: 32, height: 10): + return "32:10" case AspectRatio(width: 64, height: 18): return "32:9" default: - return "\(width)-by-\(height)" + return "\(width):\(height)" } } @@ -397,11 +964,17 @@ extension SettingsView { var description: String { switch self { case Resolution(width: 3840, height: 2160): - "4K" + "3840x2160 (4K)" case Resolution(width: 5120, height: 2880): - "5K" - case _ where simplifyFraction(numerator: width, denominator: height) == simplifyFraction(numerator: 16, denominator: 9): - "\(height)p" + "5120x2880 (5K)" + case Resolution(width: 7680, height: 4320): + "7680x4320 (8K)" + case Resolution(width: 1280, height: 720): + "1280x720 (720p)" + case Resolution(width: 1920, height: 1080): + "1920x1080 (1080p)" + case Resolution(width: 2560, height: 1440): + "2560x1440 (1440p)" default: "\(width)x\(height)" } @@ -409,22 +982,51 @@ extension SettingsView { } static let resolutionTable = [ + // 16:9 Standard Resolution(width: 1280, height: 720), Resolution(width: 1920, height: 1080), Resolution(width: 2560, height: 1440), Resolution(width: 3840, height: 2160), Resolution(width: 5120, height: 2880), + Resolution(width: 7680, height: 4320), // 8K + + // 16:10 Widescreen + Resolution(width: 1280, height: 800), + Resolution(width: 1440, height: 900), + Resolution(width: 1680, height: 1050), Resolution(width: 1920, height: 1200), Resolution(width: 2560, height: 1600), + Resolution(width: 3840, height: 2400), + + // 21:9 Ultrawide Resolution(width: 2560, height: 1080), - Resolution(width: 5120, height: 2160), Resolution(width: 3440, height: 1440), Resolution(width: 3840, height: 1600), + Resolution(width: 5120, height: 2160), + + // 32:9 Super Ultrawide + Resolution(width: 3840, height: 1080), Resolution(width: 5120, height: 1440), + Resolution(width: 7680, height: 2160), + + // 32:10 Ultrawide + Resolution(width: 3840, height: 1200), + + // Other Ultrawide + Resolution(width: 5120, height: 1080), // Super ultrawide 21:9 variant ] static var resolutionsGroupedByType: [(AspectRatio, [Resolution])] { - Dictionary(grouping: resolutionTable, by: \.aspectRatio).sorted { $0.key < $1.key } + // Group resolutions, but use displayString for grouping to combine similar aspect ratios + let grouped = Dictionary(grouping: resolutionTable) { resolution -> String in + resolution.aspectRatio.displayString + } + + // Convert back to AspectRatio keys, using the first resolution's aspect ratio as representative + return grouped.map { (displayString, resolutions) -> (AspectRatio, [Resolution]) in + let representativeAspectRatio = resolutions.first!.aspectRatio + return (representativeAspectRatio, resolutions.sorted { $0.width < $1.width }) + }.sorted { $0.0 < $1.0 } } static let framerateTable: [Int32] = [30, 60, 90, 100, 120] @@ -451,4 +1053,4 @@ private func simplifyFraction(numerator: I, denominator: I) -> #Preview { @State var settings = TemporarySettings() return SettingsView(settings: $settings) -} \ No newline at end of file +} diff --git a/Moonlight Vision/Shaders.metal b/Moonlight Vision/Shaders.metal index c2aa1ed60..5c9e967b4 100644 --- a/Moonlight Vision/Shaders.metal +++ b/Moonlight Vision/Shaders.metal @@ -2,12 +2,18 @@ #include using namespace metal; -// MARK: - Constants -// 100.0 Nits = Standard SDR White Reference. -constant float REFERENCE_WHITE_NITS = 200.0; -constant float3 kRec709Luma = float3(0.2126, 0.7152, 0.0722); +// MARK: - Reference Constants +// BT.2408 diffuse white reference: 203 nits maps to EDR 1.0 on a correctly-calibrated display. +constant float PQ_REFERENCE_WHITE_NITS = 203.0; +// Luma coefficients for each color space (used for luma-preserved grading). +constant float3 kRec709Luma = float3(0.2126, 0.7152, 0.0722); +constant float3 kRec2020Luma = float3(0.2627, 0.6780, 0.0593); +constant float3 kDisplayP3Luma = float3(0.2289, 0.6917, 0.0793); +// HDR: fixed contrast pivot (EDR scene space). SDR keeps per-pixel luma pivot (legacy accurate SDR). +constant float kHDRContrastPivot = 0.10; + +// MARK: - Structures -// MARK: - New Structures struct ColorEnhancementUniforms { float saturation; float contrast; @@ -15,58 +21,327 @@ struct ColorEnhancementUniforms { float padding1; }; -struct CopyVertexOut { float4 position [[position]]; float2 uv; }; -struct HDRParams { uint presetIndex; uint isPQ; uint isBT2020Matrix; uint isBT2020Primaries; }; +// Shader-side HDR frame parameters — describes the incoming video signal. +// Swift side must match this layout exactly (field order + types + padding). +// The YUV conversion matrix and offsets are computed on the CPU once per format +// change and passed here, eliminating all branching in the fragment shader. +struct ShaderHDRParams { + uint isPQ; // 1 = SMPTE ST.2084 PQ transfer function, 0 = SDR / extended + uint primariesType; // 0 = BT.709/P3, 1 = BT.2020, 2 = SMPTE-C (gamut map selector) + uint extendedScene; // 1 = Moonlight HDR + non-PQ: extended desktop path in processFrame + uint reserved0; + float edrHeadroom; // Tone map ceiling (fixed 2.0 on visionOS) + float pad; + float2 alignPad; // Pad to 32 bytes before optional HDR metadata + // Sunshine ST 2086 sidecar (LiGetHdrMetadata): maxCLL / maxFALL in nits; 0 = ignore (legacy tone map). + float maxContentNits; + float maxFrameAvgNits; + float2 padHdrMeta; // Pad to 48 bytes before float3x3 (16-byte alignment) + // Precomputed YUV → RGB conversion (column-major, CPU-selected per format). + // Eliminates all if/else branching in the fragment shader. + float3x3 yuvMatrix; // Full YUV→RGB matrix (includes range scaling) + float3 yuvOffset; // Subtract before matrix multiply (Y black, UV center) +}; -// Matrices -constant float3x3 BT2020_TO_P3 = float3x3( - float3( 1.6605, -0.1246, -0.0182), - float3(-0.5876, 1.1329, -0.1006), - float3(-0.0729, -0.0083, 1.1188) -); +// User-facing HDR grading parameters. +struct FullHDRParams { + float boost; // Linear luminance multiplier (1.0 = neutral) + float contrast; // Luma-preserved contrast (1.0 = neutral) + float saturation; // Color saturation (1.0 = neutral) + float brightness; // Additive brightness offset (0.0 = neutral) + float pqExposure; // Global exposure trim (1.0 = neutral); applies to both HDR and SDR paths + int mode; // UIKit / preset mode (unchanged) + uint hdrGradeFlags;// bit0 = Reference HDR: PQ + gamut + tone map only (no client grade / trims) +}; -constant float3x3 BT709_TO_P3 = float3x3( - float3( 0.6069, 0.1735, 0.2006), - float3( 0.2989, 0.5866, 0.1144), - float3( 0.0000, 0.0661, 1.1150) -); +struct CopyVertexOut { + float4 position [[position]]; + float2 uv; +}; -// MARK: - Helper Functions +// MARK: - SDR / TestFlight-only (8798705) — buffers for `copyFragmentShaderHDR_EDR` when HDR is OFF +// Declared before any HDR-unified code so SDR fragments never depend on ShaderHDRParams / processFrame. -inline float pqInv(float p) { +constant float LEGACY_SDR_REFERENCE_WHITE_NITS = 200.0; + +struct LegacySDRFrameParams { + uint presetIndex; + uint isPQ; + uint isBT2020Matrix; + uint isBT2020Primaries; +}; + +struct LegacySDRFullParams { + float boost; + float contrast; + float saturation; + float brightness; + int mode; +}; + +inline float legacy_sdr_pq_inv(float p) { const float m1 = 0.1593017578125; const float m2 = 78.84375; const float c1 = 0.8359375; const float c2 = 18.8515625; const float c3 = 18.6875; p = clamp(p, 0.0, 1.0); - float n = pow(p, 1.0 / m2); + float n = pow(p, 1.0 / m2); float num = max(n - c1, 0.0); float den = max(c2 - c3 * n, 1e-4); return pow(num / den, 1.0 / m1) * 10000.0; } -inline float3 pqInv(float3 p) { return float3(pqInv(p.r), pqInv(p.g), pqInv(p.b)); } -inline float expandY_10bit(float y) { return clamp((y - 0.06256) * 1.16780, 0.0, 1.0); } -inline float2 expandCbCr_10bit(float2 uv) { return (uv - float2(0.5, 0.5)) * 1.14170; } +inline float3 legacy_sdr_pq_inv(float3 p) { + return float3(legacy_sdr_pq_inv(p.r), legacy_sdr_pq_inv(p.g), legacy_sdr_pq_inv(p.b)); +} + +inline float legacy_sdr_expand_y(float y) { + return clamp((y - 0.06256) * 1.16780, 0.0, 1.0); +} -// MARK: - Vision Pro Grading (Profiles) +inline float2 legacy_sdr_expand_uv(float2 uv) { + return (uv - float2(0.5, 0.5)) * 1.14170; +} -float3 applyVisionProGrading(float3 color, constant ColorEnhancementUniforms& params) { +inline float3 legacy_sdr_apply_vision_pro_grading(float3 color, ColorEnhancementUniforms params) { + if (abs(params.saturation - 1.0) < 0.001 && + abs(params.contrast - 1.0) < 0.001 && + abs(params.warmth) < 0.001) { + return clamp(color, 0.0, 1.0); + } float luma = dot(color, kRec709Luma); float3 saturated = mix(float3(luma), color, params.saturation); float3 contrasted = (saturated - 0.5) * params.contrast + 0.5; - float3 warmed = contrasted; if (abs(params.warmth) > 0.001) { warmed.r = contrasted.r * (1.0 + params.warmth * 0.5); warmed.b = contrasted.b * (1.0 - params.warmth * 0.5); warmed = clamp(warmed, 0.0, 1.0); } - return clamp(warmed, 0.0, 1.0); } +inline float3 legacy_sdr_apply_vision_pro_grading(float3 color, constant ColorEnhancementUniforms& paramsConst) { + ColorEnhancementUniforms local = paramsConst; + return legacy_sdr_apply_vision_pro_grading(color, local); +} + +// MARK: - Gamut Conversion Matrices +// Column-major, linear light, D65 white point. Derived from ICC chromaticity coordinates. + +// BT.709 linear → Display P3 linear +constant float3x3 BT709_TO_DISPLAYP3 = float3x3( + float3(0.82246, 0.03319, 0.01708), + float3(0.17754, 0.96681, 0.07240), + float3(0.00000, 0.00000, 0.91052) +); + +// BT.2020 linear → Display P3 linear +constant float3x3 BT2020_TO_DISPLAYP3 = float3x3( + float3( 1.22494, -0.04206, -0.01964), + float3(-0.22494, 1.04206, -0.07864), + float3( 0.00000, 0.00000, 1.09827) +); + +// SMPTE-C (BT.601) linear → BT.709 linear +constant float3x3 SMPTEC_TO_BT709 = float3x3( + float3( 1.0654, -0.0196, 0.0016), + float3(-0.0554, 1.0364, -0.0044), + float3(-0.0010, -0.0167, 1.0028) +); + +// MARK: - SDR Transfer Function +// Windows PCs and PC games are mastered for gamma 2.2 / BT.1886. +// Using 2.2 here matches how content actually looks on the source monitor, +// giving correct mid-tone punch vs the source PC display. +// (Apple's own 1.961 is only correct for Rec.709 content in QuickTime/Safari.) +inline float3 sdrToLinear(float3 c) { + return pow(clamp(c, 0.0, 1.0), float3(2.2)); +} + +// MARK: - YUV Decode +// The conversion matrix and offset were precomputed on the Swift CPU side +// (selecting the right ITU matrix + range scaling for this frame's format). +// Zero branching here — one multiply-add covers all six format combinations. +inline float3 decodeYUV(float y, float2 uv, constant ShaderHDRParams& p) { + float3 yuv = float3(y, uv.x, uv.y) - p.yuvOffset; + return p.yuvMatrix * yuv; +} + +// MARK: - PQ Inverse Transfer Function (SMPTE ST.2084) +// Returns absolute luminance in nits (0–10000). +inline float pqToNits(float p) { + const float m1 = 0.1593017578125; + const float m2 = 78.84375; + const float c1 = 0.8359375; + const float c2 = 18.8515625; + const float c3 = 18.6875; + p = clamp(p, 0.0, 1.0); + float n = pow(p, 1.0 / m2); + float num = max(n - c1, 0.0); + float den = max(c2 - c3 * n, 1e-4); + return pow(num / den, 1.0 / m1) * 10000.0; +} + +inline float3 pqToNits(float3 p) { + return float3(pqToNits(p.r), pqToNits(p.g), pqToNits(p.b)); +} + +// MARK: - Gamut Mapping for SDR Content +// Maps SDR primaries to linear Display P3 for the rgba16Float drawable. +inline float3 sdrPrimariesToDisplayP3(float3 linearColor, constant ShaderHDRParams& p) { + if (p.primariesType == 1u) { + return max(BT2020_TO_DISPLAYP3 * linearColor, float3(0.0)); + } else if (p.primariesType == 2u) { + float3 as709 = max(SMPTEC_TO_BT709 * linearColor, float3(0.0)); + return max(BT709_TO_DISPLAYP3 * as709, float3(0.0)); + } + return max(BT709_TO_DISPLAYP3 * linearColor, float3(0.0)); +} + +// MARK: - Uchimura Tone Mapping Operator +// From Hajime Uchimura, "HDR Theory and Practice" (CEDEC 2018 / GDC 2018). +// Designed specifically for game content; smooth shoulder, no ACES hue rotation. +// P = max display brightness (in EDR units relative to SDR white) +// a = contrast in the linear section +// m = start of the linear section +// l = length of the linear section +// c = black tightness (toe) +// b = black pedestal +inline float uchimura(float x, float P, float a, float m, float l, float c, float b) { + float l0 = ((P - m) * l) / a; + float L0 = m - m / a; + float L1 = m + (1.0 - m) / a; + float S0 = m + l0; + float S1 = m + a * l0; + float C2 = (a * P) / (P - S1); + float CP = -C2 / P; + + float w0 = 1.0 - smoothstep(0.0, m, x); + float w2 = step(m + l0, x); + float w1 = 1.0 - w0 - w2; + + float T = m * pow(x / m, c) + b; + float S = P - (P - S1) * exp(CP * (x - S0)); + float L = m + a * (x - m); + + return T * w0 + L * w1 + S * w2; +} + +// Widen Uchimura shoulder P when Sunshine reports modest maxCLL / low maxFALL (typical Windows HDR desktop) +// so mids/highlights are not flattened; 0 maxContentNits leaves base P unchanged. +inline float hdrUchimuraShoulderP(float baseP, float maxContentNits, float maxFrameAvgNits) { + float P = clamp(baseP, 1.2, 6.0); + if (maxContentNits > 1.0) { + float peakEdr = clamp(maxContentNits / PQ_REFERENCE_WHITE_NITS, 1.05, 40.0); + float target = peakEdr * 1.08; + if (maxFrameAvgNits > 1.0) { + float fallEdr = clamp(maxFrameAvgNits / PQ_REFERENCE_WHITE_NITS, 0.15, peakEdr); + target = max(target, fallEdr * 2.2); + } + P = clamp(max(P, target), 1.2, 6.0); + } + return P; +} + +// Apply Uchimura per luma channel to preserve chromaticity (avoids hue twist). +// edrCeiling is the live display EDR headroom passed from Swift each frame. +inline float3 uchimuraToneMap(float3 colorP3, float edrCeiling, float maxContentNits, float maxFrameAvgNits) { + float P = hdrUchimuraShoulderP(clamp(edrCeiling, 1.2, 6.0), maxContentNits, maxFrameAvgNits); + // Tuned for Vision Pro's ~100-nit effective eye output with micro-OLED infinite black. + float a = 1.0; // Linear section contrast + float m = 0.22; // Linear section start (matches Reinhard mid-gray) + float l = 0.40; // Linear section length + float c = 1.33; // Toe (black tightness) + float b = 0.0; // Black pedestal + + float luma = max(dot(colorP3, kDisplayP3Luma), 1e-6); + float mappedLuma = uchimura(luma, P, a, m, l, c, b); + return colorP3 * (mappedLuma / luma); +} + +/// Reference HDR: same Uchimura family but slightly **higher shoulder P** and gentler **toe** so +/// mids/highlights are not rolled off as aggressively (Enhanced path used to add boost/sat *before* TM). +/// A small **chroma recovery** after TM offsets perceived desaturation from luma-only scaling. +inline float3 uchimuraToneMapReference(float3 colorP3, float edrCeiling, float maxContentNits, float maxFrameAvgNits) { + float baseP = clamp(max(edrCeiling * 1.18, 2.55), 1.35, 6.0); + float P = hdrUchimuraShoulderP(baseP, maxContentNits, maxFrameAvgNits); + float a = 1.0; + float m = 0.22; + float l = 0.42; + float c = 1.18; + float b = 0.0; + + float luma = max(dot(colorP3, kDisplayP3Luma), 1e-6); + float mappedLuma = uchimura(luma, P, a, m, l, c, b); + float3 tm = colorP3 * (mappedLuma / luma); + + float L = max(dot(tm, kDisplayP3Luma), 1e-4); + const float kRefChromaRecover = 1.065; + return max(mix(float3(L), tm, kRefChromaRecover), float3(0.0)); +} + +// MARK: - Luma-Preserved Color Grading +// Original per-pixel luma pivot (for SDR; matches pre-overhaul behavior exactly). +inline float3 lumaPreservedGrading(float3 color, float saturation, float contrast, float warmth, float3 lumaWeights) { + float luma = dot(color, lumaWeights); + + // Saturation: mix toward luma-only + float3 saturated = mix(float3(luma), color, saturation); + + // Contrast: scale chroma around luma (not around 0.5) + float3 contrasted = (saturated - float3(luma)) * contrast + float3(luma); + + // Warmth: slight red lift / blue reduction + float3 warmed = contrasted; + if (abs(warmth) > 0.001) { + warmed.r = contrasted.r * (1.0 + warmth * 0.5); + warmed.b = contrasted.b * (1.0 - warmth * 0.5); + } + + return max(warmed, float3(0.0)); +} + +// HDR: per-pixel luma pivot for contrast to avoid crushing shadows and black-level drift. +inline float3 lumaPreservedGradingHDR(float3 color, float saturation, float contrast, float warmth, float3 lumaWeights) { + float luma = dot(color, lumaWeights); + + // Saturation: mix toward luma-only + float3 saturated = mix(float3(luma), color, saturation); + + // Contrast: scale chroma around luma (not around a fixed pivot) + float3 contrasted = (saturated - float3(luma)) * contrast + float3(luma); + + // Warmth: slight red lift / blue reduction + float3 warmed = contrasted; + if (abs(warmth) > 0.001) { + warmed.r = contrasted.r * (1.0 + warmth * 0.5); + warmed.b = contrasted.b * (1.0 - warmth * 0.5); + } + + return max(warmed, float3(0.0)); +} + +// SDR variant clamps output to [0, 1]. +inline float3 lumaPreservedGradingSDR(float3 color, float saturation, float contrast, float warmth) { + return clamp(lumaPreservedGrading(color, saturation, contrast, warmth, kRec709Luma), 0.0, 1.0); +} + +// MARK: - Radial Saturation Falloff +// Vision Pro's pancake optics produce chromatic aberration toward the screen periphery. +// Reducing saturation slightly at the edges compensates and avoids harsh color fringing. +// The effect is intentionally subtle (max 12% reduction at corners). +inline float radialSaturationScale(float2 uv) { + float edgeDist = length(uv - float2(0.5)); + return 1.0 - smoothstep(0.30, 0.70, edgeDist) * 0.12; +} + +// MARK: - Rounded Rectangle SDF (UIKit renderer corner clipping) +inline float roundedRectSDF(float2 centerPos, float2 halfSize, float radius) { + return length(max(abs(centerPos) - halfSize + radius, 0.0)) - radius; +} + // MARK: - Vertex Shader vertex CopyVertexOut copyVertexShader(ushort vid [[vertex_id]]) { CopyVertexOut o; @@ -76,95 +351,538 @@ vertex CopyVertexOut copyVertexShader(ushort vid [[vertex_id]]) { return o; } -// MARK: - Main Fragment Shader (YUV) +// MARK: - Shared Processing Core +// All four fragment shaders funnel their decoded RGB into this function. +// Keeps logic in one place so all renderers are always in sync. +inline float3 processFrame( + float3 rgb_raw, + float2 uv, + constant ShaderHDRParams& p, + constant FullHDRParams& full, + constant ColorEnhancementUniforms& enh +) { + float3 finalColor; + const uint kHDRGradeReference = 1u; + bool referenceHdr = (full.hdrGradeFlags & kHDRGradeReference) != 0u; + + if (p.isPQ == 1u) { + // --- PQ / HDR path --- + // 1. PQ decode → absolute nits + float3 nits = pqToNits(clamp(rgb_raw, 0.0, 1.0)); + + // 2. Scale to EDR units relative to 203-nit reference white (BT.2408) + float3 edr = nits / PQ_REFERENCE_WHITE_NITS; + + // 3. Gamut: BT.2020 → Display P3 (or BT.709 → Display P3 if 709 primaries) + bool use2020 = (p.primariesType == 1u); + float3 colorP3 = use2020 + ? max(BT2020_TO_DISPLAYP3 * edr, float3(0.0)) + : max(BT709_TO_DISPLAYP3 * edr, float3(0.0)); + + if (referenceHdr) { + // Reference: PQ + gamut + dedicated tone map (no panel sliders). TM tuned slightly + // punchier than the Enhanced default map + mild chroma recovery (see uchimuraToneMapReference). + finalColor = uchimuraToneMapReference(colorP3, p.edrHeadroom, p.maxContentNits, p.maxFrameAvgNits); + } else { + // 4. User grading (luma-preserved, no hard clamp — preserves HDR headroom) + float3 lumaW = use2020 ? kRec2020Luma : kDisplayP3Luma; + float radialSat = radialSaturationScale(uv); + float effectiveSat = enh.saturation * full.saturation * radialSat; + colorP3 = lumaPreservedGradingHDR(colorP3, effectiveSat, enh.contrast * full.contrast, enh.warmth, lumaW); + + // 5. User level trims (HDR path — applied in linear light before tone mapping) + colorP3 *= max(full.boost, 0.0); + colorP3 += max(full.brightness, 0.0); + colorP3 *= max(full.pqExposure, 0.0); + + // 6. Uchimura tone map against live EDR headroom (no display-specific black lift afterward). + colorP3 = uchimuraToneMap(colorP3, p.edrHeadroom, p.maxContentNits, p.maxFrameAvgNits); + + finalColor = colorP3; + } + + } else { + // --- Non-PQ path (Moonlight HDR on: Windows Advanced Color desktop, scRGB-like, etc.) --- + float3 colorSDR; + if (p.extendedScene != 0u) { + // Do not clamp to SDR [0,1] first — that crushes Windows HDR desktop into a milky veil. + // Compress extended peaks with the same Uchimura family used for luma, then allow grading. + colorSDR = max(rgb_raw, float3(0.0)); + float peak = max(max(colorSDR.r, colorSDR.g), colorSDR.b); + peak = max(peak, 1e-5); + float3 chromaDir = colorSDR / peak; + float P = hdrUchimuraShoulderP(clamp(p.edrHeadroom, 1.25, 6.0), p.maxContentNits, p.maxFrameAvgNits); + float mappedPeak = uchimura(peak, P, 1.0, 0.22, 0.42, 1.18, 0.0); + colorSDR = chromaDir * mappedPeak; + colorSDR = min(colorSDR, float3(1.0)); + } else { + // True SDR: gamma-encoded RGB in [0,1] after decode. + colorSDR = clamp(rgb_raw, 0.0, 1.0); + } + + if (referenceHdr) { + finalColor = colorSDR; + } else { + // User grading (gamma-space, matching baseline applyVisionProGrading behavior) + float radialSat = radialSaturationScale(uv); + float effectiveSat = enh.saturation * full.saturation * radialSat; + colorSDR = lumaPreservedGradingSDR(colorSDR, effectiveSat, enh.contrast * full.contrast, enh.warmth); + + // User level trims (include exposure so the panel matches PQ and SDR-in-unified paths) + colorSDR *= max(full.boost, 0.0); + colorSDR += max(full.brightness, 0.0); + colorSDR *= max(full.pqExposure, 0.0); + + finalColor = clamp(colorSDR, 0.0, 1.0); + } + } + + // Safety ceiling — prevents any runaway value from blowing out the display. + return min(finalColor, float3(20.0)); +} + +// MARK: - HDR-only unified path (app HDR ON — never bound for SDR) + +fragment half4 copyFragmentShaderHDR_HDRUnified( + CopyVertexOut in [[stage_in]], + texture2d yTex [[texture(0)]], + texture2d uvTex [[texture(1)]], + constant ShaderHDRParams ¶ms [[buffer(0)]], + constant FullHDRParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enh [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float ySample = yTex.sample(s, in.uv).r; + float2 uvSample = uvTex.sample(s, in.uv).rg; + + float3 rgb = decodeYUV(ySample, uvSample, params); + + float3 finalColor = processFrame(rgb, in.uv, params, full, enh); + return half4(half3(finalColor), 1.0h); +} + +fragment half4 copyFragmentShaderHEVC_HDRUnified( + CopyVertexOut in [[stage_in]], + texture2d rgbTex [[texture(0)]], + constant ShaderHDRParams ¶ms [[buffer(0)]], + constant FullHDRParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enh [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float3 rgb = float3(rgbTex.sample(s, in.uv).rgb); + + float3 finalColor = processFrame(rgb, in.uv, params, full, enh); + return half4(half3(finalColor), 1.0h); +} + +// MARK: - SDR / TestFlight RealityKit (`8798705` — no decodeYUV / processFrame) + fragment half4 copyFragmentShaderHDR_EDR( CopyVertexOut in [[stage_in]], - texture2d yTex [[texture(0)]], - texture2d cbcrTex [[texture(1)]], - constant HDRParams ¶ms [[buffer(0)]], - constant ColorEnhancementUniforms &enhancements [[buffer(2)]] + texture2d yTex [[texture(0)]], + texture2d uvTex [[texture(1)]], + constant LegacySDRFrameParams ¶ms [[buffer(0)]], + constant LegacySDRFullParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enhancements [[buffer(2)]] ) { - constexpr sampler s(coord::normalized, - address::clamp_to_edge, - filter::linear, - mip_filter::linear); + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); - float ySample = yTex.sample(s, in.uv).r; - float2 uvSample = cbcrTex.sample(s, in.uv).rg; + float ySample = yTex.sample(s, in.uv).r; + float2 uvSample = uvTex.sample(s, in.uv).rg; - float y = expandY_10bit(ySample); - float2 uv = expandCbCr_10bit(uvSample); + float y = legacy_sdr_expand_y(ySample); + float2 uv = legacy_sdr_expand_uv(uvSample); float cb = uv.x; float cr = uv.y; float3 rgb_nl; if (params.isBT2020Matrix == 1u) { - rgb_nl = float3( - y + 1.4746 * cr, - y - 0.16455 * cb - 0.57135 * cr, - y + 1.8814 * cb - ); + rgb_nl = float3(y + 1.4746 * cr, y - 0.16455 * cb - 0.57135 * cr, y + 1.8814 * cb); } else { - rgb_nl = float3( - y + 1.5748 * cr, - y - 0.1873 * cb - 0.4681 * cr, - y + 1.8556 * cb - ); + rgb_nl = float3(y + 1.5748 * cr, y - 0.1873 * cb - 0.4681 * cr, y + 1.8556 * cb); } float3 finalColor; - if (params.isPQ == 1u) { - float3 linearNits = pqInv(clamp(rgb_nl, 0.0, 1.0)); - float3 p3Linear = linearNits; - finalColor = p3Linear / REFERENCE_WHITE_NITS; + float3 linearNits = legacy_sdr_pq_inv(clamp(rgb_nl, 0.0, 1.0)); + finalColor = linearNits / LEGACY_SDR_REFERENCE_WHITE_NITS; } else { - float3 p3Linear; - if (params.isBT2020Primaries == 1u) { - p3Linear = rgb_nl; - } else { - p3Linear = rgb_nl; - } - finalColor = p3Linear; + finalColor = rgb_nl; } - finalColor = applyVisionProGrading(finalColor, enhancements); - if (params.isPQ == 1u) { - finalColor = min(finalColor, float3(20.0)); - } else { - finalColor = clamp(finalColor, 0.0, 1.0); - } + finalColor *= max(full.boost, 0.0); + finalColor += max(full.brightness, 0.0); + + ColorEnhancementUniforms eff = enhancements; + eff.saturation = enhancements.saturation * full.saturation; + eff.contrast = enhancements.contrast * full.contrast; + + finalColor = legacy_sdr_apply_vision_pro_grading(finalColor, eff); + finalColor = (params.isPQ == 1u) ? min(finalColor, float3(20.0)) : clamp(finalColor, 0.0, 1.0); return half4(half3(finalColor), 1.0h); } -// MARK: - Fallback Fragment Shader (RGB) fragment half4 copyFragmentShaderHEVC_EDR( CopyVertexOut in [[stage_in]], texture2d rgbTex [[texture(0)]], - constant HDRParams ¶ms [[buffer(0)]], - constant ColorEnhancementUniforms &enhancements [[buffer(2)]] + constant LegacySDRFrameParams ¶ms [[buffer(0)]], + constant LegacySDRFullParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enhancements [[buffer(2)]] ) { - constexpr sampler s(coord::normalized, - address::clamp_to_edge, - filter::linear, - mip_filter::linear); + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); float3 rgb_nl = float3(rgbTex.sample(s, in.uv).rgb); + float3 finalColor; + if (params.isPQ == 1u) { + float3 linearNits = legacy_sdr_pq_inv(clamp(rgb_nl, 0.0, 1.0)); + finalColor = linearNits / LEGACY_SDR_REFERENCE_WHITE_NITS; + } else { + finalColor = rgb_nl; + } + + finalColor *= max(full.boost, 0.0); + finalColor += max(full.brightness, 0.0); + + ColorEnhancementUniforms eff = enhancements; + eff.saturation = enhancements.saturation * full.saturation; + eff.contrast = enhancements.contrast * full.contrast; + + finalColor = legacy_sdr_apply_vision_pro_grading(finalColor, eff); + finalColor = (params.isPQ == 1u) ? min(finalColor, float3(20.0)) : clamp(finalColor, 0.0, 1.0); + return half4(half3(finalColor), 1.0h); +} + +// MARK: - UIKit (HDR unified vs TestFlight SDR) + +fragment half4 copyFragmentShaderHDR_HDRUnified_UIKit( + CopyVertexOut in [[stage_in]], + texture2d yTex [[texture(0)]], + texture2d uvTex [[texture(1)]], + constant ShaderHDRParams ¶ms [[buffer(0)]], + constant FullHDRParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enh [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float2 texSize = float2(yTex.get_width(), yTex.get_height()); + float2 pixPos = in.uv * texSize; + float2 center = pixPos - (texSize * 0.5); + float dist = roundedRectSDF(center, texSize * 0.5, 16.0); + if (dist > 0.0) { discard_fragment(); } + + float ySample = yTex.sample(s, in.uv).r; + float2 uvSample = uvTex.sample(s, in.uv).rg; + + float3 rgb = decodeYUV(ySample, uvSample, params); + + float3 finalColor = processFrame(rgb, in.uv, params, full, enh); + return half4(half3(finalColor), 1.0h); +} + +fragment half4 copyFragmentShaderHEVC_HDRUnified_UIKit( + CopyVertexOut in [[stage_in]], + texture2d rgbTex [[texture(0)]], + constant ShaderHDRParams ¶ms [[buffer(0)]], + constant FullHDRParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enh [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float2 texSize = float2(rgbTex.get_width(), rgbTex.get_height()); + float2 pixPos = in.uv * texSize; + float2 center = pixPos - (texSize * 0.5); + float dist = roundedRectSDF(center, texSize * 0.5, 16.0); + if (dist > 0.0) { discard_fragment(); } + + float3 rgb = float3(rgbTex.sample(s, in.uv).rgb); + + float3 finalColor = processFrame(rgb, in.uv, params, full, enh); + return half4(half3(finalColor), 1.0h); +} + +fragment half4 copyFragmentShaderHDR_EDR_UIKit( + CopyVertexOut in [[stage_in]], + texture2d yTex [[texture(0)]], + texture2d uvTex [[texture(1)]], + constant LegacySDRFrameParams ¶ms [[buffer(0)]], + constant LegacySDRFullParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enhancements [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float2 texSize = float2(yTex.get_width(), yTex.get_height()); + float2 pixelPos = in.uv * texSize; + float2 centerPos = pixelPos - (texSize * 0.5); + float cornerRadius = 16.0; + float dist = roundedRectSDF(centerPos, texSize * 0.5, cornerRadius); + float alpha = 1.0 - smoothstep(-0.5, 0.5, dist); + + float ySample = yTex.sample(s, in.uv).r; + float2 uvSample = uvTex.sample(s, in.uv).rg; + + float y = legacy_sdr_expand_y(ySample); + float2 uv = legacy_sdr_expand_uv(uvSample); + float cb = uv.x; + float cr = uv.y; + + float3 rgb_nl; + if (params.isBT2020Matrix == 1u) { + rgb_nl = float3(y + 1.4746 * cr, y - 0.16455 * cb - 0.57135 * cr, y + 1.8814 * cb); + } else { + rgb_nl = float3(y + 1.5748 * cr, y - 0.1873 * cb - 0.4681 * cr, y + 1.8556 * cb); + } + float3 finalColor; if (params.isPQ == 1u) { - float3 linearNits = pqInv(clamp(rgb_nl, 0.0, 1.0)); - float3 p3Linear = linearNits; - finalColor = p3Linear / REFERENCE_WHITE_NITS; + float3 linearNits = legacy_sdr_pq_inv(clamp(rgb_nl, 0.0, 1.0)); + finalColor = linearNits / LEGACY_SDR_REFERENCE_WHITE_NITS; } else { finalColor = rgb_nl; } - finalColor = applyVisionProGrading(finalColor, enhancements); + finalColor *= max(full.boost, 0.0); + finalColor += max(full.brightness, 0.0); + + ColorEnhancementUniforms eff = enhancements; + eff.saturation = enhancements.saturation * full.saturation; + eff.contrast = enhancements.contrast * full.contrast; + + finalColor = legacy_sdr_apply_vision_pro_grading(finalColor, eff); + finalColor = (params.isPQ == 1u) ? min(finalColor, float3(20.0)) : clamp(finalColor, 0.0, 1.0); + + return half4(half3(finalColor), half(alpha)); +} + +fragment half4 copyFragmentShaderHEVC_EDR_UIKit( + CopyVertexOut in [[stage_in]], + texture2d rgbTex [[texture(0)]], + constant LegacySDRFrameParams ¶ms [[buffer(0)]], + constant LegacySDRFullParams &full [[buffer(1)]], + constant ColorEnhancementUniforms &enhancements [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float2 texSize = float2(rgbTex.get_width(), rgbTex.get_height()); + float2 pixelPos = in.uv * texSize; + float2 centerPos = pixelPos - (texSize * 0.5); + float cornerRadius = 16.0; + float dist = roundedRectSDF(centerPos, texSize * 0.5, cornerRadius); + float alpha = 1.0 - smoothstep(-0.5, 0.5, dist); + + float3 rgb_nl = float3(rgbTex.sample(s, in.uv).rgb); + + float3 finalColor; if (params.isPQ == 1u) { - finalColor = min(finalColor, float3(20.0)); + float3 linearNits = legacy_sdr_pq_inv(clamp(rgb_nl, 0.0, 1.0)); + finalColor = linearNits / LEGACY_SDR_REFERENCE_WHITE_NITS; } else { - finalColor = clamp(finalColor, 0.0, 1.0); + finalColor = rgb_nl; } - return half4(half3(finalColor), 1.0h); -} \ No newline at end of file + + finalColor *= max(full.boost, 0.0); + finalColor += max(full.brightness, 0.0); + + ColorEnhancementUniforms eff = enhancements; + eff.saturation = enhancements.saturation * full.saturation; + eff.contrast = enhancements.contrast * full.contrast; + + finalColor = legacy_sdr_apply_vision_pro_grading(finalColor, eff); + finalColor = (params.isPQ == 1u) ? min(finalColor, float3(20.0)) : clamp(finalColor, 0.0, 1.0); + + return half4(half3(finalColor), half(alpha)); +} + +// MARK: - ChromaHalo Edge Bloom (multi-pass: rim → separable blur → temporal) +// +// Pass 1 — rim: 7×7 gather on mip 0, premultiplied RGBA (no temporal). +// Passes 2–5 — Two rounds of separable 13-tap Gaussian (Ambilight-wide diffusion), then temporal on the last V-only pass. + +fragment half4 chromaHaloRimFragment( + CopyVertexOut in [[stage_in]], + texture2d sourceTex [[texture(0)]], + constant float &haloScale [[buffer(1)]], + constant float &intensity [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + + float w = max(float(sourceTex.get_width()), 1.0); + float h = max(float(sourceTex.get_height()), 1.0); + float aspect = w / h; + + // Map halo render UV back to normalized video rectangle [0,1]^2 (both axes). + // Physical halo mesh scales by haloScale in width AND height meters; asymmetric + // Y scale here was starving top/bottom in texture space while sides looked rich. + float2 videoScale = float2(haloScale); + float2 videoUV = (in.uv - 0.5) * videoScale + 0.5; + + // Distance from video edge: combine fractional x/y excursion with pixel aspect so + // corners + top/bottom get similar physical falloff weights. + float2 boundaryRaw = max(float2(0.0), abs(videoUV - 0.5) * 2.0 - 1.0); + float bx = boundaryRaw.x; + float by = boundaryRaw.y; + float byScaled = by / aspect; + // Euclidean reach for blur spread only — do NOT drive outer alpha (aspect shrinks dy and + // leaves normalizedDist < 1 on top/bottom rims → visible “hard shelf” vs sides). + float dist = sqrt(bx * bx + byScaled * byScaled); + + // Reactive V1 reach tiers > 1.55: slightly wider rim gather (temporal mix runs in blur-V pass). + const float kChromaHaloScaleBase = 1.55f; + const float kChromaHaloScaleSpan = 1.93f; // maxScale(3.48) − kChromaHaloScaleBase; sync with Reactive1ChromosphereReach haloScales.last + float haloReachT = saturate((haloScale - kChromaHaloScaleBase) / max(kChromaHaloScaleSpan, 1e-4f)); + float blurReachMul = 1.0f + haloReachT * 0.17f; + + // Hollow center — pixels under the video mesh are transparent. + // Slight shrink (0.88) ensures the cutout fully hides behind the video's rounded corners. + float2 hollowCheck = max(float2(0.0), abs(videoUV - 0.5) * 2.0 - 0.88); + if (length(hollowCheck) <= 0.0) { return half4(0.0); } + + // Perimeter sampling: stay near the real bezel (was 8% inset — read as “wrong” colors). Keep ~2% inset + // only to soften occasional decoder edge junk; smooth wide glow still comes from separable blur passes. + float2 safeMin = float2(0.02); + float2 safeMax = float2(0.98); + float2 zoneClamped; + zoneClamped.x = clamp(videoUV.x, safeMin.x, safeMax.x); + zoneClamped.y = clamp(videoUV.y, safeMin.y, safeMax.y); + + // Dynamic sample spread: pixels further from the screen sample a wider area, + // smoothly diffusing color outward without hard bands. + float spread = 1.0 + dist * 6.0; + // Tighter rim kernel: stay on/near the bezel; double separable blur downstream supplies Ambilight width. + float blurRad = min(0.036 * spread * blurReachMul, 0.14 * blurReachMul); + + // Mild anisotropy only — strong tangential stretch pulled interior colors into the rim readout. + float topBottomDominant = saturate(by - bx); + float leftRightDominant = saturate(bx - by); + float blurMux = 1.0 + topBottomDominant * 2.05; + float blurMvy = 1.0 + leftRightDominant * 2.05; + + // 7×7 Gaussian on full-res source (narrow offsets — edge fidelity; blur passes do the big wash). + const float kChromaBlurSigma = 2.0f; + const float kChromaBlurTwoSigmaSq = 2.0f * kChromaBlurSigma * kChromaBlurSigma; + half4 color = half4(0.0); + float totalWeight = 0.0; + float maxLuma = 0.0; + + for (int dy = -3; dy <= 3; dy++) { + for (int dx = -3; dx <= 3; dx++) { + float2 offset = blurRad * float2(float(dx) * blurMux, float(dy) * blurMvy); + float2 sampleUV = clamp(zoneClamped + offset, safeMin, safeMax); + half4 sampleCol = sourceTex.sample(s, sampleUV); + float d2 = float(dx * dx + dy * dy); + float w_g = exp(-d2 / kChromaBlurTwoSigmaSq); + color += sampleCol * half(w_g); + totalWeight += w_g; + float luma = dot(float3(sampleCol.rgb), float3(0.2126, 0.7152, 0.0722)); + maxLuma = max(maxLuma, luma); + } + } + color /= half(totalWeight); + + // Saturation boost — gentler than before so the rim stays a soft wash, not posterized chroma bands. + float avgLuma = dot(float3(color.rgb), float3(0.2126, 0.7152, 0.0722)); + float satBoost = 1.12f; + color.rgb = mix(half3(avgLuma), color.rgb, half(satBoost)); + + // Soft luminance cap — prevent blown-out whites from washing out the glow. + float powerCap = 0.95; + if (maxLuma > powerCap) { color.rgb *= half(powerCap / maxLuma); } + + // Emission scalar — controls raw brightness before fade. + color.rgb *= half(intensity * 2.18); + color.rgb = max(color.rgb, half3(0.0)); + + // Outer fade envelope: per-axis normalization so every rim reaches alpha 0 at the texture edge + // (fixes top/bottom “hard shelf” vs smooth sides). + float cap = haloScale - 1.0; + float capSafe = max(cap, 0.001); + // Left/right ribbons ~30% narrower than unified cap (1/0.7 ≈ 1.43). Top/bottom unchanged. + const float sideTight = 1.0f / 0.7f; + float nxEff = saturate(bx / max(capSafe / sideTight, 1e-4)); + // Narrower ribbon above/below screen than lateral wings (>1 ⇒ faster saturation). + const float tbTight = 1.42f; + float nyEff = saturate(by / max(capSafe / tbTight, 1e-4)); + float normalizedDist = max(nxEff, nyEff); + float t = 1.0 - normalizedDist; + t = t * t * (3.0 - 2.0 * t); + // Lower gamma = longer, softer wash toward the outer edge (less “banded” rim). + float gamma = mix(1.42, 1.92, topBottomDominant); + float fade = pow(max(t, 0.0), gamma); + fade *= mix(1.0, 1.0 - smoothstep(0.38, 1.0, normalizedDist), 0.62); + + // Premultiplied RGBA: avoids dark fringe when RealityKit composites (straight alpha glow smears RGB at low A). + half a = half(fade); + half3 premul = color.rgb * a; + + half4 currPM = half4(premul, a); + half softZero = smoothstep(half(0.0), half(0.006), currPM.a); + return half4(currPM.rgb * softZero, currPM.a * softZero); +} + +// 13-tap horizontal Gaussian (σ ≈ 3.8 texels, premultiplied RGBA). `texelUV` = (1/width, 1/height). +fragment half4 chromaHaloBlurHFragment( + CopyVertexOut in [[stage_in]], + texture2d src [[texture(0)]], + constant float2 &texelUV [[buffer(0)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + const float kW0 = 0.03303223f, kW1 = 0.04834536f, kW2 = 0.06602309f, kW3 = 0.08413198f; + const float kW4 = 0.10003469f, kW5 = 0.11098501f, kW6 = 0.11489529f; + float du = texelUV.x; + half4 acc = half4(0.0); + acc += src.sample(s, in.uv + float2(-6.0 * du, 0.0)) * half(kW0); + acc += src.sample(s, in.uv + float2(-5.0 * du, 0.0)) * half(kW1); + acc += src.sample(s, in.uv + float2(-4.0 * du, 0.0)) * half(kW2); + acc += src.sample(s, in.uv + float2(-3.0 * du, 0.0)) * half(kW3); + acc += src.sample(s, in.uv + float2(-2.0 * du, 0.0)) * half(kW4); + acc += src.sample(s, in.uv + float2(-1.0 * du, 0.0)) * half(kW5); + acc += src.sample(s, in.uv) * half(kW6); + acc += src.sample(s, in.uv + float2( 1.0 * du, 0.0)) * half(kW5); + acc += src.sample(s, in.uv + float2( 2.0 * du, 0.0)) * half(kW4); + acc += src.sample(s, in.uv + float2( 3.0 * du, 0.0)) * half(kW3); + acc += src.sample(s, in.uv + float2( 4.0 * du, 0.0)) * half(kW2); + acc += src.sample(s, in.uv + float2( 5.0 * du, 0.0)) * half(kW1); + acc += src.sample(s, in.uv + float2( 6.0 * du, 0.0)) * half(kW0); + return acc; +} + +// 13-tap vertical Gaussian. `temporalMode` 0 = output blur only (mid-pipeline); 1 = mix with `prevTex` via `frameMix`. +fragment half4 chromaHaloBlurVFragment( + CopyVertexOut in [[stage_in]], + texture2d src [[texture(0)]], + texture2d prevTex [[texture(1)]], + constant float2 &texelUV [[buffer(0)]], + constant uint &temporalMode [[buffer(1)]], + constant float &frameMix [[buffer(2)]] +) { + constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear); + const float kW0 = 0.03303223f, kW1 = 0.04834536f, kW2 = 0.06602309f, kW3 = 0.08413198f; + const float kW4 = 0.10003469f, kW5 = 0.11098501f, kW6 = 0.11489529f; + float dv = texelUV.y; + half4 acc = half4(0.0); + acc += src.sample(s, in.uv + float2(0.0, -6.0 * dv)) * half(kW0); + acc += src.sample(s, in.uv + float2(0.0, -5.0 * dv)) * half(kW1); + acc += src.sample(s, in.uv + float2(0.0, -4.0 * dv)) * half(kW2); + acc += src.sample(s, in.uv + float2(0.0, -3.0 * dv)) * half(kW3); + acc += src.sample(s, in.uv + float2(0.0, -2.0 * dv)) * half(kW4); + acc += src.sample(s, in.uv + float2(0.0, -1.0 * dv)) * half(kW5); + acc += src.sample(s, in.uv) * half(kW6); + acc += src.sample(s, in.uv + float2(0.0, 1.0 * dv)) * half(kW5); + acc += src.sample(s, in.uv + float2(0.0, 2.0 * dv)) * half(kW4); + acc += src.sample(s, in.uv + float2(0.0, 3.0 * dv)) * half(kW3); + acc += src.sample(s, in.uv + float2(0.0, 4.0 * dv)) * half(kW2); + acc += src.sample(s, in.uv + float2(0.0, 5.0 * dv)) * half(kW1); + acc += src.sample(s, in.uv + float2(0.0, 6.0 * dv)) * half(kW0); + + half4 blended; + if (temporalMode != 0u) { + half4 prevPM = prevTex.sample(s, in.uv); + blended = mix(prevPM, acc, half(frameMix)); + } else { + blended = acc; + } + half softZero = smoothstep(half(0.0), half(0.006), blended.a); + return half4(blended.rgb * softZero, blended.a * softZero); +} diff --git a/Moonlight Vision/SplashView.swift b/Moonlight Vision/SplashView.swift index 2150395f1..7e0d0e6ba 100644 --- a/Moonlight Vision/SplashView.swift +++ b/Moonlight Vision/SplashView.swift @@ -1,9 +1,9 @@ // // SplashView.swift -// Moonlight Vision +// Neo Moonlight +// +// Created by NeoVectorX 2026 // -// Created by NeoVectorX -// Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. // import SwiftUI @@ -40,4 +40,4 @@ struct SplashView: View { } } } -} \ No newline at end of file +} diff --git a/Moonlight Vision/UIKitStreamView.swift b/Moonlight Vision/UIKitStreamView.swift index 91a0acfd5..5cc229b48 100644 --- a/Moonlight Vision/UIKitStreamView.swift +++ b/Moonlight Vision/UIKitStreamView.swift @@ -2,370 +2,690 @@ // UIKitStreamView.swift // Moonlight Vision // -// Created by Alex Haugland on 1/27/24. -// Copyright © 2024 Moonlight Game Streaming Project. +// Classic Display Mode - UIKit-based streaming with full controls +// Matches FlatDisplayStreamView features but uses UIKit rendering // import SwiftUI import AVFoundation +// MARK: - Main View + struct UIKitStreamView: View { + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.scenePhase) private var scenePhase + @EnvironmentObject private var viewModel: MainViewModel + @Environment(\.pushWindow) private var pushWindow + @Binding var streamConfig: StreamConfiguration? + + var body: some View { + if let config = streamConfig { + if config.sessionUUID == viewModel.activeSessionToken { + _UIKitStreamViewInner( + streamConfig: Binding( + get: { config }, + set: { streamConfig = $0 } + ) + ) + .id(config.sessionUUID) + } else { + Color.black + .ignoresSafeArea() + .onAppear { + debugLog("👻 Ghost view detected (UUID \(config.sessionUUID) != active \(viewModel.activeSessionToken)). Suppressing.") + recoverFromStaleWindow() + } + } + } else { + Color.black + .ignoresSafeArea() + .onAppear { + recoverFromStaleWindow() + } + } + } + + private func recoverFromStaleWindow() { + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + if !viewModel.activelyStreaming && viewModel.streamState == .idle { + print("[ClassicDisplay] Stale window detected - dismissing and opening mainView") + openWindow(id: "mainView") + dismissWindow(id: "classicStreamingWindow") + } + } + } +} + +// MARK: - Inner Stream View +struct _UIKitStreamViewInner: View { + @Binding var streamConfig: StreamConfiguration + @EnvironmentObject private var viewModel: MainViewModel @Environment(\.openWindow) private var openWindow @Environment(\.dismissWindow) private var dismissWindow @Environment(\.scenePhase) private var scenePhase @Environment(\.pushWindow) private var pushWindow - @Environment(\.openImmersiveSpace) private var openImmersiveSpace - + + // Co-op coordinator + @ObservedObject private var coopCoordinator = CoopSessionCoordinator.shared + + // Core state @State private var hasPerformedTeardown = false - @State private var hideOrnament = false + @State private var hideControls: Bool = true + @State private var controlsExpanded: Bool = false @State private var hideTimer: Timer? - @State private var spatialAudioMode: Bool = true @State private var controlsHighlighted = false - @State private var showSwapOverlay = false - @State private var swapInProgress = false - @State private var showSwapConfirm = false + @State private var isMenuOpen = false + @State private var isGazingAtControls = false + + // Audio state + @State private var spatialAudioMode: Bool = true + @State private var soundStageSize: SoundStageSize = .medium + + // Display state @State private var dimLevel: Int = UserDefaults.standard.integer(forKey: "ambient.dimming.level") - + @State private var currentAmbientColor: Color = .clear + @AppStorage("removeRoundedCorners") private var removeRoundedCorners: Bool = false + + // Virtual keyboard + @State private var showVirtualKeyboard = false + // Preset overlay state @State private var presetOverlayText: String = "" - @State private var showPresetOverlay: Bool = false + @State private var presetOverlayIcon: String = "camera.filters" @State private var showInlinePresetOverlay: Bool = false @State private var presetOverlayTimer: Timer? @State private var presetCooldownUntil: Date? = nil - - @State private var isGazingAtControls = false - - @State private var currentAmbientColor: Color = .clear - + + // Stats overlay + @State private var statsOverlayText: String = "" + @State private var statsTimer: Timer? + + // Co-op state + @State private var inviteButtonSent: Bool = false + @State private var showDisconnectConfirm: Bool = false + + // Stream lifecycle + @State private var streamEpoch: Int = 0 @State private var firstFrameSeen = false + @State private var firstFrameSeenEpoch: Int = -1 @State private var idrWatchdogScheduled = false + @State private var guestAggressiveIDRTimer: Timer? + @State private var needsResume = false + @State private var streamVC: StreamFrameViewController? + @State private var startingStream = false + + let brandPurple = Color(red: 0.7, green: 0.3, blue: 0.9) + let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) + + var body: some View { + let mainContent = ZStack { + // Ambient glow effect + if dimLevel == 2 { + let glow = currentAmbientColor + LinearGradient( + colors: [glow.opacity(0.28), glow.opacity(0.10), .clear], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .blur(radius: 30) + .ignoresSafeArea() + } + + // UIKit stream view - now persistent, stream lifecycle managed externally + _UIKitStreamView( + streamConfig: $streamConfig, + streamVC: $streamVC + ) + .clipShape(RoundedRectangle(cornerRadius: removeRoundedCorners ? 0 : CGFloat(streamConfig.width) * 0.006, style: .continuous)) + + // Preset popup overlay + if showInlinePresetOverlay { + CenterPresetPopup(text: presetOverlayText, icon: presetOverlayIcon) + .scaleEffect(0.65) + .offset(z: 150) + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + .allowsHitTesting(false) + } + + // Co-op join notification + if coopCoordinator.friendJoinedNotification { + CenterPresetPopup(text: "Guest Joined!", icon: "person.badge.plus.fill") + .scaleEffect(0.65) + .offset(z: 150) + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + .allowsHitTesting(false) + } + + // Co-op disconnect notification + if coopCoordinator.disconnectNotification { + CenterPresetPopup(text: coopCoordinator.disconnectMessage, icon: "person.badge.minus.fill") + .scaleEffect(0.65) + .offset(z: 150) + .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) + .allowsHitTesting(false) + } + + // Co-op connecting overlay (for guests) + if viewModel.isCoopSession && viewModel.assignedControllerSlot == 1 && viewModel.streamState == .starting { + CoopConnectingPopup() + .scaleEffect(0.65) + .offset(z: 150) + .transition(.opacity) + .allowsHitTesting(false) + } + + // Disconnect confirmation dialog + if showDisconnectConfirm { + disconnectConfirmationOverlay + } + } + .preferredSurroundingsEffect(dimLevel == 0 ? nil : .systemDark) + .persistentSystemOverlays(hideControls ? .hidden : .visible) + + // Ornaments applied AFTER persistentSystemOverlays so they aren't affected by it + return mainContent + .ornament(attachmentAnchor: .scene(.top), contentAlignment: .bottom) { + topControlsBar + .padding(.bottom, 8) + } + .ornament(attachmentAnchor: .scene(.bottom), contentAlignment: .top) { + bottomOrnaments + } + .onAppear { + setupScene() + } + .onChange(of: scenePhase) { _, phase in + handleScenePhaseChange(phase) + } + .onReceive(NotificationCenter.default.publisher(for: .ambientAverageColorUpdated)) { notif in + handleAmbientColorUpdate(notif) + } + .onReceive(NotificationCenter.default.publisher(for: Notification.Name("StreamFirstFrameShownNotification"))) { _ in + if firstFrameSeenEpoch != streamEpoch { + print("[ClassicDisplay] First frame observed; epoch=\(streamEpoch)") + firstFrameSeen = true + firstFrameSeenEpoch = streamEpoch + } + } + .onReceive(NotificationCenter.default.publisher(for: Notification.Name("StreamDidTeardownNotification"))) { _ in + // Ungate the serializer — LiStopConnection() has truly finished. + ConnectionSerializer.shared.notifyStopComplete() + + // Ignore teardown notification during background suspend + guard !viewModel.isSuspendingForBackground else { + print("[ClassicDisplay] Ignoring StreamDidTeardownNotification — suspending for background") + return + } + + // Prevent "presentation deallocated" crash by dismissing active Moonlight error alerts + if let vc = _UIKitStreamView.controllerReference.object, let presented = vc.presentedViewController { + presented.dismiss(animated: false) + } - // Profiles: Default, Cinematic, Vivid, Realistic - private func presetName(_ v: Int32) -> String { - switch v { - case 0: return "Default" - case 1: return "Cinematic" - case 2: return "Vivid" - case 3: return "Realistic" - default: return "Default" + dismissWindow(id: "classicStreamingWindow") + _UIKitStreamView.controllerReference.object = nil + firstFrameSeen = false + idrWatchdogScheduled = false + } + .onReceive(NotificationCenter.default.publisher(for: .resumeStreamFromMenu)) { _ in + handleResume() + } + .onReceive(NotificationCenter.default.publisher(for: .mainViewWindowClosed)) { _ in + isMenuOpen = false + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.20) { LiRequestIdrFrame() } + } + .onChange(of: viewModel.shouldCloseStream) { _, shouldClose in + if shouldClose && !hasPerformedTeardown { + DispatchQueue.main.async { + print("[ClassicDisplay] ViewModel requested teardown.") + tearDownStream() + } + } + } + .onChange(of: viewModel.streamSettings.statsOverlay) { _, newValue in + if newValue { + startStatsTimer() + } else { + statsTimer?.invalidate() + statsTimer = nil + statsOverlayText = "" + } + } + .onChange(of: viewModel.activelyStreaming) { _, newValue in + if !newValue && !hasPerformedTeardown { + print("[ClassicDisplay] activelyStreaming became false - tearing down") + tearDownStream() + } + } + .onDisappear { + hideControls = true + hideTimer?.invalidate() + statsTimer?.invalidate() + guestAggressiveIDRTimer?.invalidate() + + // Don't tear down if we're just pausing for resume + guard !needsResume else { return } + + if !hasPerformedTeardown && viewModel.activelyStreaming { + print("[ClassicDisplay] onDisappear teardown (safety net).") + tearDownStream() + } } } - - private func applyUIKitPreset(_ value: Int32) { - guard canChangePreset() else { - print("[UIKitStream] Preset change on cooldown, ignoring") - return + + // MARK: - Top Controls Bar + + /// Center button: tap to expand the dynamic menu. + private var uikitCollapsedControlsView: some View { + Button { + if hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + } + withAnimation(.easeInOut(duration: 0.3)) { + controlsExpanded = true + } + startHideTimer() + } label: { + Image(systemName: "ellipsis.circle.fill") + .font(.system(size: 24.07)) + .frame(width: 50, height: 50) } - - viewModel.streamSettings.uikitPreset = value - if let controller = _UIKitStreamView.controllerReference.object { - controller.applyUIKitPreset(value) + .buttonStyle(.plain) + } + + @ViewBuilder + private var topControlsBar: some View { + Group { + if viewModel.streamSettings.useCollapsedControlsMenu { + uikitDynamicControlsBar + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : 0.5) : 0.05) + .animation(Animation.easeInOut(duration: 0.25), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.25), value: hideControls) + .allowsHitTesting(true) + .onHover { hovering in + isGazingAtControls = hovering + if hovering { startHideTimer() } + } + } else { + uikitOriginalControlsBar + } } - - presetCooldownUntil = Date().addingTimeInterval(0.5) - showPresetOverlay(preset: value) - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - LiRequestIdrFrame() + } + + /// Dynamic bar: collapsed = center only (no pill); expanded = full bar with pill. Both branches animate opacity/scale for smooth expand and collapse. + private var uikitDynamicControlsBar: some View { + ZStack { + uikitCollapsedControlsView + .padding(.horizontal, 24) + .padding(.vertical, 12) + .opacity(controlsExpanded ? 0 : 1) + .scaleEffect(controlsExpanded ? 0.88 : 1) + .allowsHitTesting(!controlsExpanded) + uikitControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .glassBackgroundEffect() + .opacity(controlsExpanded ? 1 : 0) + .scaleEffect(controlsExpanded ? 1 : 0.88) + .allowsHitTesting(controlsExpanded) } - - startHideTimer() + .animation(.spring(response: 0.38, dampingFraction: 0.82), value: controlsExpanded) } - - private func nextUIKitPreset(_ current: Int32) -> Int32 { - let all: [Int32] = [0, 1, 2, 3] - if let idx = all.firstIndex(of: current) { - return all[(idx + 1) % all.count] + + private var uikitOriginalControlsBar: some View { + uikitControlsBarContent + .padding(.horizontal, 24) + .padding(.vertical, 12) + .glassBackgroundEffect() + .opacity(!hideControls ? (controlsHighlighted ? 1.0 : 0.5) : 0.05) + .animation(Animation.easeInOut(duration: 0.25), value: controlsHighlighted) + .animation(Animation.easeInOut(duration: 0.25), value: hideControls) + .allowsHitTesting(true) + .onHover { hovering in + isGazingAtControls = hovering + if hovering { startHideTimer() } } - return 0 } - - private func canChangePreset() -> Bool { - guard let cooldownUntil = presetCooldownUntil else { return true } - return Date() >= cooldownUntil + + private var uikitControlsBarContent: some View { + HStack(spacing: 20) { + makeControlButton(label: "Home", systemImage: "house.fill") { + if isMenuOpen { + dismissWindow(id: "mainView") + isMenuOpen = false + } else { + pushWindow(id: "mainView") + isMenuOpen = true + } + fixAudioForCurrentMode() + } + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlsHighlighted = false + hideControls = false + spatialAudioMode.toggle() + fixAudioForCurrentMode() + presetOverlayText = spatialAudioMode ? "Audio: Spatial" : "Audio: Stereo" + presetOverlayIcon = spatialAudioMode ? "person.spatialaudio.fill" : "headphones" + showPresetOverlay() + startHideTimer() + } label: { + Label(spatialAudioMode ? "Spatial Audio" : "Direct Audio", systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + } + .labelStyle(.iconOnly) + .simultaneousGesture( + LongPressGesture(minimumDuration: 0.5) + .onEnded { _ in + guard spatialAudioMode else { return } + soundStageSize = soundStageSize.next() + fixAudioForCurrentMode() + presetOverlayText = "Sound Stage: \(soundStageSize.rawValue)" + presetOverlayIcon = "person.spatialaudio.fill" + showPresetOverlay() + } + ) + makeControlButton(label: "Dim", systemImage: dimLevel == 0 ? "lightbulb.fill" : "lightbulb") { + dimLevel = dimLevel == 0 ? 1 : 0 + UserDefaults.standard.set(dimLevel, forKey: "ambient.dimming.level") + viewModel.streamSettings.dimPassthrough = (dimLevel != 0) + presetOverlayText = dimLevel == 0 ? "Dimming: Off" : "Dimming: On" + presetOverlayIcon = dimLevel == 0 ? "lightbulb.fill" : "lightbulb" + showPresetOverlay() + } + makeControlButton(label: viewModel.streamSettings.statsOverlay ? "Hide Stats" : "Show Stats", systemImage: "wifi") { + viewModel.streamSettings.statsOverlay.toggle() + if viewModel.streamSettings.statsOverlay { + startStatsTimer() + } else { + statsTimer?.invalidate() + } + startHideTimer() + } + if viewModel.streamSettings.showTaskManagerButton { + makeControlButton(label: "Task Manager", systemImage: "list.bullet.circle") { + sendTaskManager() + startHideTimer() + } + } + makeControlButton(label: showVirtualKeyboard ? "Hide Keyboard" : "Show Keyboard", systemImage: showVirtualKeyboard ? "keyboard.fill" : "keyboard") { + if let streamVC = _UIKitStreamView.controllerReference.object { + let isNowVisible = streamVC.toggleKeyboard() + showVirtualKeyboard = isNowVisible + } + startHideTimer() + } + if viewModel.streamSettings.showControllerBattery { + BatteryIndicatorView( + controlsHighlighted: $controlsHighlighted, + hideControls: $hideControls, + startHighlightTimer: startHighlightTimer, + startHideTimer: startHideTimer + ) + } + if viewModel.isCoopSession { + HStack(spacing: 6) { + Image(systemName: "person.2.fill") + .font(.system(size: 16, weight: .semibold)) + Text("2P") + .font(.system(size: 14, weight: .bold)) + Text("(\(coopCoordinator.participants.count)/2)") + .font(.system(size: 12, weight: .medium)) + .foregroundColor(.white.opacity(0.8)) + } + .fixedSize() + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color(red: 0.85, green: 0.6, blue: 0.95).opacity(0.3)) + ) + } + if viewModel.isCoopSession, coopCoordinator.isHosting, coopCoordinator.participants.count < 2 { + coopInviteButton + } + if viewModel.isCoopSession { + coopDisconnectButton + } + } } - private func showPresetOverlay(preset: Int32) { - presetOverlayText = presetName(preset) - showInlinePresetOverlay = true - - presetOverlayTimer?.invalidate() - presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.15)) { - showInlinePresetOverlay = false + // MARK: - Bottom Ornaments + + @ViewBuilder + private var bottomOrnaments: some View { + VStack(spacing: 12) { + // Stats overlay + if viewModel.streamSettings.statsOverlay { + VStack(spacing: 6) { + Text(statsOverlayText.isEmpty ? "Collecting stats..." : statsOverlayText) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(.white) + .multilineTextAlignment(.center) + } + .padding(12) + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(brandNavy.opacity(0.92)) + ) + .allowsHitTesting(false) + } + + // Floating mic button + if viewModel.streamSettings.showMicButton { + FloatingMicButton() } } } - - var body: some View { - Group { - if let configBinding = Binding($streamConfig) { + + // MARK: - Control Button Helper + + private func makeControlButton(label: String, systemImage: String, action: @escaping () -> Void) -> some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + controlsHighlighted = false + hideControls = false + action() + startHideTimer() + } label: { + Label(label, systemImage: systemImage) + .font(.system(size: 24.07)) + .padding(.horizontal, 12) + .padding(.vertical, 12) + .frame(width: 50, height: 50) + } + .labelStyle(.iconOnly) + } + + // MARK: - Co-op Buttons + + private var coopInviteButton: some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + + Task { + await coopCoordinator.reInviteGuest() + } + + inviteButtonSent = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + inviteButtonSent = false + } + + startHideTimer() + } label: { + HStack(spacing: 6) { + Image(systemName: inviteButtonSent ? "checkmark" : "paperplane") + .font(.system(size: 14, weight: .medium)) + Text(inviteButtonSent ? "Sent" : "Invite") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + .animation(.easeInOut(duration: 0.2), value: inviteButtonSent) + } + + private var coopDisconnectButton: some View { + Button { + if !controlsHighlighted && hideControls { + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + return + } + + showDisconnectConfirm = true + } label: { + HStack(spacing: 6) { + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.system(size: 14, weight: .medium)) + Text("Leave") + .font(.system(size: 14, weight: .medium)) + } + .foregroundColor(.white) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .strokeBorder(.white.opacity(0.3), lineWidth: 1) + .background(RoundedRectangle(cornerRadius: 8).fill(.clear)) + ) + } + .buttonStyle(.plain) + } + + // MARK: - Disconnect Confirmation Overlay + + private var disconnectConfirmationOverlay: some View { + ZStack { + Color.black.opacity(0.5) + .ignoresSafeArea() + + let brandRed = Color(red: 0.9, green: 0.3, blue: 0.3) + + VStack(spacing: 24) { ZStack { - if dimLevel == 2 { - let glow = currentAmbientColor - LinearGradient( - colors: [glow.opacity(0.28), glow.opacity(0.10), .clear], - startPoint: .topLeading, - endPoint: .bottomTrailing + Circle() + .fill( + LinearGradient( + colors: [brandNavy, brandNavy.opacity(0.8)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) ) - .blur(radius: 30) - .ignoresSafeArea() - } - - _UIKitStreamView(streamConfig: configBinding) - .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) - .preferredSurroundingsEffect(dimLevel == 0 ? nil : .systemDark) - .persistentSystemOverlays(hideOrnament ? .hidden : .visible) - .ornament(attachmentAnchor: .scene(.top), contentAlignment: .bottom) { - HStack { - Button { - if hideOrnament && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideOrnament = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - // KEEP: Show main menu in front of the live stream - pushWindow(id: "mainView") - controlsHighlighted = true - hideTimer?.invalidate() - startHideTimer() - } label: { - Label("Home", systemImage: "house.fill") - } - .labelStyle(.iconOnly) - - Button { - if hideOrnament && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideOrnament = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - spatialAudioMode.toggle() - if spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } - startHideTimer() - } label: { - Label(spatialAudioMode ? "Spatial Audio" : "Direct Audio", - systemImage: spatialAudioMode ? "person.spatialaudio.fill" : "headphones") - } - .labelStyle(.iconOnly) - - Button { - if hideOrnament && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideOrnament = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - let next = (dimLevel == 0) ? 1 : 0 - dimLevel = next - UserDefaults.standard.set(dimLevel, forKey: "ambient.dimming.level") - viewModel.streamSettings.dimPassthrough = (dimLevel != 0) - startHideTimer() - } label: { - let title: String = { - switch dimLevel { - case 0: return "Dim: Off" - case 1: return "Dim: Night" - default: return "Dim: Off" - } - }() - let icon: String = (dimLevel == 0) ? "moon" : "moon.fill" - Label(title, systemImage: icon) - } - .labelStyle(.iconOnly) - - Button { - if hideOrnament && !controlsHighlighted { - withAnimation(.easeInOut(duration: 0.3)) { - hideOrnament = false - controlsHighlighted = true - hideTimer?.invalidate() - startHighlightTimer() - } - return - } - - let next = nextUIKitPreset(viewModel.streamSettings.uikitPreset) - applyUIKitPreset(next) - } label: { - Label("Preset", systemImage: "camera.filters") - } - .labelStyle(.iconOnly) - -// Button { -// if hideOrnament && !controlsHighlighted { -// withAnimation(.easeInOut(duration: 0.3)) { -// hideOrnament = false -// controlsHighlighted = true -// hideTimer?.invalidate() -// startHighlightTimer() -// } -// return -// } -// hideTimer?.invalidate() -// controlsHighlighted = true -// showSwapConfirm = true -// } label: { -// Label("Swap", systemImage: "rectangle.2.swap") -// } -// .labelStyle(.iconOnly) - } - .padding(12) - .background(Color.white.opacity(0.001)) - .opacity((isGazingAtControls || !hideOrnament) ? 1.0 : 0.05) - .conditionalGlass(isGazingAtControls || !hideOrnament) - .animation(.easeInOut(duration: 0.25), value: isGazingAtControls) - .animation(.easeInOut(duration: 0.25), value: hideOrnament) - .onHover { hovering in - isGazingAtControls = hovering - if hovering { startHideTimer() } - } - // Keep interactive even when ghosted - .allowsHitTesting(true) - } - .onAppear { - NotificationCenter.default.addObserver( - forName: Notification.Name("ResumeStreamFromMenu"), - object: nil, - queue: .main - ) { _ in - withAnimation(.easeInOut(duration: 0.2)) { - controlsHighlighted = true - hideOrnament = false - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.20) { LiRequestIdrFrame() } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { - dismissWindow(id: "mainView") - controlsHighlighted = false - startHideTimer() - } - } - - NotificationCenter.default.addObserver( - forName: Notification.Name("MainViewWindowClosed"), - object: nil, - queue: .main - ) { _ in - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.20) { LiRequestIdrFrame() } - } - - hasPerformedTeardown = false - hideOrnament = false - spatialAudioMode = true - dismissWindow(id: "mainView") - - var stored = UserDefaults.standard.integer(forKey: "ambient.dimming.level") - if stored > 2 { stored = 2; UserDefaults.standard.set(stored, forKey: "ambient.dimming.level") } - dimLevel = stored - viewModel.streamSettings.dimPassthrough = (dimLevel != 0) - - firstFrameSeen = false - idrWatchdogScheduled = false - kickFirstFrameWatchdog() - - DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { - startHideTimer() - } - } - .onChange(of: scenePhase) { _, phase in - switch phase { - case .active: - if streamConfig != nil { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { - if self.spatialAudioMode { - AudioHelpers.fixAudioForSurroundForCurrentWindow() - } else { - AudioHelpers.fixAudioForDirectStereo() - } - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { LiRequestIdrFrame() } - } - default: - break - } - } - .onReceive(NotificationCenter.default.publisher(for: .ambientAverageColorUpdated)) { notif in - if dimLevel == 2 { - if let r = notif.userInfo?["r"] as? Float, - let g = notif.userInfo?["g"] as? Float, - let b = notif.userInfo?["b"] as? Float { - let boostedR = min(1.0, max(0.0, r * 1.5)) - let boostedG = min(1.0, max(0.0, g * 1.5)) - let boostedB = min(1.0, max(0.0, b * 1.5)) - currentAmbientColor = Color(red: Double(boostedR), green: Double(boostedG), blue: Double(boostedB)) - } - } - } - .onReceive(NotificationCenter.default.publisher(for: Notification.Name("StreamDidTeardownNotification"))) { _ in + .frame(width: 64, height: 64) + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) + Image(systemName: "rectangle.portrait.and.arrow.right") + .font(.system(size: 28, weight: .bold)) + .foregroundStyle(.white) + } + + VStack(spacing: 8) { + Text("Leave Co-op Session?") + .font(.system(size: 22, weight: .bold)) + .foregroundStyle(.white) + Text("This will disconnect you from the session and end the stream.") + .font(.system(size: 15, weight: .regular)) + .foregroundStyle(.white.opacity(0.75)) + .multilineTextAlignment(.center) + .padding(.horizontal, 8) + } + + VStack(spacing: 12) { + Button { + showDisconnectConfirm = false + Task { @MainActor in + viewModel.userDidRequestDisconnect() + openWindow(id: "mainView") dismissWindow(id: "classicStreamingWindow") - _UIKitStreamView.controllerReference.object = nil - - firstFrameSeen = false - idrWatchdogScheduled = false } - .onChange(of: viewModel.shouldCloseStream) { _, shouldClose in - if shouldClose && !hasPerformedTeardown { - print("[UIKitStreamView] ViewModel requested teardown.") - tearDownStream() - } - } - .onDisappear { - hideOrnament = false - hideTimer?.invalidate() - NotificationCenter.default.removeObserver(self) - - if !hasPerformedTeardown && streamConfig != nil { - print("[UIKitStreamView] onDisappear teardown (safety net).") - tearDownStream() - } + } label: { + HStack(spacing: 10) { + Text("Leave Session") + .font(.system(size: 17, weight: .semibold)) } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + .background( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill( + LinearGradient( + colors: [brandRed, brandRed.opacity(0.85)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1.5 + ) + ) + .shadow(color: brandRed.opacity(0.5), radius: 18, x: 0, y: 10) + } + .buttonStyle(.plain) - // The 'isSwappingRenderers' flag provides a visual indicator during the swap - if viewModel.isSwappingRenderers { - let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) - ZStack { - brandViolet.opacity(0.12).ignoresSafeArea() - VStack(spacing: 12) { - ProgressView() - .progressViewStyle(.circular) - .tint(brandViolet) - Text("Switching Display Mode") - .font(.system(size: 16, weight: .semibold)) - .foregroundStyle(.white) - } - .padding(20) + Button { + showDisconnectConfirm = false + } label: { + Text("Cancel") + .font(.system(size: 17, weight: .medium)) + .foregroundStyle(.white.opacity(0.75)) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) .background( RoundedRectangle(cornerRadius: 16, style: .continuous) .fill(.ultraThinMaterial) @@ -373,7 +693,7 @@ struct UIKitStreamView: View { RoundedRectangle(cornerRadius: 16, style: .continuous) .stroke( LinearGradient( - colors: [brandViolet.opacity(0.45), brandViolet.opacity(0.2)], + colors: [.white.opacity(0.15), .white.opacity(0.05)], startPoint: .topLeading, endPoint: .bottomTrailing ), @@ -381,111 +701,254 @@ struct UIKitStreamView: View { ) ) ) - .shadow(color: brandViolet.opacity(0.25), radius: 20, x: 0, y: 10) - } - .transition(.opacity) } - - if showSwapConfirm { - let brandViolet = Color(red: 0.85, green: 0.6, blue: 0.95) - let brandPurple = Color(red: 0.7, green: 0.3, blue: 0.9) - - ZStack { - Color.black.opacity(0.35).ignoresSafeArea() - - VStack(spacing: 24) { - ZStack { - Circle() - .fill(LinearGradient(colors: [brandViolet, brandPurple.opacity(0.8)], startPoint: .topLeading, endPoint: .bottomTrailing)) - .frame(width: 64, height: 64) - .shadow(color: brandViolet.opacity(0.4), radius: 12, x: 0, y: 8) - Image(systemName: "rectangle.2.swap") - .font(.system(size: 28, weight: .bold)) - .foregroundStyle(.white) - } - - VStack(spacing: 8) { - Text("Swap Display Mode") - .font(.system(size: 22, weight: .bold)) - .foregroundStyle(.white) - Text("This will stop the current stream and reconnect in Curved Display.") - .font(.system(size: 15, weight: .regular)) - .foregroundStyle(.white.opacity(0.75)) - .multilineTextAlignment(.center) - .padding(.horizontal, 8) - } - - VStack(spacing: 12) { - Button { - showSwapConfirm = false - Task { - await viewModel.performRendererSwap( - openWindow: openWindow, - openImmersiveSpace: openImmersiveSpace, - dismissWindow: dismissWindow - ) - } - } label: { - HStack(spacing: 10) { - Image(systemName: "rectangle.2.swap") - .font(.system(size: 18, weight: .semibold)) - Text("Swap to Curved Display") - .font(.system(size: 17, weight: .semibold)) - } - .foregroundStyle(.white) - .frame(maxWidth: .infinity) - .padding(.vertical, 14) - .background(RoundedRectangle(cornerRadius: 16, style: .continuous).fill(LinearGradient(colors: [brandViolet, brandPurple.opacity(0.85)], startPoint: .topLeading, endPoint: .bottomTrailing))) - .overlay(RoundedRectangle(cornerRadius: 16, style: .continuous).stroke(LinearGradient(colors: [.white.opacity(0.35), .white.opacity(0.1)], startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)) - .shadow(color: brandViolet.opacity(0.35), radius: 18, x: 0, y: 10) - } - .buttonStyle(.plain) - - Button { - showSwapConfirm = false - } label: { - Text("Cancel") - .font(.system(size: 17, weight: .medium)) - .foregroundStyle(.white.opacity(0.7)) - .frame(maxWidth: .infinity) - .padding(.vertical, 14) - .background( - RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(.ultraThinMaterial) - .overlay(RoundedRectangle(cornerRadius: 16, style: .continuous).stroke(LinearGradient(colors: [.white.opacity(0.2), .white.opacity(0.05)], startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)) - ) - } - .buttonStyle(.plain) - } - .padding(.horizontal, 20) - } - .padding(28) - .background( - RoundedRectangle(cornerRadius: 24, style: .continuous) - .fill(.ultraThinMaterial) - .overlay(RoundedRectangle(cornerRadius: 24, style: .continuous).stroke(LinearGradient(colors: [.white.opacity(0.25), .white.opacity(0.06)], startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)) + .buttonStyle(.plain) + } + } + .padding(28) + .background( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .fill(brandNavy.opacity(0.92)) + .overlay( + RoundedRectangle(cornerRadius: 24, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 ) - .shadow(color: .black.opacity(0.25), radius: 30, x: 0, y: 16) - .frame(width: 400) - } - .transition(.opacity.combined(with: .scale)) - } + ) + ) + .shadow(color: .black.opacity(0.25), radius: 30, x: 0, y: 16) + .frame(width: 420) + .allowsHitTesting(true) + } + } + + // MARK: - Lifecycle + + private func setupScene() { + hasPerformedTeardown = false + hideControls = false + spatialAudioMode = true + dismissWindow(id: "mainView") + + var stored = UserDefaults.standard.integer(forKey: "ambient.dimming.level") + if stored > 2 { stored = 2; UserDefaults.standard.set(stored, forKey: "ambient.dimming.level") } + dimLevel = stored + viewModel.streamSettings.dimPassthrough = (dimLevel != 0) + + viewModel.isStreamViewAlive = true + + // Load saved control mode preference for Classic (separate from Flat) + viewModel.streamSettings.absoluteTouchMode = UserDefaults.standard.bool(forKey: "classic.absoluteTouchMode") + + firstFrameSeen = false + idrWatchdogScheduled = false + streamEpoch += 1 + kickFirstFrameWatchdog() + + // Start the stream after a short delay to let the view controller set up + startStreamIfNeeded() + + // Start aggressive IDR for co-op guests + if viewModel.isCoopSession && viewModel.assignedControllerSlot == 1 { + startGuestAggressiveIDR() + } + + if viewModel.streamSettings.statsOverlay { + startStatsTimer() + } + + // Apply aspect ratio lock early (before stream connects) to prevent visible resize + // This matches Flat Display's behavior + applyAspectRatioLockIfReady() + + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + startHideTimer() + } + } + + // MARK: - Stream Management (mirrors FlatDisplayStreamView pattern) + + private func startStreamIfNeeded() { + guard !startingStream else { + print("[ClassicDisplay] Stream start skipped (already starting)") + return + } + + startingStream = true + + // Wait for the view controller to be ready + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + guard !self.hasPerformedTeardown, self.viewModel.activelyStreaming else { + print("[ClassicDisplay] Aborting stream start - Teardown: \(self.hasPerformedTeardown), Streaming: \(self.viewModel.activelyStreaming)") + self.startingStream = false + return + } + + guard let vc = self.streamVC else { + print("[ClassicDisplay] ⚠️ Stream VC not ready, retrying...") + self.startingStream = false + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + self.startStreamIfNeeded() + } + return + } + + // Check if stream is already active + if vc.isStreamActive() { + print("[ClassicDisplay] Stream already active, skipping start") + self.startingStream = false + return + } + + print("[ClassicDisplay] 🚀 Starting stream (epoch \(self.streamEpoch))") + vc.startStreamExternal() + self.startingStream = false + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { LiRequestIdrFrame() } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) { LiRequestIdrFrame() } + } + } + + private func stopStreamExternal() { + guard let vc = streamVC, vc.isStreamActive() else { + print("[ClassicDisplay] stopStreamExternal: no active stream") + return + } - // CENTER-STAGE PRESET POPUP (matches brand blue/glow) - if showInlinePresetOverlay { - PresetPopupView(text: presetOverlayText) - .transition(.opacity.combined(with: .scale(scale: 0.95, anchor: .center))) - } + print("[ClassicDisplay] 🛑 Stopping stream externally") + // Tell the serializer a stop is beginning — no new connection can start until + // the completion fires in StreamFrameViewController.stopStreamExternal. + ConnectionSerializer.shared.notifyStopBegun() + vc.stopStreamExternal() + } + + private func handleScenePhaseChange(_ phase: ScenePhase) { + switch phase { + case .background: + prepareForBackground() + case .active: + resumeIfNeeded() + default: + break + } + } + + private func prepareForBackground() { + guard !hasPerformedTeardown else { return } + guard viewModel.activelyStreaming else { return } + + print("[ClassicDisplay] Preparing for background - stopping stream externally") + needsResume = true + viewModel.isSuspendingForBackground = true + + // Ensure we don't accidentally tear down if the view disappears while backgrounded + hasPerformedTeardown = false + + // Stop stream using the new external control method (view persists) + stopStreamExternal() + } + + private func resumeIfNeeded() { + guard needsResume else { + // Standard active handling when not resuming + if viewModel.activelyStreaming { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + fixAudioForCurrentMode() } - } else { - Color.clear - .onAppear { - if viewModel.streamState == .idle { - dismissWindow(id: "classicStreamingWindow") - _UIKitStreamView.controllerReference.object = nil - } - } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { LiRequestIdrFrame() } } + return + } + + print("[ClassicDisplay] Resuming from background - restarting stream externally") + viewModel.isSuspendingForBackground = false + needsResume = false + hasPerformedTeardown = false + + // Re-arm the view model state so the stream knows it should be active + viewModel.activelyStreaming = true + viewModel.streamState = .starting + + // Reset stream epoch for first-frame detection + firstFrameSeen = false + streamEpoch += 1 + + // Restart stream using the existing view controller (view persists, only stream restarts) + startStreamIfNeeded() + + // Wait slightly longer for the new view controller to be fully mounted + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { LiRequestIdrFrame() } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { LiRequestIdrFrame() } + } + + private func handleAmbientColorUpdate(_ notif: Notification) { + if dimLevel == 2 { + if let r = notif.userInfo?["r"] as? Float, + let g = notif.userInfo?["g"] as? Float, + let b = notif.userInfo?["b"] as? Float { + let boostedR = min(1.0, max(0.0, r * 1.5)) + let boostedG = min(1.0, max(0.0, g * 1.5)) + let boostedB = min(1.0, max(0.0, b * 1.5)) + currentAmbientColor = Color(red: Double(boostedR), green: Double(boostedG), blue: Double(boostedB)) + } + } + } + + private func handleResume() { + print("[ClassicDisplay] handleResume: Called (activelyStreaming: \(viewModel.activelyStreaming), needsResume: \(needsResume))") + + // CRITICAL FIX: Match Curved Display's safety check + // If stream isn't active, we need a full relaunch instead of just resuming + guard viewModel.activelyStreaming else { + print("[ClassicDisplay] handleResume: Stream not active - triggering relaunch via shouldRelaunchStream") + dismissWindow(id: "mainView") + viewModel.shouldRelaunchStream = true + return + } + + dismissWindow(id: "mainView") + isMenuOpen = false + withAnimation(.easeInOut(duration: 0.3)) { + hideControls = false + controlsHighlighted = true + } + startHighlightTimer() + + // If the stream was stopped due to backgrounding, restart it using the existing view controller + if needsResume { + print("[ClassicDisplay] handleResume: Stream was backgrounded, restarting stream externally") + viewModel.isSuspendingForBackground = false + needsResume = false + hasPerformedTeardown = false + + // Re-arm the view model state so the stream knows it should be active + viewModel.activelyStreaming = true + viewModel.streamState = .starting + + // Reset stream epoch for first-frame detection + firstFrameSeen = false + streamEpoch += 1 + + // Restart stream using the existing view controller (view persists, only stream restarts) + startStreamIfNeeded() + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + fixAudioForCurrentMode() + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { LiRequestIdrFrame() } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { LiRequestIdrFrame() } + } else { + // Stream is already running, just fix audio and request IDR + fixAudioForCurrentMode() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.20) { LiRequestIdrFrame() } } } @@ -493,138 +956,263 @@ struct UIKitStreamView: View { guard !hasPerformedTeardown else { return } hasPerformedTeardown = true - print("[UIKitStreamView] Tearing down stream by calling native stopStream...") + print("[ClassicDisplay] Tearing down stream using external control...") + + statsTimer?.invalidate() + guestAggressiveIDRTimer?.invalidate() + viewModel.isStreamViewAlive = false + + // Use the new external stream control method + stopStreamExternal() + } + + // MARK: - Helper Functions + + private func fixAudioForCurrentMode() { + if spatialAudioMode { + AudioHelpers.fixAudioForSurroundForCurrentWindow(soundStageSize: soundStageSize) + } else { + AudioHelpers.fixAudioForDirectStereo() + } + } + + private func showPresetOverlay() { + showInlinePresetOverlay = true - if let streamVC = _UIKitStreamView.controllerReference.object { - streamVC.stopStream() + presetOverlayTimer?.invalidate() + presetOverlayTimer = Timer.scheduledTimer(withTimeInterval: 1.4, repeats: false) { _ in + withAnimation(.easeOut(duration: 0.15)) { + showInlinePresetOverlay = false + } } } private func startHideTimer() { hideTimer?.invalidate() hideTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in - if viewModel.activelyStreaming { - withAnimation(.easeOut(duration: 0.3)) { - hideOrnament = true - controlsHighlighted = false + DispatchQueue.main.async { + if viewModel.activelyStreaming { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation(.easeOut(duration: 0.3)) { + self.hideControls = true + self.controlsHighlighted = false + } + } + } else { + withAnimation(.easeOut(duration: 0.3)) { + self.hideControls = true + self.controlsHighlighted = false + } + } } } } } - + private func startHighlightTimer() { hideTimer?.invalidate() hideTimer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in - withAnimation(.easeOut(duration: 0.3)) { - controlsHighlighted = false - hideOrnament = true + DispatchQueue.main.async { + if self.viewModel.streamSettings.useCollapsedControlsMenu && self.controlsExpanded { + withAnimation(.spring(response: 0.38, dampingFraction: 0.82)) { + self.controlsExpanded = false + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + withAnimation(.easeOut(duration: 0.3)) { + self.controlsHighlighted = false + self.hideControls = true + } + } + } else { + withAnimation(.easeOut(duration: 0.3)) { + self.controlsHighlighted = false + self.hideControls = true + } + } } } } - + + private func startStatsTimer() { + statsTimer?.invalidate() + statsTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in + if let controller = _UIKitStreamView.controllerReference.object { + statsOverlayText = controller.getStatsOverlayText() ?? "No stats available" + } + } + } + private func kickFirstFrameWatchdog() { guard !idrWatchdogScheduled else { return } idrWatchdogScheduled = true - - // Gentle nudges shortly after connect + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { - if !firstFrameSeen { - LiRequestIdrFrame() - } + if !firstFrameSeen { LiRequestIdrFrame() } } DispatchQueue.main.asyncAfter(deadline: .now() + 1.8) { - if !firstFrameSeen { - LiRequestIdrFrame() - } + if !firstFrameSeen { LiRequestIdrFrame() } } - // One last retry; if this still doesn’t resolve, the core stack will terminate/alert on its own DispatchQueue.main.asyncAfter(deadline: .now() + 3.2) { - if !firstFrameSeen { - LiRequestIdrFrame() + if !firstFrameSeen { LiRequestIdrFrame() } + } + } + + private func startGuestAggressiveIDR() { + print("[ClassicDisplay] CO-OP GUEST: Starting aggressive IDR requesting") + var requestCount = 0 + let maxRequests = 120 + + guestAggressiveIDRTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in + requestCount += 1 + if firstFrameSeen { + print("[ClassicDisplay] CO-OP GUEST: First frame received! Stopping IDR requests after \(requestCount) requests") + timer.invalidate() + guestAggressiveIDRTimer = nil + return + } + if requestCount > maxRequests { + print("[ClassicDisplay] CO-OP GUEST: Max IDR requests reached (\(maxRequests)), stopping") + timer.invalidate() + guestAggressiveIDRTimer = nil + return + } + print("[ClassicDisplay] CO-OP GUEST: Requesting IDR frame #\(requestCount)") + LiRequestIdrFrame() + } + } + + private func sendTaskManager() { + DispatchQueue.global(qos: .userInteractive).async { + let MODIFIER_CTRL: Int8 = 0x02 + let MODIFIER_SHIFT: Int8 = 0x01 + let modifiers = MODIFIER_CTRL | MODIFIER_SHIFT + let ESC_KEY: Int16 = 0x1B + + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x03, modifiers) + usleep(50 * 1000) + LiSendKeyboardEvent(Int16(bitPattern: 0x8000) | ESC_KEY, 0x04, modifiers) + } + } + + private func applyAspectRatioLockIfReady() { + // Try to get the window from the controller reference + guard let streamVC = _UIKitStreamView.controllerReference.object else { + // Controller not ready yet, retry after a short delay + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + self.applyAspectRatioLockIfReady() + } + return + } + + guard let window = streamVC.view.window ?? streamVC.view?.superview?.window else { + // Window not ready yet, retry after a short delay + DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) { + self.applyAspectRatioLockIfReady() } + return } + + // Window is ready, apply the aspect ratio lock + applyAspectRatioLock(streamConfiguration: streamConfig, targetWindow: window) } } +// MARK: - UIKit Stream View Wrapper + struct _UIKitStreamView: UIViewControllerRepresentable { typealias UIViewControllerType = StreamFrameViewController - + @Binding var streamConfig: StreamConfiguration + @Binding var streamVC: StreamFrameViewController? static let controllerReference = Reference() - + static var reference: Reference { return controllerReference } - + func makeUIViewController(context: Context) -> UIViewControllerType { - let streamView = StreamFrameViewController() - streamView.streamConfig = streamConfig - streamView.connectedCallback = { [weak streamView] in - print("Connected in Swift!") + let vc = StreamFrameViewController() + vc.streamConfig = streamConfig + + // Enable view-only mode - stream lifecycle managed by Swift + vc.setViewOnlyMode(true) + + vc.connectedCallback = { + print("[ClassicDisplay] Connected!") AudioHelpers.fixAudioForSurroundForCurrentWindow() - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - guard let window = streamView?.view.window ?? streamView?.view?.superview?.window else { return } - applyAspectRatioLock(streamConfiguration: streamConfig, targetWindow: window) - } - + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { LiRequestIdrFrame() } DispatchQueue.main.asyncAfter(deadline: .now() + 0.40) { LiRequestIdrFrame() } - }; - streamView.disconnectedCallback = { - print("Disconnected in Swift!") - }; - _UIKitStreamView.controllerReference.object = streamView - return streamView + } + vc.disconnectedCallback = { + print("[ClassicDisplay] Disconnected!") + } + + _UIKitStreamView.controllerReference.object = vc + + // Pass the controller reference back to Swift for stream control + DispatchQueue.main.async { + self.streamVC = vc + } + + return vc } - + func updateUIViewController(_ viewController: UIViewControllerType, context: Context) { viewController.streamConfig = streamConfig _UIKitStreamView.controllerReference.object = viewController } - + static func dismantleUIViewController(_ uiViewController: StreamFrameViewController, coordinator: ()) { - uiViewController.stopStream() + // Stream lifecycle is managed by Swift - just clean up the reference + print("[ClassicDisplay] dismantleUIViewController - cleaning up reference") _UIKitStreamView.controllerReference.object = nil - NotificationCenter.default.post(name: Notification.Name("StreamControllerDismantled"), object: nil) } } +// MARK: - Reference Helper + class Reference { weak var object: T? } +// MARK: - Aspect Ratio Lock + func applyAspectRatioLock(streamConfiguration: StreamConfiguration, targetWindow: UIWindow?) { guard let window = targetWindow else { print("Error: No target window provided to apply aspect ratio lock.") return } - + let streamWidth = CGFloat(streamConfiguration.width) let streamHeight = CGFloat(streamConfiguration.height) let streamAspectRatio = streamWidth / streamHeight - - print("Applying Aspect Ratio Lock - Stream Width: \(streamWidth), Stream Height: \(streamHeight), Stream AR: \(streamAspectRatio)") - + + print("[ClassicDisplay] Applying Aspect Ratio Lock - Stream: \(Int(streamWidth))x\(Int(streamHeight)), AR: \(String(format: "%.3f", streamAspectRatio))") + let maxWidth: CGFloat = 2000 var desiredSize = CGSize.zero - + for desiredWidthInt in (1...Int(maxWidth)).reversed() { let desiredWidth = CGFloat(desiredWidthInt) let desiredHeightFloat = desiredWidth / streamAspectRatio let desiredHeightInt = Int(round(desiredHeightFloat)) - + if desiredHeightInt > 0 { desiredSize = CGSize(width: desiredWidth, height: CGFloat(desiredHeightInt)) break } } - + guard let windowScene = window.windowScene else { print("Error: Could not get window scene from target window.") return } - + #if os(visionOS) if windowScene.activationState != .foregroundActive { DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { @@ -633,86 +1221,11 @@ func applyAspectRatioLock(streamConfiguration: StreamConfiguration, targetWindow return } #endif - + let geometryRequest = UIWindowScene.GeometryPreferences.Vision( size: desiredSize, resizingRestrictions: .uniform ) - - windowScene.requestGeometryUpdate(geometryRequest) -} - -private struct PresetPopupView: View { - var text: String - var body: some View { - let brandNavy = Color(red: 0.12, green: 0.18, blue: 0.37) - let brandOrange = Color(red: 0.976, green: 0.627, blue: 0.251) - let radius: CGFloat = 18 - let pillWidth: CGFloat = 240 - let pillHeight: CGFloat = 56 - - HStack(spacing: 10) { - Image(systemName: "camera.filters") - .font(.system(size: 15, weight: .semibold)) - .foregroundStyle( - LinearGradient( - colors: [brandOrange, brandOrange.opacity(0.8)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ) - ) - Text(text) - .font(.custom("Fredoka-SemiBold", size: 20)) - .tracking(1.2) - .textCase(.uppercase) - .foregroundColor(.white) - .lineLimit(1) - .minimumScaleFactor(0.85) - } - .frame(width: pillWidth, height: pillHeight, alignment: .center) - .background( - ZStack { - RoundedRectangle(cornerRadius: radius, style: .continuous) - .fill(brandNavy.opacity(0.85)) - RoundedRectangle(cornerRadius: radius, style: .continuous) - .fill(.ultraThinMaterial.opacity(0.3)) - } - ) - .mask(RoundedRectangle(cornerRadius: radius, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: radius, style: .continuous) - .strokeBorder( - LinearGradient( - colors: [brandOrange.opacity(0.5), brandOrange.opacity(0.2)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ), - lineWidth: 1.5 - ) - ) - .compositingGroup() - .shadow(color: brandOrange.opacity(0.4), radius: 20, x: 0, y: 10) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .allowsHitTesting(false) - } + windowScene.requestGeometryUpdate(geometryRequest) } - -private func positionMainMenuWindowInFrontOfStream() { - guard let streamingWindow = UIApplication.shared.connectedScenes - .compactMap({ $0 as? UIWindowScene }) - .flatMap({ $0.windows }) - .first(where: { $0.isKeyWindow }) else { - print("Could not find streaming window!") - return - } - - let windowScene = streamingWindow.windowScene - - windowScene?.requestGeometryUpdate( - UIWindowScene.GeometryPreferences.Vision( - size: CGSize(width: 700, height: 920), - resizingRestrictions: .uniform - ) - ) -} \ No newline at end of file diff --git a/Moonlight Vision/UpdatesView.swift b/Moonlight Vision/UpdatesView.swift index f182b37f7..75c17f2d0 100644 --- a/Moonlight Vision/UpdatesView.swift +++ b/Moonlight Vision/UpdatesView.swift @@ -2,7 +2,7 @@ // UpdatesView.swift // Moonlight // -// Created by camy on 2/2/25. +// // Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. // @@ -27,34 +27,145 @@ struct UpdatesView: View { .foregroundColor(.white.opacity(0.7)) .padding(.horizontal, 24) - VStack(alignment: .leading, spacing: 12) { - Text("Neo Moonlight Version 11.1 December 2025") - .font(.headline) - .foregroundColor(.white) + VStack(spacing: 20) { + // Version 12.1 + VStack(alignment: .leading, spacing: 12) { + Text("Neo Moonlight Version 12.1 - PLATO EDITION (May 2026)") + .font(.headline) + .foregroundColor(.white) + + ChangelogItem(text: "HDR: Complete overhaul of the HDR grading pipeline—PQ decoding, gamut mapping, and tone shaping were reworked end-to-end for a more accurate picture on Vision Pro.") + ChangelogItem(text: "HDR: New in-stream Enhanced HDR panel plus optional Reference HDR.") + ChangelogItem(text: "Settings: Added a custom bitrate option in the Bitrate dropdown menu.") + ChangelogItem(text: "Reactive V1 lighting and bloom adjustments; tap the preset in the picker to cycle glow reach tiers.") + ChangelogItem(text: "Various UI polish.") + } + .padding(24) + .frame(maxWidth: .infinity, alignment: .leading) + .background(changelogReleaseCardBackground) + .shadow(color: .black.opacity(0.2), radius: 16, x: 0, y: 8) - ChangelogItem(text: "Complete UI/UX overhaul") - ChangelogItem(text: "Added a Moonlight user guide") - ChangelogItem(text: "Added multiple dimming options") - ChangelogItem(text: "Added 360° environments") - ChangelogItem(text: "Added curvature presets to match popular gaming monitor industry standards") - ChangelogItem(text: "Icons automatically hide for better immersion") - ChangelogItem(text: "Added statistics overlay to Immersive mode") - ChangelogItem(text: "Added preset color grading options") - ChangelogItem(text: "Added a tilt feature to Curved Display mode") - ChangelogItem(text: "Increased options for framerate and bitrate") - ChangelogItem(text: "Added a disconnect button in the main menu while streaming") - ChangelogItem(text: "Updated Renderers to a more user-friendly naming structure") - ChangelogItem(text: "Implemented Apple's new low-latency streaming entitlement for enhanced streaming performance") - ChangelogItem(text: "Added new toggle for switching between spatial audio and stereo modes for optimized gaming audio") - ChangelogItem(text: "Added AV1 Codec support for M5 Owners") - ChangelogItem(text: "Rounded UI corners slightly to better match visionOS aesthetic design") - ChangelogItem(text: "Set aspect ratio to automatically configure when streaming") - ChangelogItem(text: "Added toggle to hide system cursor to remove duplicate mouse cursors") + // Version 12.0 + VStack(alignment: .leading, spacing: 12) { + Text("Neo Moonlight Version 12.0 - PLATO EDITION (February 2026)") + .font(.headline) + .foregroundColor(.white) + + ChangelogItem(text: "Experimental: Couch Co-op via SharePlay - Play couch co-op games with your friend. This is an extremely experimental feature, so please bear with any bugs or issues you may encounter. IMPORTANT: read co-op instructions in the user guide first") + ChangelogItem(text: "Added Gaze / Touch control to curved display mode, this was uber challenging to make work across all curvatures, resolutions, sizes, etc.") + ChangelogItem(text: "Added Gaze Control cursor adjustment in settings. If the gaze control cursor is slightly off for you, use this to make minor adjustments") + ChangelogItem(text: "Added Gaze / Touch Control to Flat Display Mode.") + ChangelogItem(text: "Added Classic Display Mode for improved compatibility with keyboard and mouse input") + ChangelogItem(text: "Added keyboard support to Flat Display mode") + ChangelogItem(text: "Added 'Reactive V1, V2 and Starfield' lighting presets that dynamically adjust based on screen content") + ChangelogItem(text: "Added 5 new 360° environments") + ChangelogItem(text: "Added star distance toggle that appears when Starfield is enabled with 3 presets (Close, Medium, Far) to customize star proximity") + ChangelogItem(text: "Curvature and tilt angle settings now persist") + ChangelogItem(text: "Added option in settings to add command button to open Windows Task Manager") + ChangelogItem(text: "Added 3D SBS mode to Flat Display mode") + ChangelogItem(text: "Added long press to control mode button to lock screen input. Useful for eating or resting hands without cursor interference. Long press again to unlock") + ChangelogItem(text: "Added sound stage adjustment via long press on audio button. Cycle through Small, Medium, and Large sound stages when spatial audio is enabled") + ChangelogItem(text: "Added co-op mode button and reorganized main menu layout for improved accessibility and workflow") + ChangelogItem(text: "Added Gaze Control / Screen Adjust / Controller Mode toggle for curved display to easily switch between gaze/touch control, screen adjustment, and controller input. This was added to avoid conflict with screen interaction and the new gaze control. Controller mode must be enabled for gamepads connected directly to the Vision Pro Bluetooth to function") + ChangelogItem(text: "Added option to choose default control mode in settings") + ChangelogItem(text: "Added option to choose preferred cursor control method in settings (Gaze/Touch)") + ChangelogItem(text: "Changed Renderer name to Display Mode in settings") + ChangelogItem(text: "Added co-op mode external IP address help guide") + ChangelogItem(text: "Fixed PS5 controller rumble") + ChangelogItem(text: "Added custom resolution selection in dropdown") + ChangelogItem(text: "Added more screen resolutions and categorized them by aspect ratio") + ChangelogItem(text: "Added keyboard support to curved display mode. This requires the user to click an input bar below the screen to appear. Curved display keyboard solution had to be different due to the limitation of immersive mode and the lack of visibility of external elements") + ChangelogItem(text: "Updated user guide with co-op connection info") + ChangelogItem(text: "Fixed cursor jitter in curved display mode") + ChangelogItem(text: "Fixed memory leak and various bugs") + ChangelogItem(text: "Fixed keyboard focus stealing from other visionOS apps in flat display mode") + ChangelogItem(text: "Added optional battery meter for primary connected controller. Shows battery level and charging status in the top control bar") + ChangelogItem(text: "Added adjustable brightness for select lighting presets (marked with lightbulb icon). Long press to cycle brightness from dark to light") + ChangelogItem(text: "Added toggle in settings to remove rounded corners from stream display") + ChangelogItem(text: "Added Dark Mode in settings - dims control overlays for a more immersive viewing experience (Flat and Curved modes only)") + ChangelogItem(text: "Added Dynamic Controls Menu — optional collapsible top bar (toggle in Settings). Single center launcher expands to the full icon row") + ChangelogItem(text: "Performance optimizations across streaming and rendering for a smoother experience with improved FPS stability") + } + .padding(24) + .frame(maxWidth: .infinity, alignment: .leading) + .background(changelogReleaseCardBackground) + .shadow(color: .black.opacity(0.2), radius: 16, x: 0, y: 8) + } + .padding(.horizontal, 24) + } + + // Support the Developer Section + VStack(alignment: .leading, spacing: 16) { + Text("Support Me on Ko-fi") + .font(.headline) + .foregroundColor(.white.opacity(0.7)) + .padding(.horizontal, 24) + + VStack(alignment: .leading, spacing: 16) { + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 12) { + Image("kofi") + .resizable() + .scaledToFit() + .frame(width: 50, height: 50) + .cornerRadius(8) + + VStack(alignment: .leading, spacing: 4) { + Text("Enjoying the app?") + .font(.subheadline) + .fontWeight(.semibold) + .foregroundColor(.white) + } + } + + Text("Neo Moonlight is simply my vision of Moonlight on the Vision Pro. If this app has improved your experience and you'd like to leave a tip, it would be greatly appreciated.") + .font(.body) + .foregroundColor(.white.opacity(0.85)) + .fixedSize(horizontal: false, vertical: true) + + Link(destination: URL(string: "https://ko-fi.com/neovectorx")!) { + HStack(spacing: 10) { + Image(systemName: "heart.fill") + .font(.system(size: 16)) + Text("Support on Ko-fi") + .font(.system(size: 16, weight: .semibold)) + } + .foregroundColor(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 14) + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill( + LinearGradient( + colors: [ + Color(red: 0.7, green: 0.3, blue: 0.9), + Color(red: 0.85, green: 0.6, blue: 0.95) + ], + startPoint: .leading, + endPoint: .trailing + ) + ) + ) + .overlay( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .stroke( + LinearGradient( + colors: [.white.opacity(0.4), .white.opacity(0.1)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + .shadow(color: Color(red: 0.7, green: 0.3, blue: 0.9).opacity(0.4), radius: 12, x: 0, y: 6) + } + .buttonStyle(.plain) + .padding(.top, 4) + } } .padding(24) .background( ZStack { - // Depth shadow RoundedRectangle(cornerRadius: 20) .fill(Color.black.opacity(0.3)) .offset(y: 6) @@ -112,7 +223,7 @@ struct UpdatesView: View { Link("Moonlight visionOS Port", destination: URL(string: "https://github.com/RikuKunMS2/moonlight-ios-vision/tree/vision-testflight")!) .font(.body) - Text("This is a modified fork with enhanced visionOS gaming features and UI changes.") + Text("This is a modified fork of the original XrOS port by RikuKunMS2.") .font(.caption) .foregroundColor(.white.opacity(0.6)) .padding(.top, 4) @@ -148,6 +259,12 @@ struct UpdatesView: View { Text("• JFuellem - Controller crash fixes") .font(.caption) .foregroundColor(.white.opacity(0.7)) + Text("• linggan-ua - Black screen recovery fixes") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + Text("• Max T (ALVR Project) - AV1 Parser") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) } VStack(alignment: .leading, spacing: 8) { @@ -160,15 +277,25 @@ struct UpdatesView: View { .foregroundColor(.white.opacity(0.7)) } + VStack(alignment: .leading, spacing: 8) { + Text("Special Thanks") + .font(.subheadline) + .fontWeight(.semibold) + .foregroundColor(.white) + Text("• Samantha - Thank you for the countless hours of testing and dealing with me devoting nearly all of my time coding this app the past few months. 💜") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + } + VStack(alignment: .leading, spacing: 8) { Text("Testers") .font(.subheadline) .fontWeight(.semibold) .foregroundColor(.white) - Text("• skynet01 - Beta testing and feedback") + Text("• skynet01 - Beta testing, suggestions, and feedback") .font(.caption) .foregroundColor(.white.opacity(0.7)) - Text("• Delt31 - Beta testing and feedback") + Text("• Delt31 - Beta testing, suggestions, and feedback") .font(.caption) .foregroundColor(.white.opacity(0.7)) } @@ -221,114 +348,6 @@ struct UpdatesView: View { .padding(.horizontal, 24) } - // Support the Developer Section - VStack(alignment: .leading, spacing: 16) { - Text("Support the Developer") - .font(.headline) - .foregroundColor(.white.opacity(0.7)) - .padding(.horizontal, 24) - - VStack(alignment: .leading, spacing: 16) { - VStack(alignment: .leading, spacing: 12) { - HStack(spacing: 12) { - Image("kofi") - .resizable() - .scaledToFit() - .frame(width: 50, height: 50) - .cornerRadius(8) - - VStack(alignment: .leading, spacing: 4) { - Text("Support Neo Moonlight") - .font(.subheadline) - .fontWeight(.semibold) - .foregroundColor(.white) - } - } - - Text("I'm a one-person team trying to enhance the Moonlight gaming experience as much as possible. If you enjoy the app and would like to support me, any contribution is greatly appreciated!") - .font(.body) - .foregroundColor(.white.opacity(0.85)) - .fixedSize(horizontal: false, vertical: true) - - Link(destination: URL(string: "https://ko-fi.com/neovectorx")!) { - HStack(spacing: 10) { - Image(systemName: "heart.fill") - .font(.system(size: 16)) - Text("Support on Ko-fi") - .font(.system(size: 16, weight: .semibold)) - } - .foregroundColor(.white) - .frame(maxWidth: .infinity) - .padding(.vertical, 14) - .background( - RoundedRectangle(cornerRadius: 12, style: .continuous) - .fill( - LinearGradient( - colors: [ - Color(red: 0.7, green: 0.3, blue: 0.9), - Color(red: 0.85, green: 0.6, blue: 0.95) - ], - startPoint: .leading, - endPoint: .trailing - ) - ) - ) - .overlay( - RoundedRectangle(cornerRadius: 12, style: .continuous) - .stroke( - LinearGradient( - colors: [.white.opacity(0.4), .white.opacity(0.1)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ), - lineWidth: 1 - ) - ) - .shadow(color: Color(red: 0.7, green: 0.3, blue: 0.9).opacity(0.4), radius: 12, x: 0, y: 6) - } - .buttonStyle(.plain) - .padding(.top, 4) - } - } - .padding(24) - .background( - ZStack { - RoundedRectangle(cornerRadius: 20) - .fill(Color.black.opacity(0.3)) - .offset(y: 6) - .blur(radius: 12) - - // Main card - matching ComputerView blue background - RoundedRectangle(cornerRadius: 20) - .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.95)) - .overlay( - LinearGradient( - colors: [ - Color(red: 0.5, green: 0.7, blue: 1.0).opacity(0.14), - Color(red: 0.28, green: 0.46, blue: 0.88).opacity(0.10), - Color(red: 0.5, green: 0.7, blue: 1.0).opacity(0.06) - ], - startPoint: .topLeading, - endPoint: .bottomTrailing - ) - ) - .overlay( - RoundedRectangle(cornerRadius: 20) - .strokeBorder( - LinearGradient( - colors: [.white.opacity(0.15), .white.opacity(0.05)], - startPoint: .topLeading, - endPoint: .bottomTrailing - ), - lineWidth: 1 - ) - ) - } - ) - .shadow(color: .black.opacity(0.2), radius: 16, x: 0, y: 8) - .padding(.horizontal, 24) - } - // License Section VStack(alignment: .leading, spacing: 16) { Text("License") @@ -392,6 +411,29 @@ struct UpdatesView: View { .padding(.bottom, 24) } } + + /// Shared card chrome for changelog release sections (matches prior single-card styling). + private var changelogReleaseCardBackground: some View { + ZStack { + RoundedRectangle(cornerRadius: 20) + .fill(Color.black.opacity(0.3)) + .offset(y: 6) + .blur(radius: 12) + RoundedRectangle(cornerRadius: 20) + .fill(Color(red: 0.12, green: 0.18, blue: 0.37).opacity(0.92)) + .overlay( + RoundedRectangle(cornerRadius: 20) + .strokeBorder( + LinearGradient( + colors: [.white.opacity(0.2), .white.opacity(0.05)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ), + lineWidth: 1 + ) + ) + } + } } // MARK: - Helper Components diff --git a/Moonlight Vision/UserGuideView.swift b/Moonlight Vision/UserGuideView.swift index 2817136b8..723d48ece 100644 --- a/Moonlight Vision/UserGuideView.swift +++ b/Moonlight Vision/UserGuideView.swift @@ -212,6 +212,15 @@ struct UserGuideView: View { "Smoothest Video: Consistent frame display timing. Best for visually demanding games where stutter-free streaming is the priority" ] ) + + SpecialSettingCard( + icon: "mic.fill", + title: "Mic Streamer Compatibility Mode", + description: "Adds a mute button control in Curved Display immersive mode by integrating with Mic Streamer.", + details: [ + "Run Mic Streamer, start streaming the mic. Toggle Mic Streamer Compatibility Mode On and enjoy mic control while in Curved Display immersive mode." + ] + ) } } @@ -250,6 +259,19 @@ struct UserGuideView: View { ] ) + // Controller Mode + SpecialSettingCard( + icon: "gamecontroller.fill", + title: "Controller Mode (Curved Display Only)", + description: "Switch input handling to use physical game controllers in Curved Display mode.", + details: [ + "Three Input Modes: Toggle between Gaze Control, Screen Adjust, and Controller Mode", + "Controller Mode: When enabled, Bluetooth controllers connected to Vision Pro will function", + "Keyboard: Ensure the keyboard is disabled for controllers to properly function and avoid input conflicts", + "Not Needed in Standard Display: Physical controllers work automatically in Standard Display mode without toggling" + ] + ) + // Standard Display Features VStack(alignment: .leading, spacing: 12) { HStack(alignment: .top) { @@ -287,8 +309,8 @@ struct UserGuideView: View { VStack(alignment: .leading, spacing: 8) { InStreamFeature( icon: "paintpalette", - title: "Preset Color Grading", - description: "Cycle through Cinematic, Vivid, and Realistic visual presets" + title: "Preset Color Filters", + description: "Cycle through Cinematic, Vivid, and Realistic visual filters" ) InStreamFeature( icon: "moon.fill", @@ -370,13 +392,13 @@ struct UserGuideView: View { ) InStreamFeature( icon: "moon.fill", - title: "Advanced Dimming", - description: "Multiple dimming modes including reactive ambient lighting" + title: "Advanced Lighting", + description: "Multiple lighting modes including reactive ambient lighting" ) InStreamFeature( icon: "paintpalette", - title: "Preset Color Grading", - description: "Cycle through Cinematic, Vivid, and Realistic visual presets" + title: "Preset Color Filters", + description: "Cycle through Cinematic, Vivid, and Realistic visual filters" ) } } @@ -457,6 +479,13 @@ struct UserGuideView: View { detail: "Connect your controller via Bluetooth directly to the Apple Vision Pro for the lowest latency input." ) + PerformanceTip( + icon: "exclamationmark.triangle.fill", + iconColor: .red, + tip: "Controller Not Working in Curved Display?", + detail: "Enable Controller Mode in the control bar and ensure the keyboard is disabled. Standard Display mode doesn't require this toggle." + ) + PerformanceTip( icon: "wrench.and.screwdriver", iconColor: .orange, diff --git a/Moonlight Vision/Vision.entitlements b/Moonlight Vision/Vision.entitlements index 63f246736..551fd2b00 100644 --- a/Moonlight Vision/Vision.entitlements +++ b/Moonlight Vision/Vision.entitlements @@ -4,5 +4,7 @@ com.apple.developer.low-latency-streaming + com.apple.developer.group-session + diff --git a/Moonlight copy-Info.plist b/Moonlight copy-Info.plist index 9410b479b..b8edce8f8 100644 --- a/Moonlight copy-Info.plist +++ b/Moonlight copy-Info.plist @@ -47,6 +47,8 @@ GCSupportsControllerUserInteraction + NSSupportsGroupActivities + ITSAppUsesNonExemptEncryption LSApplicationCategoryType diff --git a/Moonlight iOS/ViewControllers/StreamFrameViewController.h b/Moonlight iOS/ViewControllers/StreamFrameViewController.h index f96811ff8..66300da1d 100644 --- a/Moonlight iOS/ViewControllers/StreamFrameViewController.h +++ b/Moonlight iOS/ViewControllers/StreamFrameViewController.h @@ -35,9 +35,22 @@ typedef void (^noargCallbackType)(void); -(void)updatePreferredDisplayMode:(BOOL)streamActive; - (void)stopStream; +- (void)restartStream; - (void)applyUIKitPreset:(int32_t)preset; +// visionOS: View-only mode - view is set up but stream is managed externally by Swift +- (void)setViewOnlyMode:(BOOL)viewOnly; +- (void)startStreamExternal; +- (void)stopStreamExternal; +- (BOOL)isStreamActive; + // Method to update HDR parameters - (void)updateRendererHDRParams:(float)brightness saturation:(float)saturation contrast:(float)contrast luminosity:(float)luminosity gamma:(float)gamma; +// Method to get stats overlay text +- (nullable NSString*)getStatsOverlayText; + +// Toggle the virtual keyboard and return YES if keyboard is now visible +- (BOOL)toggleKeyboard; + @end \ No newline at end of file diff --git a/Moonlight iOS/ViewControllers/StreamFrameViewController.m b/Moonlight iOS/ViewControllers/StreamFrameViewController.m index 8fdb4b32a..4457b54c7 100644 --- a/Moonlight iOS/ViewControllers/StreamFrameViewController.m +++ b/Moonlight iOS/ViewControllers/StreamFrameViewController.m @@ -56,6 +56,7 @@ @implementation StreamFrameViewController { BOOL _userIsInteracting; CGSize _keyboardSize; BOOL _stopStreamCalled; + BOOL _viewOnlyMode; // visionOS: view is set up but stream is managed externally id _metalRenderer; @@ -74,11 +75,9 @@ - (void)stopStream { Log(LOG_I, @"StreamFrameViewController: stopStream() called from SwiftUI."); - // Stop the stream manager (safe if already stopped) - if (_streamMan) { - [_streamMan stopStream]; - _streamMan = nil; - } + // Grab a local reference and clear the instance variable + StreamManager *sm = _streamMan; + _streamMan = nil; // Clean up Metal renderer completely (if active) - with exception handling if (_metalRenderer) { @@ -143,25 +142,146 @@ - (void)stopStream { // Reset display mode back to default [self updatePreferredDisplayMode:NO]; - // UI feedback and teardown signal - dispatch_async(dispatch_get_main_queue(), ^{ - [self->_spinner startAnimating]; - [self->_stageLabel setText:@"Disconnected"]; - [self->_stageLabel sizeToFit]; - self->_stageLabel.hidden = NO; - self->_tipLabel.hidden = NO; + // Create a block for the final UI feedback and teardown signal + dispatch_block_t postTeardown = ^{ + dispatch_async(dispatch_get_main_queue(), ^{ +#if !TARGET_OS_VISION + [self->_spinner startAnimating]; + [self->_stageLabel setText:@"Disconnected"]; + [self->_stageLabel sizeToFit]; + self->_stageLabel.hidden = NO; + self->_tipLabel.hidden = NO; +#endif - // Notify Swift that teardown is finished so reconnect can proceed safely - [[NSNotificationCenter defaultCenter] postNotificationName:StreamDidTeardownNotification object:self]; - }); + // Notify Swift that teardown is finished so reconnect can proceed safely + [[NSNotificationCenter defaultCenter] postNotificationName:StreamDidTeardownNotification object:self]; + }); + }; + + // Wait for the stream to fully stop before posting the teardown notification + if (sm) { + [sm stopStreamWithCompletion:postTeardown]; + } else { + postTeardown(); + } +#if !TARGET_OS_VISION // Ensure config is cleared so a stale config isn't reused accidentally + // On visionOS, we preserve config for restartStream() to use self.streamConfig = nil; +#endif Log(LOG_I, @"StreamFrameViewController: stopStream() completed"); } + +- (void)restartStream { + Log(LOG_I, @"StreamFrameViewController: restartStream() called"); + + // If stream is still running, stop it first (but keep config) + if (_streamMan) { + [_streamMan stopStreamWithCompletion:nil]; + _streamMan = nil; + } + + // Reset the stop flag so we can stop again later + _stopStreamCalled = NO; + + // Guard: need a valid config to restart + if (!self.streamConfig) { + Log(LOG_E, @"restartStream() failed: no streamConfig"); + return; + } + + // Recreate controller support + if (_controllerSupport) { + [_controllerSupport cleanup]; + } + _controllerSupport = [[ControllerSupport alloc] initWithConfig:self.streamConfig delegate:self]; + + // Recreate the stream manager (same as viewDidLoad) + _streamMan = [[StreamManager alloc] initWithConfig:self.streamConfig + rendererProvider:^id __strong { + return [[VideoDecoderRenderer alloc] initWithView:self->_streamView + callbacks:self + streamAspectRatio:(float)self.streamConfig.width / (float)self.streamConfig.height + useFramePacing:self.streamConfig.useFramePacing]; + } + connectionCallbacks:self]; + + NSOperationQueue* opQueue = [[NSOperationQueue alloc] init]; + [opQueue addOperation:_streamMan]; + + Log(LOG_I, @"StreamFrameViewController: restartStream() - stream restarted"); +} // --- END CHANGE --- +#pragma mark - visionOS External Stream Control + +- (void)setViewOnlyMode:(BOOL)viewOnly { + _viewOnlyMode = viewOnly; + Log(LOG_I, @"StreamFrameViewController: viewOnlyMode set to %@", viewOnly ? @"YES" : @"NO"); +} + +- (BOOL)isStreamActive { + return _streamMan != nil; +} + +- (void)startStreamExternal { + Log(LOG_I, @"StreamFrameViewController: startStreamExternal() called"); + + if (_streamMan) { + Log(LOG_W, @"startStreamExternal: stream already active, ignoring"); + return; + } + + if (!self.streamConfig) { + Log(LOG_E, @"startStreamExternal: no streamConfig"); + return; + } + + // Reset stop flag + _stopStreamCalled = NO; + + // Ensure controller support exists + if (!_controllerSupport) { + _controllerSupport = [[ControllerSupport alloc] initWithConfig:self.streamConfig delegate:self]; + } + + // Create and start the stream manager + _streamMan = [[StreamManager alloc] initWithConfig:self.streamConfig + rendererProvider:^id __strong { + return [[VideoDecoderRenderer alloc] initWithView:self->_streamView + callbacks:self + streamAspectRatio:(float)self.streamConfig.width / (float)self.streamConfig.height + useFramePacing:self.streamConfig.useFramePacing]; + } + connectionCallbacks:self]; + + NSOperationQueue* opQueue = [[NSOperationQueue alloc] init]; + [opQueue addOperation:_streamMan]; + + Log(LOG_I, @"StreamFrameViewController: startStreamExternal() - stream started"); +} + +- (void)stopStreamExternal { + Log(LOG_I, @"StreamFrameViewController: stopStreamExternal() called"); + + if (!_streamMan) { + Log(LOG_I, @"stopStreamExternal: no stream to stop"); + return; + } + + StreamManager* sm = _streamMan; + _streamMan = nil; + + [sm stopStreamWithCompletion:^{ + Log(LOG_I, @"StreamFrameViewController: stopStreamExternal() — LiStopConnection completed"); + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:StreamDidTeardownNotification object:nil]; + }); + }]; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @@ -194,6 +314,7 @@ - (void)viewDidLoad _settings = [[[DataManager alloc] init] getSettings]; +#if !TARGET_OS_VISION _spinner = [[UIActivityIndicatorView alloc] init]; [self.view addSubview:_spinner]; [_spinner setUserInteractionEnabled:NO]; @@ -218,6 +339,7 @@ - (void)viewDidLoad _stageLabel.translatesAutoresizingMaskIntoConstraints = NO; [_stageLabel.topAnchor constraintEqualToAnchor:_spinner.bottomAnchor constant:20.0].active = YES; [_stageLabel.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES; +#endif _controllerSupport = [[ControllerSupport alloc] initWithConfig:self.streamConfig delegate:self]; _inactivityTimer = nil; @@ -253,6 +375,7 @@ - (void)viewDidLoad [self.view addGestureRecognizer:_exitSwipeRecognizer]; #endif +#if !TARGET_OS_VISION _tipLabel = [[UILabel alloc] init]; [self.view addSubview:_tipLabel]; [_tipLabel setUserInteractionEnabled:NO]; @@ -269,10 +392,25 @@ - (void)viewDidLoad _tipLabel.translatesAutoresizingMaskIntoConstraints = NO; [_tipLabel.topAnchor constraintEqualToAnchor:_stageLabel.bottomAnchor constant:20.0].active = YES; [_tipLabel.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES; +#endif + +#if TARGET_OS_VISION + // visionOS: If view-only mode, skip stream creation - Swift will manage it + if (_viewOnlyMode) { + Log(LOG_I, @"StreamFrameViewController: view-only mode - skipping stream creation"); + // Still add the stream view to the hierarchy + [self.view addSubview:_streamView]; + return; + } +#endif _streamMan = [[StreamManager alloc] initWithConfig:self.streamConfig rendererProvider:^id __strong { - // Always use the Metal renderer on visionOS so presets affect all codecs + // Always use native VideoDecoderRenderer on visionOS for UIKit mode + // The Metal renderer is kept in the project but disabled for now due to quality issues + // It can be re-enabled later once the quality is sorted out + + /* DISABLED: Metal renderer for UIKit mode BOOL useMetal = NO; #if TARGET_OS_VISION useMetal = YES; @@ -301,7 +439,6 @@ - (void)viewDidLoad id renderer = (id)instance; self->_metalRenderer = renderer; - // Always apply current preset (0=Off, 1=Cinematic, 2=Vivid, 3=Realistic) for uniformity if (renderer) { [self applyUIKitPreset:self->_settings.uikitPreset]; } @@ -312,11 +449,12 @@ - (void)viewDidLoad } self->_metalRenderer = nil; #else - // Not building for visionOS: do not even reference the Swift renderer self->_metalRenderer = nil; #endif } + */ + // Always use native VideoDecoderRenderer for UIKit mode return [[VideoDecoderRenderer alloc] initWithView:self->_streamView callbacks:self streamAspectRatio:(float)self.streamConfig.width / (float)self.streamConfig.height @@ -438,6 +576,17 @@ - (void)updateStatsOverlay { }); } +- (NSString*)getStatsOverlayText { + return [_streamMan getStatsOverlayText]; +} + +- (BOOL)toggleKeyboard { + if (_streamView) { + return [_streamView toggleKeyboard]; + } + return NO; +} + - (void)updateOverlayText:(NSString*)text { if (_overlayView == nil) { _overlayView = [[UITextView alloc] init]; @@ -578,15 +727,18 @@ - (void)edgeSwiped { - (void) connectionStarted { Log(LOG_I, @"Connection started"); dispatch_async(dispatch_get_main_queue(), ^{ +#if !TARGET_OS_VISION // Leave the spinner spinning until it's obscured by // the first frame of video. self->_stageLabel.hidden = YES; self->_tipLabel.hidden = YES; +#endif [self->_streamView showOnScreenControls]; [self->_controllerSupport connectionEstablished]; +#if !TARGET_OS_VISION if (self->_settings.statsOverlay) { self->_statsUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self @@ -594,6 +746,7 @@ - (void) connectionStarted { userInfo:nil repeats:YES]; } +#endif if (self->_connectedCallback) { self->_connectedCallback(); @@ -697,6 +850,7 @@ - (void)connectionTerminated:(int)errorCode { - (void) stageStarting:(const char*)stageName { Log(LOG_I, @"Starting %s", stageName); +#if !TARGET_OS_VISION dispatch_async(dispatch_get_main_queue(), ^{ NSString* lowerCase = [NSString stringWithFormat:@"%s in progress...", stageName]; NSString* titleCase = [[[lowerCase substringToIndex:1] uppercaseString] stringByAppendingString:[lowerCase substringFromIndex:1]]; @@ -704,6 +858,7 @@ - (void) stageStarting:(const char*)stageName { [self->_stageLabel sizeToFit]; self->_stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self->_stageLabel.center.y); }); +#endif } - (void) stageComplete:(const char*)stageName { @@ -751,24 +906,26 @@ - (void) stageFailed:(const char*)stageName withError:(int)errorCode portTestFla - (void) launchFailed:(NSString*)message { Log(LOG_I, @"Launch failed: %@", message); - [UIApplication sharedApplication].idleTimerDisabled = NO; + dispatch_async(dispatch_get_main_queue(), ^{ + [UIApplication sharedApplication].idleTimerDisabled = NO; #if TARGET_OS_VISION - // Avoid alert presentation on visionOS; return to main and notify Swift - if (self->_disconnectedCallback) { - self->_disconnectedCallback(); - } - [self returnToMainFrame]; -#else - UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Connection Error" - message:message - preferredStyle:UIAlertControllerStyleAlert]; - [Utils addHelpOptionToDialog:alert]; - [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ + // Avoid alert presentation on visionOS; return to main and notify Swift + if (self->_disconnectedCallback) { + self->_disconnectedCallback(); + } [self returnToMainFrame]; - }]]; - [self presentViewController:alert animated:YES completion:nil]; +#else + UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Connection Error" + message:message + preferredStyle:UIAlertControllerStyleAlert]; + [Utils addHelpOptionToDialog:alert]; + [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ + [self returnToMainFrame]; + }]]; + [self presentViewController:alert animated:YES completion:nil]; #endif + }); } - (void)rumble:(unsigned short)controllerNumber lowFreqMotor:(unsigned short)lowFreqMotor highFreqMotor:(unsigned short)highFreqMotor { @@ -858,7 +1015,9 @@ - (void) setHdrMode:(bool)enabled { } - (void) videoContentShown { +#if !TARGET_OS_VISION [_spinner stopAnimating]; +#endif [self.view setBackgroundColor:[UIColor blackColor]]; // Notify Swift the first frame has been shown so window management can proceed safely diff --git a/Moonlight.xcodeproj/project.pbxproj b/Moonlight.xcodeproj/project.pbxproj index 4b313e894..a3ea1c752 100644 --- a/Moonlight.xcodeproj/project.pbxproj +++ b/Moonlight.xcodeproj/project.pbxproj @@ -58,7 +58,37 @@ B1EDB13C2D4D95BF00EB1839 /* StreamConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1EDB13B2D4D95BF00EB1839 /* StreamConfiguration.swift */; }; B1EDB13D2D4D95BF00EB1839 /* StreamConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1EDB13B2D4D95BF00EB1839 /* StreamConfiguration.swift */; }; B1EDB13E2D4D95BF00EB1839 /* StreamConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1EDB13B2D4D95BF00EB1839 /* StreamConfiguration.swift */; }; + DB03915B78904A008963F7AD /* ConnectionSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0C71A03C724E81996785B1 /* ConnectionSerializer.swift */; }; DC1F5A07206436B20037755F /* ConnectionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1F5A06206436B20037755F /* ConnectionHelper.m */; }; + DD1B2A212F4BABA0003DA4AF /* ControllerBatteryState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1B2A202F4BABA0003DA4AF /* ControllerBatteryState.swift */; }; + DD1B2A222F4BABA0003DA4AF /* BatteryIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1B2A1F2F4BABA0003DA4AF /* BatteryIndicatorView.swift */; }; + DD2563522F1A8FF7008F8B66 /* camo.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2563512F1A8FF7008F8B66 /* camo.jpg */; }; + DD2563542F1AEC82008F8B66 /* ParticleManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2563532F1AEC82008F8B66 /* ParticleManager.swift */; }; + DD2563562F1C1841008F8B66 /* nebula.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2563552F1C1841008F8B66 /* nebula.jpg */; }; + DD25654A2F1EA750008F8B66 /* street1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565482F1EA750008F8B66 /* street1.jpg */; }; + DD25654B2F1EA750008F8B66 /* cobblestone1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565432F1EA750008F8B66 /* cobblestone1.jpg */; }; + DD25654C2F1EA750008F8B66 /* temple1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565492F1EA750008F8B66 /* temple1.jpg */; }; + DD25654D2F1EA750008F8B66 /* nexus1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565442F1EA750008F8B66 /* nexus1.jpg */; }; + DD25654E2F1EA750008F8B66 /* outpost.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565452F1EA750008F8B66 /* outpost.jpg */; }; + DD25654F2F1EA750008F8B66 /* plant1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565462F1EA750008F8B66 /* plant1.jpg */; }; + DD2565502F1EA750008F8B66 /* santorini1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565472F1EA750008F8B66 /* santorini1.jpg */; }; + DD2565522F1EB13D008F8B66 /* terrace1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD2565512F1EB13D008F8B66 /* terrace1.jpg */; }; + DD273A8A2F01857000ED7528 /* ConditionalGlass.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD273A892F01857000ED7528 /* ConditionalGlass.swift */; }; + DD273A8C2F01858500ED7528 /* CenterPresetPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD273A8B2F01858500ED7528 /* CenterPresetPopup.swift */; }; + DD273AD02F01969F00ED7528 /* FloatingMicButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD273ACE2F01969F00ED7528 /* FloatingMicButton.swift */; }; + DD273AD12F01969F00ED7528 /* RemoteMicManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD273ACF2F01969F00ED7528 /* RemoteMicManager.swift */; }; + DD273CC52F030ED800ED7528 /* FlatDisplayStreamView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD273CC42F030ED800ED7528 /* FlatDisplayStreamView.swift */; }; + DD7DD6CF2F423FFE0010D797 /* DebugLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7DD6CE2F423FFE0010D797 /* DebugLogger.swift */; }; + DD8A1D702F101C0B00230746 /* MoonlightCoopActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1D6F2F101C0B00230746 /* MoonlightCoopActivity.swift */; }; + DD8A1D712F101C0B00230746 /* CoopSessionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1D6D2F101C0B00230746 /* CoopSessionCoordinator.swift */; }; + DD8A1D722F101C0B00230746 /* CoopSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1D6E2F101C0B00230746 /* CoopSetupView.swift */; }; + DD8A1F232F11ADF000230746 /* CoopJoinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1F222F11ADF000230746 /* CoopJoinView.swift */; }; + DD8A1F262F11ADF900230746 /* CoopModeSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1F252F11ADF900230746 /* CoopModeSelectionView.swift */; }; + DD8A1F272F11ADF900230746 /* CoopHostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1F242F11ADF900230746 /* CoopHostView.swift */; }; + DD8A1F292F14023C00230746 /* CoopConnectingPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1F282F14023C00230746 /* CoopConnectingPopup.swift */; }; + DD8A1FEE2F15EA7600230746 /* DimmingPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A1FED2F15EA7600230746 /* DimmingPickerView.swift */; }; + DD8A1FF02F15EAB300230746 /* Polar.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DD8A1FEF2F15EAB300230746 /* Polar.jpg */; }; + DD8A202F2F16CE8B00230746 /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8A202E2F16CE8B00230746 /* SplashView.swift */; }; DDA65F742EF5CAD100E58211 /* placeholderthumb.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA65F732EF5CAD100E58211 /* placeholderthumb.jpg */; }; DDA668AC2EF72AE200E58211 /* 17.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA668A12EF72AE200E58211 /* 17.jpg */; }; DDA668AD2EF72AE200E58211 /* 18.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA668A22EF72AE200E58211 /* 18.jpg */; }; @@ -86,7 +116,9 @@ DDA668C32EF72AE200E58211 /* 2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA668922EF72AE200E58211 /* 2.jpg */; }; DDA668C42EF72AE200E58211 /* 6.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA668962EF72AE200E58211 /* 6.jpg */; }; DDA668C52EF72AE200E58211 /* 26.jpg in Resources */ = {isa = PBXBuildFile; fileRef = DDA668AA2EF72AE200E58211 /* 26.jpg */; }; - DDAB46FA2ECE440A00590015 /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAB46F92ECE440A00590015 /* SplashView.swift */; }; + DDB7A94F2F08B6CB00F0DF39 /* DataCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB7A94E2F08B6CB00F0DF39 /* DataCatalog.swift */; }; + DDB7A9512F08BA2200F0DF39 /* ControlComponents+LongPress.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB7A9502F08BA2200F0DF39 /* ControlComponents+LongPress.swift */; }; + DDB7AB412F0DE4B800F0DF39 /* EnvironmentPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB7AB402F0DE4B800F0DF39 /* EnvironmentPickerView.swift */; }; DDCAEC3E2EC7B7CE0073A6C7 /* Moonlight copy-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DDCAEC3D2EC7B7CE0073A6C7 /* Moonlight copy-Info.plist */; }; DDD5894A2EC8FC6B00D56AA8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDD589492EC8FC6B00D56AA8 /* Assets.xcassets */; }; DDE4F1B52ED8C588002C2394 /* MainContentViewAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE4F1B42ED8C588002C2394 /* MainContentViewAttachment.swift */; }; @@ -111,6 +143,7 @@ E77582CD2D53F3EB00948545 /* Shaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = E77582CC2D53F3E500948545 /* Shaders.metal */; }; E77582CF2D54020700948545 /* CVMetalHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E77582CE2D54020300948545 /* CVMetalHelpers.swift */; }; E77582EB2D5550D500948545 /* AudioHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E77582EA2D5550D200948545 /* AudioHelpers.swift */; }; + E7C001002EFACA0100FACAA3 /* Reactive1ChromosphereReach.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7C001012EFACA0100FACAA3 /* Reactive1ChromosphereReach.swift */; }; F71801422B65483D00A9336B /* AppsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71801412B65483D00A9336B /* AppsView.swift */; }; F71801442B654D9100A9336B /* TemporaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71801432B654D9100A9336B /* TemporaryApp.swift */; }; F71801452B65583700A9336B /* TemporaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71801432B654D9100A9336B /* TemporaryApp.swift */; }; @@ -329,6 +362,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3A0C71A03C724E81996785B1 /* ConnectionSerializer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionSerializer.swift; sourceTree = ""; }; 3E4F94682DC2E2D6006CF0C1 /* ComputerViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComputerViewWrapper.swift; sourceTree = ""; }; 3E86FC1C2D4FFDED0016BB8E /* UpdatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatesView.swift; sourceTree = ""; }; 566E9D2B2770B23A00EF7BFE /* Moonlight v1.7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Moonlight v1.7.xcdatamodel"; sourceTree = ""; }; @@ -385,6 +419,35 @@ D4746EEA1CBC740C006FB401 /* Moonlight-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Moonlight-Bridging-Header.h"; path = "Input/Moonlight-Bridging-Header.h"; sourceTree = ""; }; DC1F5A05206436B10037755F /* ConnectionHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectionHelper.h; sourceTree = ""; }; DC1F5A06206436B20037755F /* ConnectionHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConnectionHelper.m; sourceTree = ""; }; + DD1B2A1F2F4BABA0003DA4AF /* BatteryIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryIndicatorView.swift; sourceTree = ""; }; + DD1B2A202F4BABA0003DA4AF /* ControllerBatteryState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControllerBatteryState.swift; sourceTree = ""; }; + DD2563512F1A8FF7008F8B66 /* camo.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = camo.jpg; sourceTree = ""; }; + DD2563532F1AEC82008F8B66 /* ParticleManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticleManager.swift; sourceTree = ""; }; + DD2563552F1C1841008F8B66 /* nebula.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = nebula.jpg; sourceTree = ""; }; + DD2565432F1EA750008F8B66 /* cobblestone1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = cobblestone1.jpg; sourceTree = ""; }; + DD2565442F1EA750008F8B66 /* nexus1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = nexus1.jpg; sourceTree = ""; }; + DD2565452F1EA750008F8B66 /* outpost.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = outpost.jpg; sourceTree = ""; }; + DD2565462F1EA750008F8B66 /* plant1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = plant1.jpg; sourceTree = ""; }; + DD2565472F1EA750008F8B66 /* santorini1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = santorini1.jpg; sourceTree = ""; }; + DD2565482F1EA750008F8B66 /* street1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = street1.jpg; sourceTree = ""; }; + DD2565492F1EA750008F8B66 /* temple1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = temple1.jpg; sourceTree = ""; }; + DD2565512F1EB13D008F8B66 /* terrace1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = terrace1.jpg; sourceTree = ""; }; + DD273A892F01857000ED7528 /* ConditionalGlass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalGlass.swift; sourceTree = ""; }; + DD273A8B2F01858500ED7528 /* CenterPresetPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterPresetPopup.swift; sourceTree = ""; }; + DD273ACE2F01969F00ED7528 /* FloatingMicButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingMicButton.swift; sourceTree = ""; }; + DD273ACF2F01969F00ED7528 /* RemoteMicManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteMicManager.swift; sourceTree = ""; }; + DD273CC42F030ED800ED7528 /* FlatDisplayStreamView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlatDisplayStreamView.swift; sourceTree = ""; }; + DD7DD6CE2F423FFE0010D797 /* DebugLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugLogger.swift; sourceTree = ""; }; + DD8A1D6D2F101C0B00230746 /* CoopSessionCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopSessionCoordinator.swift; sourceTree = ""; }; + DD8A1D6E2F101C0B00230746 /* CoopSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopSetupView.swift; sourceTree = ""; }; + DD8A1D6F2F101C0B00230746 /* MoonlightCoopActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoonlightCoopActivity.swift; sourceTree = ""; }; + DD8A1F222F11ADF000230746 /* CoopJoinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopJoinView.swift; sourceTree = ""; }; + DD8A1F242F11ADF900230746 /* CoopHostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopHostView.swift; sourceTree = ""; }; + DD8A1F252F11ADF900230746 /* CoopModeSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopModeSelectionView.swift; sourceTree = ""; }; + DD8A1F282F14023C00230746 /* CoopConnectingPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopConnectingPopup.swift; sourceTree = ""; }; + DD8A1FED2F15EA7600230746 /* DimmingPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DimmingPickerView.swift; sourceTree = ""; }; + DD8A1FEF2F15EAB300230746 /* Polar.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Polar.jpg; sourceTree = ""; }; + DD8A202E2F16CE8B00230746 /* SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashView.swift; sourceTree = ""; }; DDA65F732EF5CAD100E58211 /* placeholderthumb.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = placeholderthumb.jpg; sourceTree = ""; }; DDA668912EF72AE200E58211 /* 1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 1.jpg; sourceTree = ""; }; DDA668922EF72AE200E58211 /* 2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 2.jpg; sourceTree = ""; }; @@ -412,7 +475,9 @@ DDA668A82EF72AE200E58211 /* 24.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 24.jpg; sourceTree = ""; }; DDA668A92EF72AE200E58211 /* 25.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 25.jpg; sourceTree = ""; }; DDA668AA2EF72AE200E58211 /* 26.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 26.jpg; sourceTree = ""; }; - DDAB46F92ECE440A00590015 /* SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashView.swift; sourceTree = ""; }; + DDB7A94E2F08B6CB00F0DF39 /* DataCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataCatalog.swift; sourceTree = ""; }; + DDB7A9502F08BA2200F0DF39 /* ControlComponents+LongPress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ControlComponents+LongPress.swift"; sourceTree = ""; }; + DDB7AB402F0DE4B800F0DF39 /* EnvironmentPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvironmentPickerView.swift; sourceTree = ""; }; DDCAEC3D2EC7B7CE0073A6C7 /* Moonlight copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Moonlight copy-Info.plist"; sourceTree = ""; }; DDCAEC3F2EC814FF0073A6C7 /* Vision.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Vision.entitlements; sourceTree = ""; }; DDD589492EC8FC6B00D56AA8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -438,6 +503,7 @@ E77582CC2D53F3E500948545 /* Shaders.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = Shaders.metal; sourceTree = ""; }; E77582CE2D54020300948545 /* CVMetalHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CVMetalHelpers.swift; sourceTree = ""; }; E77582EA2D5550D200948545 /* AudioHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioHelpers.swift; sourceTree = ""; }; + E7C001012EFACA0100FACAA3 /* Reactive1ChromosphereReach.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reactive1ChromosphereReach.swift; sourceTree = ""; }; F71801412B65483D00A9336B /* AppsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppsView.swift; sourceTree = ""; }; F71801432B654D9100A9336B /* TemporaryApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemporaryApp.swift; sourceTree = ""; }; F71801492B655C1F00A9336B /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; @@ -754,6 +820,17 @@ DDA668A82EF72AE200E58211 /* 24.jpg */, DDA668A92EF72AE200E58211 /* 25.jpg */, DDA668AA2EF72AE200E58211 /* 26.jpg */, + DD8A1FEF2F15EAB300230746 /* Polar.jpg */, + DD2563512F1A8FF7008F8B66 /* camo.jpg */, + DD2563552F1C1841008F8B66 /* nebula.jpg */, + DD2565432F1EA750008F8B66 /* cobblestone1.jpg */, + DD2565442F1EA750008F8B66 /* nexus1.jpg */, + DD2565452F1EA750008F8B66 /* outpost.jpg */, + DD2565462F1EA750008F8B66 /* plant1.jpg */, + DD2565472F1EA750008F8B66 /* santorini1.jpg */, + DD2565482F1EA750008F8B66 /* street1.jpg */, + DD2565492F1EA750008F8B66 /* temple1.jpg */, + DD2565512F1EB13D008F8B66 /* terrace1.jpg */, ); path = 360; sourceTree = ""; @@ -783,6 +860,28 @@ F7A119592B5DE1AB001E8686 /* Moonlight Vision */ = { isa = PBXGroup; children = ( + DD1B2A1F2F4BABA0003DA4AF /* BatteryIndicatorView.swift */, + DD1B2A202F4BABA0003DA4AF /* ControllerBatteryState.swift */, + DD7DD6CE2F423FFE0010D797 /* DebugLogger.swift */, + DD2563532F1AEC82008F8B66 /* ParticleManager.swift */, + DD8A202E2F16CE8B00230746 /* SplashView.swift */, + DD8A1FED2F15EA7600230746 /* DimmingPickerView.swift */, + E7C001012EFACA0100FACAA3 /* Reactive1ChromosphereReach.swift */, + DD8A1F282F14023C00230746 /* CoopConnectingPopup.swift */, + DD8A1F242F11ADF900230746 /* CoopHostView.swift */, + DD8A1F252F11ADF900230746 /* CoopModeSelectionView.swift */, + DD8A1F222F11ADF000230746 /* CoopJoinView.swift */, + DD8A1D6D2F101C0B00230746 /* CoopSessionCoordinator.swift */, + DD8A1D6E2F101C0B00230746 /* CoopSetupView.swift */, + DD8A1D6F2F101C0B00230746 /* MoonlightCoopActivity.swift */, + DDB7AB402F0DE4B800F0DF39 /* EnvironmentPickerView.swift */, + DDB7A9502F08BA2200F0DF39 /* ControlComponents+LongPress.swift */, + DDB7A94E2F08B6CB00F0DF39 /* DataCatalog.swift */, + DD273CC42F030ED800ED7528 /* FlatDisplayStreamView.swift */, + DD273ACE2F01969F00ED7528 /* FloatingMicButton.swift */, + DD273ACF2F01969F00ED7528 /* RemoteMicManager.swift */, + DD273A892F01857000ED7528 /* ConditionalGlass.swift */, + DD273A8B2F01858500ED7528 /* CenterPresetPopup.swift */, DDF84F192EECBFCB00FACAA3 /* kofi.webp */, DDA668AB2EF72AE200E58211 /* 360 */, DDF84EB32EEB2D4D00FACAA3 /* Fredoka-Bold.ttf */, @@ -814,6 +913,7 @@ B1EDB1322D4D95A700EB1839 /* RealityKitStreamView.swift */, B1EDB1332D4D95A700EB1839 /* StreamControls.swift */, B1EDB1342D4D95A700EB1839 /* UIKitStreamView.swift */, + 3A0C71A03C724E81996785B1 /* ConnectionSerializer.swift */, F7A1195A2B5DE1E2001E8686 /* MoonlightVisionApp.swift */, 3E4F94682DC2E2D6006CF0C1 /* ComputerViewWrapper.swift */, F7A1195C2B5DE1FD001E8686 /* MainContentView.swift */, @@ -855,7 +955,6 @@ children = ( DDEDDEA52ED4A2F0008A337C /* UserGuideView.swift */, DDEDDE952ED3EE9F008A337C /* HDRControlPanel.swift */, - DDAB46F92ECE440A00590015 /* SplashView.swift */, DDD589492EC8FC6B00D56AA8 /* Assets.xcassets */, F7A119592B5DE1AB001E8686 /* Moonlight Vision */, F7A119072B5DDECC001E8686 /* Moonlight iOS */, @@ -1418,7 +1517,9 @@ DDA668B32EF72AE200E58211 /* 14.jpg in Resources */, DDA668B42EF72AE200E58211 /* 23.jpg in Resources */, DDA668B52EF72AE200E58211 /* 8.jpg in Resources */, + DD8A1FF02F15EAB300230746 /* Polar.jpg in Resources */, DDA668B62EF72AE200E58211 /* 10.jpg in Resources */, + DD2563562F1C1841008F8B66 /* nebula.jpg in Resources */, DDA668B72EF72AE200E58211 /* 3.jpg in Resources */, DDA668B82EF72AE200E58211 /* 4.jpg in Resources */, DDA668B92EF72AE200E58211 /* 25.jpg in Resources */, @@ -1428,7 +1529,15 @@ DDA668BD2EF72AE200E58211 /* 5.jpg in Resources */, DDA668BE2EF72AE200E58211 /* 16.jpg in Resources */, DDA668BF2EF72AE200E58211 /* 21.jpg in Resources */, + DD25654A2F1EA750008F8B66 /* street1.jpg in Resources */, + DD25654B2F1EA750008F8B66 /* cobblestone1.jpg in Resources */, + DD25654C2F1EA750008F8B66 /* temple1.jpg in Resources */, + DD25654D2F1EA750008F8B66 /* nexus1.jpg in Resources */, + DD25654E2F1EA750008F8B66 /* outpost.jpg in Resources */, + DD25654F2F1EA750008F8B66 /* plant1.jpg in Resources */, + DD2565502F1EA750008F8B66 /* santorini1.jpg in Resources */, DDA668C02EF72AE200E58211 /* 12.jpg in Resources */, + DD2565522F1EB13D008F8B66 /* terrace1.jpg in Resources */, DDA668C12EF72AE200E58211 /* 13.jpg in Resources */, DDA668C22EF72AE200E58211 /* 20.jpg in Resources */, DDA668C32EF72AE200E58211 /* 2.jpg in Resources */, @@ -1439,6 +1548,7 @@ DDF84EBA2EEB2D4D00FACAA3 /* Fredoka-Medium.ttf in Resources */, DDF84EBB2EEB2D4D00FACAA3 /* Fredoka-SemiBold.ttf in Resources */, DDF84EBC2EEB2D4D00FACAA3 /* Fredoka-Bold.ttf in Resources */, + DD2563522F1A8FF7008F8B66 /* camo.jpg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1476,6 +1586,8 @@ B19362F02D4ECDD6004F88FA /* NSData+Conversion.m in Sources */, F7A1190C2B5DDF73001E8686 /* Limelight.xcdatamodeld in Sources */, F7A1190D2B5DDF73001E8686 /* AbsoluteTouchHandler.m in Sources */, + DD8A1FEE2F15EA7600230746 /* DimmingPickerView.swift in Sources */, + E7C001002EFACA0100FACAA3 /* Reactive1ChromosphereReach.swift in Sources */, F7A1190E2B5DDF73001E8686 /* RelativeTouchHandler.m in Sources */, F7A1190F2B5DDF73001E8686 /* KeyboardSupport.m in Sources */, F7A119102B5DDF73001E8686 /* VideoDecoderRenderer.m in Sources */, @@ -1484,19 +1596,26 @@ F7A119132B5DDF73001E8686 /* Utils.m in Sources */, F7A119152B5DDF73001E8686 /* Connection.m in Sources */, E77582EB2D5550D500948545 /* AudioHelpers.swift in Sources */, + DB03915B78904A008963F7AD /* ConnectionSerializer.swift in Sources */, + DD8A202F2F16CE8B00230746 /* SplashView.swift in Sources */, + DD8A1F262F11ADF900230746 /* CoopModeSelectionView.swift in Sources */, + DD8A1F272F11ADF900230746 /* CoopHostView.swift in Sources */, DDF84E7A2EE3BE9000FACAA3 /* CurvedDisplayStreamView.swift in Sources */, F7A119162B5DDF73001E8686 /* AppAssetRetriever.m in Sources */, F7A119172B5DDF73001E8686 /* WakeOnLanManager.m in Sources */, B1EDB1352D4D95A700EB1839 /* StreamControls.swift in Sources */, B1EDB1362D4D95A700EB1839 /* DrawableVideoDecoder.swift in Sources */, 3E86FC1D2D4FFDF20016BB8E /* UpdatesView.swift in Sources */, - DDAB46FA2ECE440A00590015 /* SplashView.swift in Sources */, B1EDB1372D4D95A700EB1839 /* UIKitStreamView.swift in Sources */, B1EDB1382D4D95A700EB1839 /* RealityKitStreamView.swift in Sources */, B1EDB1392D4D95A700EB1839 /* ObservableConnectionManager.swift in Sources */, + DD273CC52F030ED800ED7528 /* FlatDisplayStreamView.swift in Sources */, + DDB7AB412F0DE4B800F0DF39 /* EnvironmentPickerView.swift in Sources */, + DD2563542F1AEC82008F8B66 /* ParticleManager.swift in Sources */, DDEDDEA62ED4A2F0008A337C /* UserGuideView.swift in Sources */, F7A119182B5DDF73001E8686 /* IdManager.m in Sources */, F7A119192B5DDF73001E8686 /* Controller.m in Sources */, + DD8A1F292F14023C00230746 /* CoopConnectingPopup.swift in Sources */, 3E4F94692DC2E2D6006CF0C1 /* ComputerViewWrapper.swift in Sources */, F71801562B658C0900A9336B /* StreamFrameViewController.m in Sources */, F7A1191A2B5DDF73001E8686 /* mkcert.c in Sources */, @@ -1510,7 +1629,11 @@ F7A119212B5DDF73001E8686 /* HttpManager.m in Sources */, DDE4F1C02ED91011002C2394 /* ColorGradingHelpers.swift in Sources */, F7A1195D2B5DE1FD001E8686 /* MainContentView.swift in Sources */, + DD8A1D702F101C0B00230746 /* MoonlightCoopActivity.swift in Sources */, + DD8A1D712F101C0B00230746 /* CoopSessionCoordinator.swift in Sources */, + DD8A1D722F101C0B00230746 /* CoopSetupView.swift in Sources */, F7A119222B5DDF73001E8686 /* MDNSManager.m in Sources */, + DDB7A94F2F08B6CB00F0DF39 /* DataCatalog.swift in Sources */, F7A11A232B5DF76F001E8686 /* AppDelegate.m in Sources */, DDF84E9C2EE8BABE00FACAA3 /* CurvedDisplayTutorialView.swift in Sources */, F7A119232B5DDF73001E8686 /* StreamView.m in Sources */, @@ -1524,6 +1647,8 @@ DDF84EA92EEA207E00FACAA3 /* AmbientLightEngine.swift in Sources */, F71801442B654D9100A9336B /* TemporaryApp.swift in Sources */, DDF84E9A2EE874EC00FACAA3 /* MetalVideoDecoderRenderer.swift in Sources */, + DD1B2A212F4BABA0003DA4AF /* ControllerBatteryState.swift in Sources */, + DD1B2A222F4BABA0003DA4AF /* BatteryIndicatorView.swift in Sources */, F7A1192D2B5DDF73001E8686 /* CryptoManager.m in Sources */, F7A1192E2B5DDF73001E8686 /* ConnectionHelper.m in Sources */, B1AC7CF12D4E011B0013B9A3 /* HDRParsingUtils.m in Sources */, @@ -1531,18 +1656,25 @@ F7A1192F2B5DDF73001E8686 /* PairManager.m in Sources */, F7A119302B5DDF73001E8686 /* HttpRequest.m in Sources */, F7A119312B5DDF73001E8686 /* OnScreenControls.m in Sources */, + DD273A8A2F01857000ED7528 /* ConditionalGlass.swift in Sources */, F7A119332B5DDF73001E8686 /* X1Kit.swift in Sources */, F7A119342B5DDF73001E8686 /* AppAssetManager.m in Sources */, F7A119352B5DDF73001E8686 /* DiscoveryWorker.m in Sources */, F7A119362B5DDF73001E8686 /* ControllerSupport.m in Sources */, F71801422B65483D00A9336B /* AppsView.swift in Sources */, F7199B002B72FC1400E6D62D /* TemporarySettings.swift in Sources */, + DD273AD02F01969F00ED7528 /* FloatingMicButton.swift in Sources */, + DD273AD12F01969F00ED7528 /* RemoteMicManager.swift in Sources */, + DD7DD6CF2F423FFE0010D797 /* DebugLogger.swift in Sources */, F7A119372B5DDF73001E8686 /* AppAssetResponse.m in Sources */, + DDB7A9512F08BA2200F0DF39 /* ControlComponents+LongPress.swift in Sources */, F7A119382B5DDF73001E8686 /* DataManager.m in Sources */, F7A1193A2B5DDF73001E8686 /* ServerInfoResponse.m in Sources */, F778956E2B65975900F02568 /* SDLMainWrapper.m in Sources */, + DD8A1F232F11ADF000230746 /* CoopJoinView.swift in Sources */, DDE4F1B52ED8C588002C2394 /* MainContentViewAttachment.swift in Sources */, F7A1193B2B5DDF73001E8686 /* StreamManager.m in Sources */, + DD273A8C2F01858500ED7528 /* CenterPresetPopup.swift in Sources */, F7A1193C2B5DDF73001E8686 /* KeyboardInputField.m in Sources */, F7A4A4D12B5F216C001591F3 /* MainViewModel.swift in Sources */, DDEDDE962ED3EE9F008A337C /* HDRControlPanel.swift in Sources */, @@ -1714,9 +1846,9 @@ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_ENTITLEMENTS[sdk=*]" = "Moonlight Vision/Vision.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 23; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = YJ7T2CX9YB; ENABLE_MODULE_VERIFIER = YES; @@ -1765,11 +1897,12 @@ "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS", "$(PROJECT_DIR)/libs/SDL2/lib/visionOS-Sim", ); - MARKETING_VERSION = 11.1; + MARKETING_VERSION = 12.1; OTHER_LDFLAGS = "-ld64"; PRODUCT_BUNDLE_IDENTIFIER = com.neovectorx.neomoonlight; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = xros; SKIP_INSTALL = NO; SUPPORTED_PLATFORMS = "xros xrsimulator"; @@ -1793,9 +1926,9 @@ CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; "CODE_SIGN_ENTITLEMENTS[sdk=*]" = "Moonlight Vision/Vision.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 23; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = YJ7T2CX9YB; ENABLE_MODULE_VERIFIER = YES; @@ -1844,11 +1977,12 @@ "$(PROJECT_DIR)/libs/FFmpeg/lib/iOS", "$(PROJECT_DIR)/libs/SDL2/lib/visionOS-Sim", ); - MARKETING_VERSION = 11.1; + MARKETING_VERSION = 12.1; OTHER_LDFLAGS = "-ld64"; PRODUCT_BUNDLE_IDENTIFIER = com.neovectorx.neomoonlight; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = xros; SKIP_INSTALL = NO; SUPPORTED_PLATFORMS = "xros xrsimulator"; diff --git a/NeoMoonlight-Banner3.png b/NeoMoonlight-Banner3.png new file mode 100644 index 000000000..dc1ade813 Binary files /dev/null and b/NeoMoonlight-Banner3.png differ diff --git a/README.md b/README.md index c7fcd793b..682af2110 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -![banner](https://github.com/NeoVectorX/NeoMoonlight/blob/vision-testflight/neomoonlight-banner1.jpg) -# Neo Moonlight (Vision Pro Fork) -[![License](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](https://github.com/NeoVectorX/NeoMoonlight/blob/vision-testflight/LICENSE.txt) -[![TestFlight](https://img.shields.io/badge/TestFlight-Join%20Beta-orange.svg)](INSERT_TESTFLIGHT_LINK_HERE) +![banner](https://github.com/NeoVectorX/NeoMoonlight/blob/main/NeoMoonlight-Banner3.png) + +# Neo Moonlight (Vision Pro XrOS Fork) + +[![License](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](https://github.com/NeoVectorX/NeoMoonlight/blob/vision-testflight/LICENSE.txt) [![TestFlight](https://img.shields.io/badge/TestFlight-Join%20Beta-orange.svg)](https://testflight.apple.com/join/maak7yCK) **Neo Moonlight** is a community‑fork of [RikuKunMS2's moonlight-ios-vision](https://github.com/RikuKunMS2/moonlight-ios-vision) and the original [Moonlight iOS](https://github.com/moonlight-stream/moonlight-ios) project, enhanced specifically for the Apple Vision Pro. @@ -10,14 +11,96 @@ - **Spatial Audio / Stereo Toggle** — Added a new top icon that lets you switch between spatial audio and stereo while gaming. - **Auto‑Hiding UI Icons** — Icons disappear automatically during streaming to maximize immersion. - **Rounded Corners** — Rounded corners to better fit visionOS design aesthetics. +- **Classic Display Mode** — Restored UIKit-based rendering as an alternative display mode for improved compatibility. - **Automatic Aspect Ratio** — Stream aspect ratio adjusts automatically. - **Mouse Cursor Toggle** — Added a toggle switch in settings to disable VisionOS cursor, eliminating duplicate cursors. -## 🎮 Getting Started -### Install via TestFlight -Click the link below to install the build on your Vision Pro: -[Join the Beta via TestFlight](INSERT_TESTFLIGHT_LINK_HERE) -> Note: You will need the TestFlight app installed on your Vision Pro. +## 🚀 Neo Moonlight v12.0 - Plato Edition +**Release Date:** February 2026 + +### 🌟 New Feature: SharePlay Co-op +* **Couch Co-op:** Added support for playing couch co-op games with a friend via SharePlay. + * *Note: Please read the co-op instructions in the User Guide first. Hiccups or bugs may occur as this is highly experimental.* + + +### 🕹️ Controls & Input +* **Gaze & Touch:** + * Added Gaze/Touch Control to both **Curved** and **Flat** Display modes. + * Added **Gaze Control Cursor Adjustment** in settings (for minor offset corrections). + * Added option to choose preferred cursor control method (Gaze vs. Touch). +* **Keyboard Support:** + * **Flat Mode:** Added full keyboard support. + * **Curved Mode:** Added keyboard support via an input bar located below the screen (required due to immersive mode limitations). +* **Controller Features:** + * Added PS5 controller vibration support. + * **New Toggle:** Added a "Gaze Control / Screen Move / Controller Mode" toggle for curved display. + * *Why?* To avoid conflicts between screen interaction and gaze control. **Note:** Controller mode must be enabled for Bluetooth gamepads to function. + +### 🖥️ Display & Immersion +* **Lighting & Environments:** + * Added **5 new 360° environments**. + * Added ability to **hide hands** in 360° environments. + * Added a Lighting Selection Menu. + * Added **'Reactive' Lighting Presets** (V1, V2, and Starfield) that dynamically adjust lighting based on screen content. +* **Flat Display Mode:** + * Added **3D SBS (Side-by-Side)** support. +* **Visual Tweaks:** + * Renamed "Renderer" to **Display Mode** in settings. + * Reorganized screen resolutions and categorized them by aspect ratio. + +### 🛠️ Quality of Life & Fixes +* **Main Menu:** Reorganized layout for improved accessibility and workflow. +* **Quick Resets:** Added long press (pinch hold) to Dimming, Tilt, and Environment icons to instantly reset to default. +* **Performance:** + * Fixed cursor jitter in curved display mode. + * Fixed a memory leak issue. + * Mic Streamer compatibility mode in settings. + * Various bug fixes. + + +--- + +## 📥 Getting Started + +### Install via TestFlight +Ready to test the latest features? Click the link below to install the build on your Vision Pro. + +[![Join Beta](https://img.shields.io/badge/TestFlight-Download_Now-black?style=for-the-badge&logo=apple)](https://testflight.apple.com/join/maak7yCK) + +--- + +## 🏆 Credits & Contributors + +Neo Moonlight builds upon the excellent work of the Moonlight streaming community. This project is a modified fork with enhanced visionOS gaming features and UI improvements. + +### Based On +* [Moonlight Game Streaming Project](https://moonlight-stream.org/) - The original open-source game streaming solution. +* [Moonlight iOS](https://github.com/moonlight-stream/moonlight-ios) - iOS/tvOS implementation. +* [Moonlight visionOS Port](https://github.com/RikuKunMS2/moonlight-ios-vision/tree/vision-testflight) - Initial visionOS adaptation. + +### Core Contributors + +#### Original Moonlight Team +* **cgutman** - Lead developer of Moonlight iOS +* **dwaxemberg**, **ascagnel**, and [many others](https://github.com/moonlight-stream/moonlight-ios/graphs/contributors) + +#### VisionOS Port & Foundation +* **RikuKunMS2** - Initial visionOS port and foundation work +* **tht7** - Curved screen feature implementation +* **shinyquagsire23** - Performance optimizations and bandwidth improvements +* **JFuellem** - Controller crash fixes +* **linggan-ua** - Various fixes, black screen resume fix + +### Special Thanks +* **skynet01** - Beta testing, suggestions, and valuable feedback. +* **Delt31** - Beta testing and feature suggestions. + +*And many others in the community who contributed through issues, testing, and feedback.* + +--- + +## 📄 License + +This project is licensed under the **GPL-3.0 License**, the same license as the original Moonlight project. This means the source code is freely available and can be modified and redistributed under the same terms. -### Build from Source -1. Clone this repository: \ No newline at end of file +[View License](https://github.com/NeoVectorX/NeoMoonlight/blob/v12.0-clean-history/LICENSE.txt) diff --git a/RealityKitStreamView.swift b/RealityKitStreamView.swift new file mode 100644 index 000000000..8674fb449 --- /dev/null +++ b/RealityKitStreamView.swift @@ -0,0 +1,1980 @@ +// +// RealityKitStreamView.swift +// Moonlight Vision +// +// Created by tht7 on 29/12/2024. +// Copyright © 2024 Moonlight Game Streaming Project. All rights reserved. +// + +import GameController +import RealityKit +import RealityKitContent +import SwiftUI +import simd + +let MAX_WIDTH_METERS: Float = 2 +// Limited to ~75 degrees (1.3 rad) to prevent distortion +let MAX_CURVE_ANGLE: Float = 1.3 +// Studio docking surface dimensions (meters) derived from CustomDockingRegion bounds +let STUDIO_DOCK_WIDTH_METERS: Float = 8.5 +let STUDIO_DOCK_HEIGHT_METERS: Float = 3.5416667 + +// MARK: - Delegate +@objc +class DummyControllerDelegate: NSObject, ControllerSupportDelegate { + func gamepadPresenceChanged() {} + func mousePresenceChanged() {} + func streamExitRequested() {} +} + +// MARK: - Wrapper View +struct RealityKitStreamView: View { + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + + @Binding var streamConfig: StreamConfiguration? + var needsHdr: Bool + var isImmersive: Bool + + var body: some View { + if streamConfig != nil { + _RealityKitStreamView( + streamConfig: Binding( + get: { streamConfig ?? StreamConfiguration() }, + set: { streamConfig = $0 } + ), + needsHdr: needsHdr, + isImmersive: isImmersive + ) { + // --- CLOSE ACTION --- + print("[RealityKitStreamView] Close Action Triggered.") + + // Reset immersion style before closing + ImmersionStyleManager.shared.currentStyle = .mixed + + // 1. Dismiss the current space/window + if isImmersive { + Task { await dismissImmersiveSpace() } + } else { + dismissWindow(id: "realitykitStreamingWindow") + } + + // 2. Clear config to trigger the 'else' block below + streamConfig = nil + } + } else { + // Cleanup View (Triggers when streamConfig becomes nil) + ProgressView().onAppear { + print("[RealityKitStreamView] Stream Ended. Cleaning up.") + + // Redundant safety dismissal + if isImmersive { + Task { await dismissImmersiveSpace() } + } else { + dismissWindow(id: "realitykitStreamingWindow") + } + } + } + } +} + +// MARK: - Main Logic View +struct _RealityKitStreamView: View { + @Environment(\.openWindow) private var openWindow + @Environment(\.dismissWindow) private var dismissWindow + @Environment(\.dismissImmersiveSpace) private var dismissImmersiveSpace + @Environment(\.scenePhase) private var scenePhase + @EnvironmentObject private var viewModel: MainViewModel + @EnvironmentObject private var controlState: StreamControlState + + @Binding var streamConfig: StreamConfiguration + var needsHdr: Bool + var isImmersive: Bool + let closeAction: () -> Void + + // UI State + @State private var showVirtualKeyboard = false + @State var curveMagnitudeMemory: Float = 0 + @State var curveAnimationMultiplier: Float = 1 + @State var controllerSupport: ControllerSupport? + + // Tracks when the texture instance has been replaced + @State private var textureId: UUID = UUID() + + // Interaction State + @State private var isInteractive: Bool = false + + // Controls State + @State private var isControlsVisible: Bool = true + @State private var controlsEntity: Entity? + + // Volumetric Position State + @State var height: Float = 0 + @State private var depthOffset: Float = 0.0 + @State private var yLimits: ClosedRange = -0.5...0.5 + @State private var zLimits: ClosedRange = -0.5...0.5 + + // Immersive Transform State + @State private var immersiveScale: Float = 1.8 + @State private var immersivePosition: SIMD3 = SIMD3(0, 1.5, -2.0) + @State private var startDragPosition: SIMD3? = nil + + // Immersion State + @State private var immersionAmount: Float = 0.0 + @State private var blackOutSphere: ModelEntity = ModelEntity() + + // HDR Settings (Thread Safe) + @State private var safeHDRSettings = ThreadSafeHDRSettings( + params: HDRParams(boost: 2.0, contrast: 1.0, saturation: 1.0, brightness: 0.0, pqExposure: 1.0, mode: 0) + ) + + @State var shouldClose: Bool = false + @State var hasPerformedTeardown = false + @State var needsResume = false + @State var didPerformFullClose = false + @State var animationTimer: Timer? + @State var _streamMan: StreamManager? + @ObservedObject var connectionCallbacks: ObservableConnectionManager = .init() + + @State var texture: TextureResource + @State var screen: ModelEntity = ModelEntity() + + // Environment Entity Tracking + @State var currentEnvEntity: Entity? + @State private var screenOriginalParent: Entity? + + @State var videoMode: VideoMode = .standard2D + @State private var surfaceMaterial: ShaderGraphMaterial? + + // Environment State + // Use @State to hold the reference, but we need to treat it carefully in closure contexts + // to avoid the dynamic member lookup on the wrapper. + @State private var immersiveEnvironment = ImmersiveEnvironment() + + // Track environment state separately for Picker binding + @State private var selectedEnvironmentState: EnvironmentStateType = .none + + // Environment preload for immersive mode + @State private var environmentPreloaded: Bool = false + + // Prevent rapid toggling of immersion style + @State private var isUpdatingImmersion: Bool = false + + // Pinning (Studio stage) state + @State private var isPinnedToStage: Bool = false + @State private var isPinningTransitioning: Bool = false + @State private var lastFreeformTransform: Transform? + @State private var pinnedStageScale: Float = 1.0 + @State private var wasInteractiveBeforePin: Bool = false + @State private var pinStartScale: Float = 1.0 + + var isSBSVideo: Bool { + let ratio = Float(streamConfig.width) / Float(streamConfig.height) + return abs(ratio - (32.0 / 9.0)) < 0.01 + } + + var aspectRatio: Float { + if videoMode == .sideBySide3D && isSBSVideo { + return Float(streamConfig.height) / Float(streamConfig.width / 2) + } else { + return Float(streamConfig.height) / Float(streamConfig.width) + } + } + + init(streamConfig: Binding, needsHdr: Bool, isImmersive: Bool, closeAction: @escaping () -> Void) { + self.closeAction = closeAction + self._streamConfig = streamConfig + self.needsHdr = needsHdr + self.isImmersive = isImmersive + self.controllerSupport = ControllerSupport(config: streamConfig.wrappedValue, delegate: DummyControllerDelegate()) + + // ADAPTIVE PIXEL FORMAT: Fixes Cyan screen on SDR and enables HDR on AV1/HEVC + let bytesPerPixel = needsHdr ? 8 : 4 + let data = Data.init(count: bytesPerPixel * Int(streamConfig.wrappedValue.width) * Int(streamConfig.wrappedValue.height)) + + self.texture = try! TextureResource( + dimensions: .dimensions(width: Int(streamConfig.wrappedValue.width), height: Int(streamConfig.wrappedValue.height)), + format: .raw(pixelFormat: needsHdr ? .rgba16Float : .bgra8Unorm_srgb), // Adaptive format + contents: .init( + mipmapLevels: [ + .mip(data: data, bytesPerRow: bytesPerPixel * Int(streamConfig.wrappedValue.width)), + ] + ) + ) + } + + // MARK: - Main Body + var body: some View { + // 1. Base Content Group + let baseContent = Group { + if viewModel.activelyStreaming { + activeStreamView + } else { + streamStoppedOverlay + } + } + + // 2. Apply Visual Modifiers + let visualContent = baseContent + .task { + await setupMaterial() + } + .ornament(visibility: connectionCallbacks.showAlert ? .visible : .hidden , attachmentAnchor: .scene(.bottomFront), contentAlignment: .bottom) { + errorOrnament + } + .modifier(VolumetricWindowControls(isImmersive: isImmersive, content: { controlsView })) + .persistentSystemOverlays(viewModel.streamSettings.dimPassthrough ? .hidden : .automatic) + .preferredSurroundingsEffect( + // Apply dimming effect when dimPassthrough is enabled, or use environment effect in immersive mode + viewModel.streamSettings.dimPassthrough + ? .systemDark + : (isImmersive && immersiveEnvironment.environmentStateHandler.activeState != .none + ? immersiveEnvironment.surroundingsEffect + : nil) + ) + .volumeBaseplateVisibility(viewModel.streamSettings.dimPassthrough ? .hidden : .automatic) + .supportedVolumeViewpoints(.front) + + func updateHDRParams() { + safeHDRSettings.value = HDRParams( + boost: viewModel.streamSettings.brightness, + contrast: viewModel.streamSettings.gamma, + saturation: viewModel.streamSettings.saturation, + brightness: 0.0, + pqExposure: 1.0, + mode: 0 + ) + } + + // 3. Apply Logic/Lifecycle Modifiers + let withHDRSync = visualContent + .onChange(of: viewModel.streamSettings.brightness) { _, _ in updateHDRParams() } + .onChange(of: viewModel.streamSettings.gamma) { _, _ in updateHDRParams() } + .onChange(of: viewModel.streamSettings.saturation) { _, _ in updateHDRParams() } + + // 4. Apply Lifecycle Modifiers + let withLifecycle = withHDRSync + .task { await handleImmersiveSetupTask() } + .onAppear { handleOnAppear() } + .onChange(of: shouldClose) { _, val in if val { triggerCloseSequence() } } + .onChange(of: scenePhase) { _, phase in handleScenePhaseChange(phase) } + + // 5. Apply Control State Sync (only needed in immersive mode) + return withLifecycle + .modifier(ControlStateSyncModifier( + isImmersive: isImmersive, + controlState: controlState, + immersiveScale: $immersiveScale, + immersivePosition: $immersivePosition, + immersionAmount: $immersionAmount, + isInteractive: $isInteractive, + selectedEnvironmentState: $selectedEnvironmentState, + isUpdatingImmersion: isUpdatingImmersion, + showVirtualKeyboard: showVirtualKeyboard, + videoMode: videoMode, + isPinnedToStage: isPinnedToStage, + isPinningTransitioning: isPinningTransitioning, + syncToLocal: syncControlStateToLocal, + syncFromLocal: syncLocalStateToControlState + )) + } + + // MARK: - Lifecycle Handlers + + private func handleImmersiveSetupTask() async { + if isImmersive { + immersiveEnvironment.clearEnvironment() + environmentPreloaded = false + selectedEnvironmentState = .none + + print("Preloading environment assets...") + immersiveEnvironment.loadEnvironment() + environmentPreloaded = true + + updateImmersionStyle(state: .none, semi: false, shouldLock: false) + } + } + + private func handleOnAppear() { + safeHDRSettings.value = HDRParams( + boost: viewModel.streamSettings.brightness, + contrast: viewModel.streamSettings.gamma, + saturation: viewModel.streamSettings.saturation, + brightness: 0.0, + pqExposure: 1.0, + mode: 0 + ) + + // Load saved settings before setting up state + loadRealityKitSettings() + + if isImmersive { + setupControlStateCallbacks() + // Sync loaded values to controlState + controlState.immersiveScale = immersiveScale + controlState.immersivePositionX = immersivePosition.x + controlState.immersivePositionY = immersivePosition.y + controlState.immersivePositionZ = immersivePosition.z + controlState.immersionAmount = immersionAmount + controlState.pinnedStageScale = pinnedStageScale + syncLocalStateToControlState() + } + + if !viewModel.activelyStreaming { + print("_RealityKitStreamView: Detected appearance without active stream state.") + openWindow(id: "mainView") + self.closeAction() + } else { + startStreamIfNeeded() + } + } + + // MARK: - Subviews + + @ViewBuilder + var activeStreamView: some View { + GeometryReader3D { proxy in + ZStack { + // 1. GLOBAL INPUT CAPTURE (NON-IMMERSIVE ONLY) + if !isImmersive, let support = controllerSupport { + RealityKitInputView( + streamConfig: streamConfig, + controllerSupport: support, + showKeyboard: $showVirtualKeyboard + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .opacity(0.01) + } + + // 2. The 3D Screen + makeRealityView(proxy: proxy) + + // 3. Keyboard Overlay + if showVirtualKeyboard { + virtualKeyboardOverlay + } + + // 4. Environment Loading Indicator (Immersive only, shown when entering quickly) + if isImmersive && immersiveEnvironment.isLoading { + environmentLoadingIndicator + } + } + } + } + + @ViewBuilder + func makeRealityView(proxy: GeometryProxy3D) -> some View { + RealityView { content, attachments in + setupRealityView(content: content, attachments: attachments) + } update: { content, attachments in + updateStreamEntity(content: content, attachments: attachments, proxy: proxy) + } attachments: { + // Control panel Attachment (freely movable) + Attachment(id: "controls") { + if isImmersive && controlState.isControlPanelVisible { + ImmersiveControlPanelView() + .environmentObject(viewModel) + .environmentObject(controlState) + } + } + + // Global Dock Attachment (independent of screen, fixed in front of user) + Attachment(id: "dock") { + if isImmersive { + ImmersiveDockView() + .environmentObject(controlState) + .environmentObject(viewModel) + } + } + + // INPUT ATTACHMENT (IMMERSIVE ONLY) + Attachment(id: "input_overlay") { + if isImmersive, let support = controllerSupport { + RealityKitInputView( + streamConfig: streamConfig, + controllerSupport: support, + showKeyboard: $showVirtualKeyboard + ) + .frame(width: 1920, height: 1920 / CGFloat(aspectRatio)) + .opacity(0.01) + } + } + } + // Gestures + .gesture(dragGesture) + .gesture(magnifyGesture) + } + + // MARK: - Logic Helpers + + func triggerCloseSequence() { + // Reset immersion style to mixed before closing + ImmersionStyleManager.shared.currentStyle = .mixed + viewModel.currentImmersionStyle = .mixed + + // Hide control panel + controlState.isControlPanelVisible = false + + openWindow(id: "mainView") + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.closeAction() + } + } + + // MARK: - Control State Sync + + func setupControlStateCallbacks() { + controlState.needsHdr = needsHdr + controlState.controllerSupport = controllerSupport + + controlState.closeAction = { [self] in + if streamConfig != nil { viewModel.savedStreamConfigForResume = streamConfig } + needsResume = false + hasPerformedTeardown = false + viewModel.activelyStreaming = false + _streamMan?.stopStream() + controllerSupport?.cleanup() + triggerCloseSequence() + } + + controlState.toggleKeyboardAction = { [self] in + showVirtualKeyboard.toggle() + } + + controlState.onEnvironmentChange = { [self] newState in + selectedEnvironmentState = newState + immersiveEnvironment.requestEnvironmentState(newState) + let needsLock = (selectedEnvironmentState == .none || newState == .none) + updateImmersionStyle(state: newState, semi: immersiveEnvironment.isSemiImmersionEnabled, shouldLock: needsLock) + if newState == .none && isPinnedToStage { + unpinStreamFromStage(animated: false) + } + } + + controlState.onSemiImmersionToggle = { [self] enabled in + immersiveEnvironment.isSemiImmersionEnabled = enabled + updateImmersionStyle(state: immersiveEnvironment.activeState, semi: enabled, shouldLock: true) + } + + controlState.onPinToggle = { [self] in + if isPinnedToStage { + unpinStreamFromStage(animated: true) + } else { + pinStreamToStage() + } + } + + controlState.saveSettings = { [self] in + // Sync local state to controlState before saving (for immersive mode) + if isImmersive { + syncLocalStateToControlState() + } + saveRealityKitSettings() + } + + controlState.toggle3DMode = { [self] in + if videoMode == .sideBySide3D { + videoMode = .standard2D + screen.model?.materials = [UnlitMaterial(texture: texture)] + } else { + videoMode = .sideBySide3D + if let mat = surfaceMaterial { + screen.model?.materials = [mat] + } + } + } + } + + func syncLocalStateToControlState() { + controlState.immersiveScale = immersiveScale + controlState.immersivePositionX = immersivePosition.x + controlState.immersivePositionY = immersivePosition.y + controlState.immersivePositionZ = immersivePosition.z + controlState.immersionAmount = immersionAmount + controlState.isInteractive = isInteractive + controlState.selectedEnvironmentState = selectedEnvironmentState + controlState.isSemiImmersionEnabled = immersiveEnvironment.isSemiImmersionEnabled + controlState.isUpdatingImmersion = isUpdatingImmersion + controlState.isKeyboardActive = showVirtualKeyboard + controlState.videoMode = videoMode + controlState.isPinnedToStage = isPinnedToStage + controlState.isPinningTransitioning = isPinningTransitioning + controlState.canPinToStage = immersiveEnvironment.dockingAnchor != nil + // Sync pinned scale and height (only when pinned, to avoid overwriting user adjustments) + if isPinnedToStage { + controlState.pinnedStageScale = pinnedStageScale + // Height value is only maintained in controlState, no reverse sync needed + } + } + + func syncControlStateToLocal() { + immersiveScale = controlState.immersiveScale + immersivePosition = SIMD3( + controlState.immersivePositionX, + controlState.immersivePositionY, + controlState.immersivePositionZ + ) + immersionAmount = controlState.immersionAmount + isInteractive = controlState.isInteractive + if selectedEnvironmentState != controlState.selectedEnvironmentState { + selectedEnvironmentState = controlState.selectedEnvironmentState + } + videoMode = controlState.videoMode + // Sync pinned scale value (only when pinned) + if isPinnedToStage && !isPinningTransitioning { + pinnedStageScale = controlState.pinnedStageScale + } + } + + func setupMaterial() async { + if surfaceMaterial == nil { + do { + var material = try await ShaderGraphMaterial(named: "/Root/SBSMaterial", from: "SBSMaterial.usda") + try material.setParameter(name: "texture", value: .textureResource(self.texture)) + self.surfaceMaterial = material + } catch { print("Material Error: \(error)") } + } + } + + func setupRealityView(content: RealityViewContent, attachments: RealityViewAttachments) { + let mesh = try! Self.generateCurvedPlane( + width: MAX_WIDTH_METERS, + aspectRatio: aspectRatio, + resolution: (100,100), + curveMagnitude: viewModel.streamSettings.realitykitRendererCurvature * curveAnimationMultiplier + ) + + let colDepth: Float = isImmersive ? 0.1 : 0.001 + let colBox = ShapeResource.generateBox(width: 2, height: 2 * aspectRatio, depth: colDepth) + .offsetBy(translation: .init(x: 0, y: -0.43, z: 0)) + + screen = ModelEntity(mesh: mesh, materials: []) + + if videoMode == .sideBySide3D, let material = surfaceMaterial { + screen.model?.materials = [material] + } else { + screen.model?.materials = [UnlitMaterial(texture: self.texture)] + } + + screen.collision = CollisionComponent(shapes: [colBox], mode: .colliding) + screen.components.set(InputTargetComponent()) + content.add(screen) + if screenOriginalParent == nil { + screenOriginalParent = screen.parent + } + + if isImmersive { + let sphereMesh = MeshResource.generateSphere(radius: 100) + let blackMaterial = UnlitMaterial(color: .black) + blackOutSphere = ModelEntity(mesh: sphereMesh, materials: [blackMaterial]) + blackOutSphere.scale = SIMD3(-1, 1, 1) + blackOutSphere.components.set(OpacityComponent(opacity: 0.0)) + content.add(blackOutSphere) + } + + // Global Dock - fixed below user's line of sight + if isImmersive, let dock = attachments.entity(for: "dock") { + content.add(dock) + // Fixed position in front and below user + dock.position = SIMD3(0, 0.6, -1.0) + } + + // Control panel - independent of screen, freely movable + if isImmersive, let controls = attachments.entity(for: "controls") { + self.controlsEntity = controls + content.add(controls) + // Initial position: in front and slightly below user + controls.position = SIMD3(0, 1.0, -1.3) + controls.components.set(InputTargetComponent()) + } + + if isImmersive, let inputEnt = attachments.entity(for: "input_overlay") { + screen.addChild(inputEnt) + inputEnt.position = [0, 0, 0.01] + } + } + + func updateStreamEntity(content: RealityViewContent, attachments: RealityViewAttachments, proxy: GeometryProxy3D) { + // CRITICAL: Ensure screen is in scene (handles re-entry after returning from main menu) + if screen.parent == nil && screen.model?.mesh != nil { + content.add(screen) + if screenOriginalParent == nil { + screenOriginalParent = screen.parent + } + print("🔄 Re-added screen entity to scene after re-entry") + } + + // Environment Management + if isImmersive { + let envRoot = immersiveEnvironment.rootEntity + let currentState = immersiveEnvironment.environmentStateHandler.activeState + + if let envRoot = envRoot { + let isInScene = envRoot.parent != nil + + if currentState != .none { + // Add environment only when not in None state + if !isInScene { + content.add(envRoot) + print("➕ Added environment entity to scene (state: \(currentState))") + } + // Ensure it's enabled + if !envRoot.isEnabled { + envRoot.isEnabled = true + print("Enabled environment entity") + } + } else { + // CRITICAL: Remove environment COMPLETELY when in None state for full passthrough + if isInScene { + content.remove(envRoot) + print("REMOVED environment entity from scene (state: None) - PASSTHROUGH ACTIVE") + } + // Ensure it's disabled + if envRoot.isEnabled { + envRoot.isEnabled = false + print("Disabled environment entity - PASSTHROUGH ACTIVE") + } + } + } else { + // Entity not loaded yet - this is normal on first frame + if currentState != .none { + // If we want an environment but it's not loaded, trigger load if not already loading + if !immersiveEnvironment.isLoading && !immersiveEnvironment.isLoaded { + print("Environment needed but not loaded, triggering load...") + immersiveEnvironment.loadEnvironment() + } + } + } + } + + let currentCurve = viewModel.streamSettings.realitykitRendererCurvature * curveAnimationMultiplier + + // Decide whether to increase mesh resolution when pinned based on settings + let baseResolution: UInt32 = 100 + let resolutionMultiplier: UInt32 + if isPinnedToStage && viewModel.streamSettings.realitykitHighResPinnedScreen { + // If high resolution setting is enabled, increase resolution based on scale (up to 2x, i.e., 200x200) + let scaleFactor = min(controlState.pinnedStageScale / 1.0, 2.0) + resolutionMultiplier = UInt32(max(1, min(2, Int(scaleFactor)))) + } else { + resolutionMultiplier = 1 + } + let meshResolution = (baseResolution * resolutionMultiplier, baseResolution * resolutionMultiplier) + + if let mesh = try? Self.generateCurvedPlane( + width: MAX_WIDTH_METERS, + aspectRatio: aspectRatio, + resolution: meshResolution, + curveMagnitude: currentCurve + ) { + try? screen.model!.mesh.replace(with: mesh.contents) + } + + let totalAngle = MAX_CURVE_ANGLE * currentCurve.clamped(to: 0...1) + let radius = totalAngle < 0.001 ? Float.infinity : (MAX_WIDTH_METERS / totalAngle) + let curveDepth = totalAngle < 0.001 ? 0 : radius * (1.0 - cos(totalAngle / 2.0)) + let zCorrection = -curveDepth + + if isImmersive { + if isPinnedToStage { + // When pinning transition is in progress, do NOT touch the transform at all. + // Let the move() animation handle everything. + if !isPinningTransitioning { + // Use adjustable scale and height values from controlState + // If screen is a child of anchor, need to update transform + if let anchor = immersiveEnvironment.dockingAnchor, screen.parent == anchor { + // Update transform's scale and translation + // Note: Screen is rotated -90 degrees (around X axis), so: + // - Local Y axis corresponds to world's forward/backward direction + // - Local Z axis corresponds to world's vertical direction (but reversed, down is positive) + var currentTransform = screen.transform + currentTransform.scale = SIMD3(repeating: controlState.pinnedStageScale) + // Update height: In rotated coordinate system, Z axis corresponds to vertical direction, need to negate + let forwardOffset: Float = 0.05 + currentTransform.translation = SIMD3(0, forwardOffset, -controlState.pinnedStageHeight) + screen.transform = currentTransform + } else { + // If not yet a child node, directly set scale + screen.scale = SIMD3(repeating: controlState.pinnedStageScale) + } + + // If scale value changed, update mesh resolution to maintain clarity + if abs(pinnedStageScale - controlState.pinnedStageScale) > 0.01 { + pinnedStageScale = controlState.pinnedStageScale + updateMeshResolutionForPinning() + } else { + pinnedStageScale = controlState.pinnedStageScale + } + } + // else: animation is running, hands off! + } else { + // Apply user-controlled transform only when not pinned + screen.scale = SIMD3(repeating: immersiveScale) + screen.position = immersivePosition + SIMD3(0, 0, zCorrection) + } + + // Immersion Amount Logic + // If using Custom Environment (Studio), 'immersionAmount' might control + // something else or be ignored in favor of the environment's own state. + // But if in Passthrough (None), we might want the black sphere for dimming. + + let isUsingCustomEnv = immersiveEnvironment.environmentStateHandler.activeState != .none + + if isUsingCustomEnv { + // In Studio mode, we don't use the black sphere for immersion + blackOutSphere.components.set(OpacityComponent(opacity: 0.0)) + } else { + // In Passthrough mode, use the sphere for simple dimming if desired + // Or if 'immersion' slider is used to dim passthrough. + blackOutSphere.components.set(OpacityComponent(opacity: immersionAmount)) + } + blackOutSphere.position = .zero + + if let inputEnt = attachments.entity(for: "input_overlay") { + let bounds = inputEnt.visualBounds(relativeTo: nil) + if bounds.extents.x > 0 { + let inputBuffer: Float = 1.15 + let scale = (MAX_WIDTH_METERS / bounds.extents.x) * inputBuffer + inputEnt.scale = SIMD3(scale, scale, 1) + } + } + } else { + let volSize = content.convert(proxy.frame(in: .local), from: .local, to: .scene).extents + let scaleFactor = volSize.x / 2.0 + screen.scale = SIMD3(repeating: scaleFactor) + updateWindowedLimits(volSize: volSize, scaleFactor: scaleFactor, curveDepth: curveDepth) + screen.position = SIMD3(0, height, depthOffset + zCorrection) + } + updateAttachments(attachments: attachments) + } + + func updateWindowedLimits(volSize: SIMD3, scaleFactor: Float, curveDepth: Float) { + Task { @MainActor in + let screenHalfHeight = (MAX_WIDTH_METERS * self.aspectRatio * scaleFactor) / 2 + let volHalfHeight = volSize.y / 2 + let safePadding: Float = 0.05 + + let maxY = max(0, volHalfHeight - screenHalfHeight - safePadding) + let newYLimits = -maxY...maxY + + let volHalfDepth = volSize.z / 2 + let maxZ = volHalfDepth - safePadding + let scaledCurveDepth = curveDepth * scaleFactor + let minZ = -volHalfDepth + scaledCurveDepth + safePadding + let safeMaxZ = max(minZ, maxZ) + let newZLimits = minZ...safeMaxZ + + if self.yLimits != newYLimits { + self.yLimits = newYLimits + if self.height < newYLimits.lowerBound { self.height = newYLimits.lowerBound } + else if self.height > newYLimits.upperBound { self.height = newYLimits.upperBound } + } + + if self.zLimits != newZLimits { + self.zLimits = newZLimits + if self.depthOffset < newZLimits.lowerBound { self.depthOffset = newZLimits.lowerBound } + else if self.depthOffset > newZLimits.upperBound { self.depthOffset = newZLimits.upperBound } + } + } + } + + func updateAttachments(attachments: RealityViewAttachments) { + // Attachments handled in RealityViewBuilder + } + + var dragGesture: some Gesture { + DragGesture() + .targetedToEntity(screen) + .onChanged { value in + guard isImmersive, !isInteractive else { return } + if startDragPosition == nil { startDragPosition = immersivePosition } + let translation = value.convert(value.translation3D, from: .local, to: .scene) + immersivePosition = startDragPosition! + SIMD3(translation.x, translation.y, translation.z) + } + .onEnded { _ in + startDragPosition = nil + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + } + + + var magnifyGesture: some Gesture { + MagnifyGesture() + .targetedToEntity(screen) + .onChanged { value in + guard isImmersive, !isInteractive else { return } + let newScale = immersiveScale * Float(value.magnification) + immersiveScale = min(max(newScale, 0.05), 10.0) + } + .onEnded { _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + } + + // MARK: - Stream Management + + private func startStreamIfNeeded() { + guard _streamMan == nil else { + needsResume = false + return + } + + dismissWindow(id: "mainView") + dismissWindow(id: "dummy") + + self.curveAnimationMultiplier = viewModel.streamSettings.realitykitRendererAnimateOpening ? 0 : 1 + didPerformFullClose = false + + self._streamMan = StreamManager( + config: self.streamConfig, + rendererProvider: { + DrawableVideoDecoder( + texture: self.texture, + callbacks: self.connectionCallbacks, + aspectRatio: Float(self.streamConfig.width) / Float(self.streamConfig.height), + useFramePacing: self.streamConfig.useFramePacing, + enableHDR: self.viewModel.streamSettings.enableHdr, + hdrSettingsProvider: { [safeHDRSettings] in + return safeHDRSettings.value + }, + callbackToRender: { texture, correctedResultion in + DispatchQueue.main.async { + if let correctedResultion = correctedResultion { + streamConfig.width = Int32(correctedResultion.0) + streamConfig.height = Int32(correctedResultion.1) + } + self.texture.replace(withDrawables: texture) + self.controllerSupport!.connectionEstablished() + if self.curveAnimationMultiplier == 0 { animateOpening() } + } + }) + }, + connectionCallbacks: self.connectionCallbacks + ) + let operationQueue = OperationQueue() + operationQueue.addOperation(_streamMan!) + needsResume = false + } + + private func pauseStreamForBackground() { + guard _streamMan != nil else { return } + stopStream(teardownCompletely: false) + } + + private func handleUserRequestedClose() { + stopStream(teardownCompletely: true) + DispatchQueue.main.async { + openWindow(id: "mainView") + } + } + + private func stopStream(teardownCompletely: Bool) { + _streamMan?.stopStream() + _streamMan = nil + controllerSupport?.cleanup() + + if teardownCompletely { + if didPerformFullClose { return } + didPerformFullClose = true + viewModel.activelyStreaming = false + needsResume = false + self.closeAction() + } else { + needsResume = true + } + } + + private func handleSceneDisappearance() { + guard !didPerformFullClose else { return } + guard !needsResume else { return } + handleUserRequestedClose() + } + + func handleScenePhaseChange(_ phase: ScenePhase) { + switch phase { + case .background: + guard !hasPerformedTeardown else { return } + guard !shouldClose else { return } + needsResume = true + hasPerformedTeardown = true + viewModel.activelyStreaming = false + _streamMan?.stopStream() + controllerSupport?.cleanup() + + case .active: + guard needsResume else { return } + guard !shouldClose else { return } + guard streamConfig != nil else { return } + + Task { + try? await Task.sleep(nanoseconds: 100_000_000) + await MainActor.run { + guard needsResume else { return } + guard !shouldClose else { return } + guard streamConfig != nil else { return } + + needsResume = false + hasPerformedTeardown = false + viewModel.activelyStreaming = true + startStreamIfNeeded() + } + } + default: + break + } + } + + func animateOpening() { + Task { + self.animationTimer = Timer.scheduledTimer(withTimeInterval: 0.04, repeats: true) { _ in + Task { @MainActor in + if self.curveAnimationMultiplier < 1 { + self.curveAnimationMultiplier = min(self.curveAnimationMultiplier + 0.01, 1) + } else { + self.animationTimer?.invalidate(); self.animationTimer = nil + } + } + } + self.animationTimer?.fire() + } + } + + private func loadRealityKitSettings() { + let defaults = UserDefaults.standard + if let savedHeight = defaults.object(forKey: "realitykitHeight") as? Float { height = savedHeight } + if let savedDepthOffset = defaults.object(forKey: "realitykitDepthOffset") as? Float { depthOffset = savedDepthOffset } + if let savedScale = defaults.object(forKey: "realitykitImmersiveScale") as? Float { immersiveScale = savedScale } + if let savedPosX = defaults.object(forKey: "realitykitImmersivePosX") as? Float, + let savedPosY = defaults.object(forKey: "realitykitImmersivePosY") as? Float, + let savedPosZ = defaults.object(forKey: "realitykitImmersivePosZ") as? Float { + immersivePosition = SIMD3(savedPosX, savedPosY, savedPosZ) + } + if let savedImmersion = defaults.object(forKey: "realitykitImmersionAmount") as? Float { immersionAmount = savedImmersion } + if let savedGamma = defaults.object(forKey: "realitykitGamma") as? Float { viewModel.streamSettings.gamma = savedGamma } + if let savedSat = defaults.object(forKey: "realitykitSaturation") as? Float { viewModel.streamSettings.saturation = savedSat } + // Load pinned screen settings + if let savedPinnedScale = defaults.object(forKey: "realitykitPinnedStageScale") as? Float { + pinnedStageScale = savedPinnedScale + controlState.pinnedStageScale = savedPinnedScale + } + if let savedPinnedHeight = defaults.object(forKey: "realitykitPinnedStageHeight") as? Float { + controlState.pinnedStageHeight = savedPinnedHeight + } + } + + private func saveRealityKitSettings() { + guard viewModel.streamSettings.rememberStreamSettings else { return } + let defaults = UserDefaults.standard + defaults.set(viewModel.streamSettings.gamma, forKey: "realitykitGamma") + defaults.set(viewModel.streamSettings.saturation, forKey: "realitykitSaturation") + defaults.set(height, forKey: "realitykitHeight") + defaults.set(depthOffset, forKey: "realitykitDepthOffset") + // Use controlState values for immersive mode, local values for non-immersive mode + if isImmersive { + defaults.set(controlState.immersiveScale, forKey: "realitykitImmersiveScale") + defaults.set(controlState.immersivePositionX, forKey: "realitykitImmersivePosX") + defaults.set(controlState.immersivePositionY, forKey: "realitykitImmersivePosY") + defaults.set(controlState.immersivePositionZ, forKey: "realitykitImmersivePosZ") + defaults.set(controlState.immersionAmount, forKey: "realitykitImmersionAmount") + } else { + defaults.set(immersiveScale, forKey: "realitykitImmersiveScale") + defaults.set(immersivePosition.x, forKey: "realitykitImmersivePosX") + defaults.set(immersivePosition.y, forKey: "realitykitImmersivePosY") + defaults.set(immersivePosition.z, forKey: "realitykitImmersivePosZ") + defaults.set(immersionAmount, forKey: "realitykitImmersionAmount") + } + // Save pinned screen settings + defaults.set(controlState.pinnedStageScale, forKey: "realitykitPinnedStageScale") + defaults.set(controlState.pinnedStageHeight, forKey: "realitykitPinnedStageHeight") + } + + // MARK: - View Components + + @ViewBuilder + var environmentLoadingIndicator: some View { + VStack(spacing: 16) { + ProgressView() + .scaleEffect(1.5) + Text(viewModel.localized("loading_environment") ?? "正在加载环境...") + .font(.headline) + .foregroundStyle(.secondary) + } + .padding(30) + .background(.regularMaterial) + .cornerRadius(20) + .glassBackgroundEffect() + } + + @ViewBuilder + var virtualKeyboardOverlay: some View { + VStack(spacing: 12) { + Image(systemName: "keyboard").font(.system(size: 40)) + Text(viewModel.localized("keyboard_active")).font(.headline) + Text(viewModel.localized("tap_video_to_type")).font(.caption).foregroundStyle(.secondary) + } + .padding(20) + .background(.regularMaterial) + .cornerRadius(16) + .allowsHitTesting(true) + .onTapGesture { + showVirtualKeyboard = true + } + .opacity(0.8) + } + + @ViewBuilder + var streamStoppedOverlay: some View { + ZStack { + RealityView { content in + let scaffoldMesh = MeshResource.generateBox(size: 2.0) + let material = UnlitMaterial(color: .clear) + let scaffoldEntity = ModelEntity(mesh: scaffoldMesh, materials: [material]) + scaffoldEntity.components.set(OpacityComponent(opacity: 0.0)) + content.add(scaffoldEntity) + } + .allowsHitTesting(false) + + VStack(spacing: 20) { + Image(systemName: "exclamationmark.triangle").font(.largeTitle) + Text(viewModel.localized("stream_stopped")).font(.title2) + Text(viewModel.localized("stream_stopped_message")).multilineTextAlignment(.center).padding(.horizontal) + Button { + viewModel.savedStreamConfigForResume = nil + triggerCloseSequence() + } label: { + Label(viewModel.localized("open_main_menu"), systemImage: "house.fill").frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .padding(.horizontal) + } + .frame(width: 600, height: 400) + .padding() + .glassBackgroundEffect() + } + } + + @ViewBuilder + var errorOrnament: some View { + VStack(alignment: .center) { + Image(systemName: "exclamationmark.triangle") + Text(viewModel.localized("stream_error")).font(.title) + Text(connectionCallbacks.errorMessage ?? viewModel.localized("unknown_error")) + Button(viewModel.localized("close")) { + viewModel.activelyStreaming = false + shouldClose.toggle() + } + } + .padding().glassBackgroundEffect() + } + + @ViewBuilder + var controlsView: some View { + StandardControlPanelView( + closeAction: { + if streamConfig != nil { viewModel.savedStreamConfigForResume = streamConfig } + needsResume = false + hasPerformedTeardown = false + viewModel.activelyStreaming = false + self._streamMan?.stopStream() + self.controllerSupport?.cleanup() + triggerCloseSequence() + }, + toggleKeyboardAction: { showVirtualKeyboard.toggle() }, + isKeyboardActive: showVirtualKeyboard, + depthOffset: $depthOffset, + height: $height, + zLimits: zLimits, + yLimits: yLimits, + needsHdr: needsHdr, + isRealityKit: true + ) + .environmentObject(viewModel) + } + + @ViewBuilder + var settingsControls: some View { + let labelWidth: CGFloat = 70 + let sliderWidth: CGFloat = 170 + + if needsHdr || viewModel.streamSettings.enableHdr { + HStack { + Text(viewModel.localized("boost")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + .help(viewModel.localized("boost_luminance")) + + Slider(value: $viewModel.streamSettings.brightness, in: 1.0...5.0, step: 0.1) + .frame(width: sliderWidth) + .onChange(of: viewModel.streamSettings.brightness) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.1f", viewModel.streamSettings.brightness)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + .padding(.vertical, 2) + + HStack { + Text(viewModel.localized("gamma")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + + Slider(value: $viewModel.streamSettings.gamma, in: 0.5...2.5, step: 0.05) + .frame(width: sliderWidth) + .onChange(of: viewModel.streamSettings.gamma) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.2f", viewModel.streamSettings.gamma)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + + HStack { + Text(viewModel.localized("saturation")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + + Slider(value: $viewModel.streamSettings.saturation, in: 0.0...2.0, step: 0.05) + .frame(width: sliderWidth) + .onChange(of: viewModel.streamSettings.saturation) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.2f", viewModel.streamSettings.saturation)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + Divider().padding(.vertical, 5) + } + + HStack { + Text(viewModel.localized("curvature")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + + Slider(value: $viewModel.streamSettings.realitykitRendererCurvature, in: 0 ... 1, step: 0.001) + .frame(width: sliderWidth) + .onChange(of: viewModel.streamSettings.realitykitRendererCurvature) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.2f", viewModel.streamSettings.realitykitRendererCurvature)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + + Button(action: { + if viewModel.streamSettings.realitykitRendererCurvature == 0 { + viewModel.streamSettings.realitykitRendererCurvature = curveMagnitudeMemory + } else { + curveMagnitudeMemory = viewModel.streamSettings.realitykitRendererCurvature + viewModel.streamSettings.realitykitRendererCurvature = 0 + } + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + }) { + Label(viewModel.localized("flatten"), systemImage: viewModel.streamSettings.realitykitRendererCurvature == 0 ? "light.panel" : "pano.fill") + .font(.caption) + } + .buttonStyle(.bordered).controlSize(.mini) + } + + if !isImmersive { + HStack { + Text(viewModel.localized("depth")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + + Slider(value: $depthOffset, in: zLimits) + .frame(width: sliderWidth) + .onChange(of: depthOffset) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.2f", depthOffset)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + + Button(action: { + depthOffset = 0.0 + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + }) { + Label(viewModel.localized("reset_depth"), systemImage: "arrow.counterclockwise").font(.caption) + } + .buttonStyle(.bordered).controlSize(.mini) + } + + HStack { + Text(viewModel.localized("height")) + .font(.caption).bold() + .frame(width: labelWidth, alignment: .leading) + + Slider(value: $height, in: yLimits) + .frame(width: sliderWidth) + .onChange(of: height) { _, _ in + if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } + } + Text(String(format: "%.2f", height)) + .font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + Spacer().frame(width: 40) + } + } else { + Divider().padding(.vertical, 5) + Text(viewModel.localized("spatial")).font(.caption).foregroundStyle(.secondary) + + VStack(spacing: 10) { + HStack { + Text("Environment") + .font(.caption).bold().frame(width: labelWidth, alignment: .leading) + + Picker("Environment", selection: $selectedEnvironmentState) { + Text("None").tag(EnvironmentStateType.none) + Text("Light").tag(EnvironmentStateType.light) + Text("Dark").tag(EnvironmentStateType.dark) + } + .pickerStyle(.segmented) + .frame(width: sliderWidth + 40) + .disabled(isUpdatingImmersion) + .onChange(of: selectedEnvironmentState) { oldValue, newValue in + print("Picker changed from \(oldValue) to \(newValue)") + immersiveEnvironment.requestEnvironmentState(newValue) + let needsLock = (oldValue == .none || newValue == .none) + updateImmersionStyle(state: newValue, semi: immersiveEnvironment.isSemiImmersionEnabled, shouldLock: needsLock) + if newValue == .none && isPinnedToStage { + unpinStreamFromStage(animated: false) + } + } + .onChange(of: immersiveEnvironment.environmentStateHandler.activeState) { oldValue, newValue in + // Sync Picker selection with actual environment state + if selectedEnvironmentState != newValue { + print("Syncing Picker selection to \(newValue)") + selectedEnvironmentState = newValue + let needsLock = (oldValue == .none || newValue == .none) + updateImmersionStyle(state: newValue, semi: immersiveEnvironment.isSemiImmersionEnabled, shouldLock: needsLock) + + if newValue == .none && isPinnedToStage { + unpinStreamFromStage(animated: false) + } + } + } + } + + // Semi-Immersion Toggle (Only visible in custom environments) + if immersiveEnvironment.environmentStateHandler.activeState != .none { + HStack { + Spacer().frame(width: labelWidth) + Toggle(isOn: Binding( + get: { immersiveEnvironment.isSemiImmersionEnabled }, + set: { + immersiveEnvironment.isSemiImmersionEnabled = $0 + updateImmersionStyle(state: immersiveEnvironment.activeState, semi: $0, shouldLock: true) + } + )) { + HStack { + Image(systemName: immersiveEnvironment.isSemiImmersionEnabled ? "digitalcrown.press.fill" : "circle.circle.fill") + Text(immersiveEnvironment.isSemiImmersionEnabled ? "半沉浸模式 (旋钮可用)" : "全沉浸模式") + } + .font(.caption) + } + .toggleStyle(.button) + .frame(width: sliderWidth + 40) + .help("开启后使用数码表冠调整沉浸度") + .disabled(isUpdatingImmersion) + Spacer() + } + + HStack { + Spacer().frame(width: labelWidth) + Button { + if isPinnedToStage { + unpinStreamFromStage(animated: true) + } else { + pinStreamToStage() + } + } label: { + Label( + isPinnedToStage ? "解除置顶" : "置顶到工作室屏幕", + systemImage: isPinnedToStage ? "arrow.down.right.and.arrow.up.left" : "pin.circle" + ) + .font(.caption) + } + .buttonStyle(.borderedProminent) + .controlSize(.mini) + .disabled(isPinningTransitioning || immersiveEnvironment.dockingAnchor == nil || immersiveEnvironment.environmentStateHandler.activeState == .none) + .help("将串流屏幕吸附到 Apple Studio 场景的大屏幕上") + Spacer() + } + } + } + + HStack { + Text(viewModel.localized("immersion")) + .font(.caption).bold().frame(width: labelWidth, alignment: .leading) + Slider(value: $immersionAmount, in: 0.0...1.0) + .frame(width: sliderWidth) + .onChange(of: immersionAmount) { _, _ in if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } } + Text(String(format: "%.0f%%", immersionAmount * 100)).font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + + HStack { + Text(viewModel.localized("scale")) + .font(.caption).bold().frame(width: labelWidth, alignment: .leading) + Slider(value: $immersiveScale, in: 0.5...6.0) + .frame(width: sliderWidth) + .onChange(of: immersiveScale) { _, _ in if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } } + .disabled(isPinnedToStage) + Text(String(format: "%.1fx", immersiveScale)).font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + + HStack { + Text(viewModel.localized("distance")) + .font(.caption).bold().frame(width: labelWidth, alignment: .leading) + Slider(value: Binding(get: { immersivePosition.z }, set: { immersivePosition.z = $0; if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } }), in: -10.0 ... -0.5).frame(width: sliderWidth) + .disabled(isPinnedToStage) + Text(String(format: "%.1fm", abs(immersivePosition.z))).font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + + HStack { + Text(viewModel.localized("height")) + .font(.caption).bold().frame(width: labelWidth, alignment: .leading) + Slider(value: Binding(get: { immersivePosition.y }, set: { immersivePosition.y = $0; if viewModel.streamSettings.rememberStreamSettings { saveRealityKitSettings() } }), in: 0.0 ... 5.0).frame(width: sliderWidth) + .disabled(isPinnedToStage) + Text(String(format: "%.1fm", immersivePosition.y)).font(.caption).monospacedDigit().frame(width: 35, alignment: .leading) + } + + Toggle(isOn: $isInteractive) { + Label(isInteractive ? viewModel.localized("screen_locked") : viewModel.localized("screen_unlocked"), systemImage: isInteractive ? "lock.fill" : "lock.open.fill") + } + .toggleStyle(.button) + .padding(.top, 5) + .disabled(isPinnedToStage) + } + + HStack { + Toggle(isOn: Binding(get: { videoMode == .sideBySide3D }, set: { val in + videoMode = val ? .sideBySide3D : .standard2D + if videoMode == .sideBySide3D { + screen.model?.materials = [surfaceMaterial!] + } else { + screen.model?.materials = [UnlitMaterial(texture: texture)] + } + })) { + Label(viewModel.localized("3d_mode"), systemImage: "cube.transparent") + }.toggleStyle(.button) + } + + Button(action: { }) { + Label(viewModel.localized("main_button"), systemImage: "gamecontroller.fill").frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .simultaneousGesture( + DragGesture(minimumDistance: 0) + .onChanged { _ in + if let controller = self.controllerSupport?.getOscController() { + self.controllerSupport?.setButtonFlag(controller, flags: 0x0400) + self.controllerSupport?.updateFinished(controller) + } + } + .onEnded { _ in + if let controller = self.controllerSupport?.getOscController() { + self.controllerSupport?.clearButtonFlag(controller, flags: 0x0400) + self.controllerSupport?.updateFinished(controller) + } + } + ) + } + + // MARK: - Immersion Control Helper + + private func updateImmersionStyle(state: EnvironmentStateType, semi: Bool, shouldLock: Bool = true) { + // Lock UI immediately if requested + if shouldLock { + isUpdatingImmersion = true + } + + Task { @MainActor in + if state == .none { + // In None state, we want passthrough mixed with content + viewModel.currentImmersionStyle = .mixed + ImmersionStyleManager.shared.currentStyle = .mixed + } else { + if semi { + // Semi-Immersion: Progressive allows Digital Crown to dial between passthrough and environment + viewModel.currentImmersionStyle = .progressive + ImmersionStyleManager.shared.currentStyle = .progressive + } else { + // Full-Immersion: Full means app controls it, Digital Crown usually disabled for immersion + viewModel.currentImmersionStyle = .full + ImmersionStyleManager.shared.currentStyle = .full + } + } + print("Updated Immersion Style to: \(viewModel.currentImmersionStyle) via Manager: \(ImmersionStyleManager.shared.currentStyle)") + + if shouldLock { + // Add delay to prevent rapid toggling which can break system transition + try? await Task.sleep(nanoseconds: 1_500_000_000) // 1.5 seconds + isUpdatingImmersion = false + } + } + } + + // MARK: - Studio Pinning Helpers + + private func stageAnchorLocalTransform() -> (anchor: Entity, transform: Transform)? { + guard immersiveEnvironment.environmentStateHandler.activeState != .none else { return nil } + guard let anchor = immersiveEnvironment.dockingAnchor else { return nil } + guard anchor.scene != nil else { return nil } + + let scale = stageScaleForCurrentStream() + let forwardOffset: Float = 0.05 + let pitchAdjustment = simd_quatf(angle: -.pi / 2, axis: SIMD3(1, 0, 0)) + let transform = Transform(scale: SIMD3(repeating: scale), + rotation: pitchAdjustment, + translation: SIMD3(0, 0, forwardOffset)) + return (anchor, transform) + } + + private func worldTransform(for anchor: Entity, applying localTransform: Transform) -> Transform { + let anchorMatrix = anchor.transformMatrix(relativeTo: nil) + let worldMatrix = anchorMatrix * localTransform.matrix + return Transform(matrix: worldMatrix) + } + + private func stageScaleForCurrentStream() -> Float { + let baseWidth = MAX_WIDTH_METERS + let baseHeight = max(0.001, baseWidth * aspectRatio) + let widthScale = STUDIO_DOCK_WIDTH_METERS / baseWidth + let heightScale = STUDIO_DOCK_HEIGHT_METERS / baseHeight + let stageScale = min(widthScale, heightScale) * 0.95 + return min(stageScale, 4.5) + } + + private func pinStreamToStage() { + guard isImmersive else { return } + guard !isPinnedToStage, !isPinningTransitioning else { return } + guard let (anchor, stageTransform) = stageAnchorLocalTransform() else { + print("Stage anchor unavailable, cannot pin screen") + return + } + guard screen.parent != nil else { + print("Screen entity not ready for pinning") + return + } + + lastFreeformTransform = Transform(matrix: screen.transformMatrix(relativeTo: nil)) + pinStartScale = screen.scale.x + wasInteractiveBeforePin = isInteractive + isInteractive = true + + // Use user-adjusted scale value, or default if not yet adjusted + let defaultScale = stageTransform.scale.x + let targetScale: Float + if controlState.pinnedStageScale == 1.0 || abs(controlState.pinnedStageScale - 1.0) < 0.01 { + // User hasn't adjusted yet, use default value + targetScale = defaultScale + controlState.pinnedStageScale = defaultScale + } else { + // Use previously adjusted value + targetScale = controlState.pinnedStageScale + } + pinnedStageScale = targetScale + + // Create transform using target scale and height values + // Note: Screen is rotated -90 degrees (around X axis), so: + // - Local Y axis corresponds to world's forward/backward direction + // - Local Z axis corresponds to world's vertical direction (but reversed, down is positive) + let forwardOffset: Float = 0.05 + let pitchAdjustment = simd_quatf(angle: -.pi / 2, axis: SIMD3(1, 0, 0)) + let customStageTransform = Transform( + scale: SIMD3(repeating: targetScale), + rotation: pitchAdjustment, + translation: SIMD3(0, forwardOffset, -controlState.pinnedStageHeight) + ) + + isPinnedToStage = true + isPinningTransitioning = true + + // Calculate world target with FULL scale (position + rotation + scale all animate together) + let worldTarget = worldTransform(for: anchor, applying: customStageTransform) + + // Single smooth animation: position, rotation, AND scale all interpolate together + // This replicates Apple's demo where the screen flies to the stage while growing + screen.move(to: worldTarget, relativeTo: nil, duration: 1.5, timingFunction: .easeInOut) + + Task { @MainActor in + try? await Task.sleep(nanoseconds: 1_550_000_000) + guard isPinnedToStage else { return } + // Attach to anchor after animation completes + screen.setParent(anchor, preservingWorldTransform: true) + screen.transform = customStageTransform + isPinningTransitioning = false + + // After pinning completes, increase mesh resolution to maintain clarity + updateMeshResolutionForPinning() + } + } + + // Update mesh resolution to maintain clarity when pinned (only when setting is enabled) + private func updateMeshResolutionForPinning() { + guard isPinnedToStage, !isPinningTransitioning else { return } + guard viewModel.streamSettings.realitykitHighResPinnedScreen else { return } // Check if setting is enabled + + let currentCurve = viewModel.streamSettings.realitykitRendererCurvature * curveAnimationMultiplier + let baseResolution: UInt32 = 100 + + // Increase resolution based on scale (up to 2x, i.e., 200x200) + // Larger scale requires higher resolution + let scaleFactor = min(controlState.pinnedStageScale / 1.0, 2.0) + let resolutionMultiplier = UInt32(max(1, min(2, Int(scaleFactor * 1.5)))) // 1.5x scale reaches 2x resolution + let meshResolution = (baseResolution * resolutionMultiplier, baseResolution * resolutionMultiplier) + + if let mesh = try? Self.generateCurvedPlane( + width: MAX_WIDTH_METERS, + aspectRatio: aspectRatio, + resolution: meshResolution, + curveMagnitude: currentCurve + ) { + try? screen.model?.mesh.replace(with: mesh.contents) + } + } + + private func unpinStreamFromStage(animated: Bool) { + guard isPinnedToStage else { return } + if isPinningTransitioning && animated { + return + } + + // When unpinning, restore original mesh resolution + Task { @MainActor in + let currentCurve = viewModel.streamSettings.realitykitRendererCurvature * curveAnimationMultiplier + if let mesh = try? Self.generateCurvedPlane( + width: MAX_WIDTH_METERS, + aspectRatio: aspectRatio, + resolution: (100, 100), // Restore original resolution + curveMagnitude: currentCurve + ) { + try? screen.model?.mesh.replace(with: mesh.contents) + } + } + + let targetTransform = lastFreeformTransform ?? Transform(matrix: screen.transformMatrix(relativeTo: nil)) + + let completeUnpin: @MainActor () -> Void = { + isPinnedToStage = false + isPinningTransitioning = false + isInteractive = wasInteractiveBeforePin + pinStartScale = immersiveScale + } + + isPinningTransitioning = true + + if let originalParent = screenOriginalParent { + screen.setParent(originalParent, preservingWorldTransform: true) + } else { + screen.setParent(nil, preservingWorldTransform: true) + } + + if animated { + screen.move(to: targetTransform, relativeTo: nil, duration: 1.0, timingFunction: .easeInOut) + Task { @MainActor in + try? await Task.sleep(nanoseconds: 1_300_000_000) + completeUnpin() + } + } else { + screen.transform = targetTransform + Task { @MainActor in + completeUnpin() + } + } + } + + static func generateCurvedPlane(width: Float, aspectRatio: Float, resolution: (UInt32, UInt32), curveMagnitude: Float) throws -> MeshResource { + var descr = MeshDescriptor(name: "curved_plane_smart") + let height = width * aspectRatio + if height.isNaN || height == 0 { print("🚨 [GenMesh] Calculated Height is INVALID") } + + let vertexCount = Int(resolution.0 * resolution.1) + let triangleCount = Int((resolution.0 - 1) * (resolution.1 - 1) * 2) + + var positions: [SIMD3] = .init(repeating: .zero, count: vertexCount) + var textureCoordinates: [SIMD2] = .init(repeating: .zero, count: vertexCount) + var indices: [UInt32] = .init(repeating: 0, count: triangleCount * 3) + + let totalAngle = MAX_CURVE_ANGLE * curveMagnitude.clamped(to: 0...1) + let isFlat = totalAngle < 0.0001 + let radius: Float = isFlat ? .infinity : (width / totalAngle) + + var vertexIndex = 0 + var indicesIndex = 0 + + for y_v in 0 ..< resolution.1 { + let v_geo = Float(y_v) / Float(resolution.1 - 1) + let yPosition = (0.5 - v_geo) * height + let v_tex = 1.0 - v_geo + + for x_v in 0 ..< resolution.0 { + let u = Float(x_v) / Float(resolution.0 - 1) + let xPosition: Float + let zPosition: Float + + if !isFlat { + let theta = (u - 0.5) * totalAngle + xPosition = radius * sin(theta) + zPosition = radius - (radius * cos(theta)) + } else { + xPosition = (u - 0.5) * width + zPosition = 0.0 + } + + positions[vertexIndex] = [xPosition, yPosition, zPosition] + textureCoordinates[vertexIndex] = [u, v_tex] + + if x_v < (resolution.0 - 1) && y_v < (resolution.1 - 1) { + let current = UInt32(vertexIndex) + let nextRow = current + resolution.0 + indices[indicesIndex...] = [current, nextRow, nextRow+1, current, nextRow+1, current+1] + indicesIndex += 6 + } + vertexIndex += 1 + } + } + descr.positions = MeshBuffer(positions) + descr.textureCoordinates = MeshBuffers.TextureCoordinates(textureCoordinates) + descr.primitives = .triangles(indices) + return try MeshResource.generate(from: [descr]) + } +} + +// Custom Modifier to conditionalize ornaments +struct VolumetricWindowControls: ViewModifier { + var isImmersive: Bool + @ViewBuilder var content: () -> ControlsContent + + @ViewBuilder + func body(content: Content) -> some View { + if !isImmersive { + content.ornament(attachmentAnchor: .scene(.bottomTrailingFront), contentAlignment: .bottomLeading) { + self.content() + } + } else { + content + } + } +} + +// MARK: - Control State Sync Modifier +struct ControlStateSyncModifier: ViewModifier { + let isImmersive: Bool + @ObservedObject var controlState: StreamControlState + + @Binding var immersiveScale: Float + @Binding var immersivePosition: SIMD3 + @Binding var immersionAmount: Float + @Binding var isInteractive: Bool + @Binding var selectedEnvironmentState: EnvironmentStateType + + let isUpdatingImmersion: Bool + let showVirtualKeyboard: Bool + let videoMode: VideoMode + let isPinnedToStage: Bool + let isPinningTransitioning: Bool + + let syncToLocal: () -> Void + let syncFromLocal: () -> Void + + func body(content: Content) -> some View { + // Group 1: Sync from controlState to local + let withControlStateSync = content + .onChange(of: controlState.immersiveScale) { _, _ in syncToLocal() } + .onChange(of: controlState.immersivePositionY) { _, _ in syncToLocal() } + .onChange(of: controlState.immersivePositionZ) { _, _ in syncToLocal() } + .onChange(of: controlState.immersionAmount) { _, _ in syncToLocal() } + .onChange(of: controlState.isInteractive) { _, _ in syncToLocal() } + .onChange(of: controlState.pinnedStageScale) { _, _ in syncToLocal() } + .onChange(of: controlState.pinnedStageHeight) { _, _ in syncToLocal() } // Listen for pinned height changes + + // Group 2: Environment state changes + let withEnvironmentSync = withControlStateSync + .onChange(of: controlState.selectedEnvironmentState) { _, newValue in + if selectedEnvironmentState != newValue { + controlState.onEnvironmentChange?(newValue) + } + } + + // Group 3: Sync from local to controlState + let withLocalSync = withEnvironmentSync + .onChange(of: immersiveScale) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: immersivePosition) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: immersionAmount) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: isInteractive) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: selectedEnvironmentState) { _, _ in if isImmersive { syncFromLocal() } } + + // Group 4: Other state sync + return withLocalSync + .onChange(of: isUpdatingImmersion) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: showVirtualKeyboard) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: videoMode) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: isPinnedToStage) { _, _ in if isImmersive { syncFromLocal() } } + .onChange(of: isPinningTransitioning) { _, _ in if isImmersive { syncFromLocal() } } + } +} + +extension Comparable { + func clamped(to limits: ClosedRange) -> Self { + return min(max(self, limits.lowerBound), limits.upperBound) + } +} + +class ThreadSafeHDRSettings: @unchecked Sendable { + private var params: HDRParams + private let lock = NSLock() + init(params: HDRParams) { self.params = params } + var value: HDRParams { + get { lock.lock(); defer { lock.unlock() }; return params } + set { lock.lock(); defer { lock.unlock() }; params = newValue } + } +} + +// MARK: - INTEGRATED INPUT CONTROLLER + +// --- C-Function Bridges (Manual Linking) --- +@_silgen_name("LiSendMouseButtonEvent") +func LiSendMouseButtonEvent(_ action: Int8, _ button: Int32) -> Int32 + +@_silgen_name("LiSendMousePositionEvent") +func LiSendMousePositionEvent(_ x: Int16, _ y: Int16, _ width: Int16, _ height: Int16) -> Int32 + +@_silgen_name("LiSendHighResScrollEvent") +func LiSendHighResScrollEvent(_ scrollAmount: Int16) -> Int32 + +@_silgen_name("LiSendHighResHScrollEvent") +func LiSendHighResHScrollEvent(_ scrollAmount: Int16) -> Int32 + +@_silgen_name("LiSendKeyboardEvent") +func LiSendKeyboardEvent(_ keyCode: Int16, _ keyAction: Int8, _ modifiers: Int8) -> Int32 + +@_silgen_name("LiSendUtf8TextEvent") +func LiSendUtf8TextEvent(_ text: UnsafePointer, _ length: UInt32) -> Int32 + +// --- Constants --- +private let BUTTON_ACTION_PRESS: Int8 = 0 +private let BUTTON_ACTION_RELEASE: Int8 = 1 +private let BUTTON_LEFT: Int32 = 1 +private let BUTTON_RIGHT: Int32 = 2 +private let KEY_ACTION_DOWN: Int8 = 0x03 +private let KEY_ACTION_UP: Int8 = 0x04 + +// --- SWIFTUI WRAPPER --- +struct RealityKitInputView: UIViewControllerRepresentable { + var streamConfig: StreamConfiguration + let controllerSupport: ControllerSupport + @Binding var showKeyboard: Bool + + func makeUIViewController(context: Context) -> RealityKitInputViewController { + let vc = RealityKitInputViewController() + vc.streamConfig = streamConfig + vc.controllerSupport = controllerSupport + vc.keyboardDismissHandler = { DispatchQueue.main.async {} } + return vc + } + + func updateUIViewController(_ vc: RealityKitInputViewController, context: Context) { + vc.streamConfig = streamConfig + if let overlay = vc.view as? RealityKitInputOverlay { + overlay.streamConfig = streamConfig + if overlay.showSoftwareKeyboard != showKeyboard { + overlay.showSoftwareKeyboard = showKeyboard + if showKeyboard { + DispatchQueue.main.async { overlay.becomeFirstResponder() } + } + } + } + } +} + +// --- VIEW CONTROLLER --- +class RealityKitInputViewController: UIViewController { + var streamConfig: StreamConfiguration? { + didSet { + if let overlay = view as? RealityKitInputOverlay { overlay.streamConfig = streamConfig } + } + } + var controllerSupport: ControllerSupport? + var keyboardDismissHandler: (() -> Void)? + + private lazy var inputOverlayView: RealityKitInputOverlay = { + let v = RealityKitInputOverlay() + v.parentController = self + return v + }() + + override func loadView() { self.view = inputOverlayView } + + override func viewDidLoad() { + super.viewDidLoad() + if let support = controllerSupport { + support.attachGCEventInteraction(to: self.view) + support.realityKitMode = true + support.realityKitMouseMovedHandler = { [weak self] (dx: Float, dy: Float) in + self?.inputOverlayView.handleRawMouseDelta(dx: dx, dy: dy) + } + support.realityKitKeyboardHandler = nil + } + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + if let support = controllerSupport { + for mouse in GCMouse.mice() { support.registerMouseCallbacks(mouse) } + } + if !self.inputOverlayView.becomeFirstResponder() { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + _ = self?.inputOverlayView.becomeFirstResponder() + } + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + if let support = controllerSupport { + support.realityKitMode = false + support.realityKitMouseMovedHandler = nil + support.realityKitKeyboardHandler = nil + } + } + + override var canBecomeFirstResponder: Bool { false } +} + +// --- OVERLAY VIEW --- +class RealityKitInputOverlay: UIView, UIKeyInput, UIPointerInteractionDelegate, UIGestureRecognizerDelegate { + weak var parentController: RealityKitInputViewController? + var streamConfig: StreamConfiguration? + var showSoftwareKeyboard: Bool = false { + didSet { + DispatchQueue.main.async { + if self.showSoftwareKeyboard && !self.isFirstResponder { self.becomeFirstResponder() } + self.reloadInputViews() + } + } + } + + override var inputView: UIView? { showSoftwareKeyboard ? nil : UIView() } + private var currentMousePosition: CGPoint = .zero + private var lastMouseButtonMask: UIEvent.ButtonMask = [] + private var lastScrollTranslation: CGPoint = .zero + private let wheelDelta: CGFloat = 120.0 + + override init(frame: CGRect) { super.init(frame: frame); setupInteraction() } + required init?(coder: NSCoder) { super.init(coder: coder); setupInteraction() } + + private func setupInteraction() { + self.backgroundColor = UIColor.black.withAlphaComponent(0.01) + self.isMultipleTouchEnabled = true + self.isUserInteractionEnabled = true + self.addInteraction(UIPointerInteraction(delegate: self)) + let panScroll = UIPanGestureRecognizer(target: self, action: #selector(handleScroll(_:))) + panScroll.allowedScrollTypesMask = .all + panScroll.delegate = self + self.addGestureRecognizer(panScroll) + self.addGestureRecognizer(UIHoverGestureRecognizer(target: self, action: #selector(handleHover(_:)))) + } + + override var canBecomeFocused: Bool { true } + override func resignFirstResponder() -> Bool { + let result = super.resignFirstResponder() + if result { parentController?.keyboardDismissHandler?() } + return result + } + + override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { + var handled = false + for press in presses { if KeyboardSupport.sendKeyEvent(for: press, down: true) { handled = true } } + if !handled { super.pressesBegan(presses, with: event) } + } + + override func pressesEnded(_ presses: Set, with event: UIPressesEvent?) { + var handled = false + for press in presses { if KeyboardSupport.sendKeyEvent(for: press, down: false) { handled = true } } + if !handled { super.pressesEnded(presses, with: event) } + } + + var hasText: Bool { true } + func insertText(_ text: String) { + if text.count == 1, let char = text.first { + let utf16 = String(char).utf16.first! + let keyEvent = KeyboardSupport.translateKeyEvent(utf16, with: []) + if keyEvent.keycode != 0 { sendLowLevelEvent(event: keyEvent); return } + } + let cString = text.cString(using: .utf8) + cString?.withUnsafeBufferPointer { ptr in if let base = ptr.baseAddress { LiSendUtf8TextEvent(base, UInt32(text.utf8.count)) } } + } + + func deleteBackward() { + LiSendKeyboardEvent(0x08, 0x03, 0) + usleep(50 * 1000) + LiSendKeyboardEvent(0x08, 0x04, 0) + } + + private func sendLowLevelEvent(event: KeyEvent) { + DispatchQueue.global(qos: .userInteractive).async { + if event.modifier != 0 { LiSendKeyboardEvent(Int16(event.modifierKeycode), 0x03, Int8(event.modifier)) } + LiSendKeyboardEvent(Int16(event.keycode), 0x03, Int8(event.modifier)) + usleep(50 * 1000) + LiSendKeyboardEvent(Int16(event.keycode), 0x04, Int8(event.modifier)) + if event.modifier != 0 { LiSendKeyboardEvent(Int16(event.modifierKeycode), 0x04, Int8(event.modifier)) } + } + } + + func handleRawMouseDelta(dx: Float, dy: Float) { + guard let config = streamConfig else { return } + let sensitivity: CGFloat = 1.0 + var newX = currentMousePosition.x + (CGFloat(dx) * sensitivity) + var newY = currentMousePosition.y - (CGFloat(dy) * sensitivity) + let width = CGFloat(config.width); let height = CGFloat(config.height) + newX = min(max(newX, 0), width); newY = min(max(newY, 0), height) + currentMousePosition = CGPoint(x: newX, y: newY) + LiSendMousePositionEvent(Int16(newX), Int16(newY), Int16(width), Int16(height)) + } + + func sendMouseButton(action: Int8, button: Int32) { LiSendMouseButtonEvent(action, button) } + + func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? { + if lastMouseButtonMask.isEmpty { updateCursorFromSystemPointer(location: request.location) } + return UIPointerRegion(rect: self.bounds) + } + + func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? { return nil } + + @objc private func handleHover(_ gesture: UIHoverGestureRecognizer) { + if lastMouseButtonMask.isEmpty { updateCursorFromSystemPointer(location: gesture.location(in: self)) } + } + + private func updateCursorFromSystemPointer(location: CGPoint) { + guard let config = streamConfig else { return } + let inputBuffer: CGFloat = 1.15 + let rawNormX = location.x / self.bounds.width + let rawNormY = location.y / self.bounds.height + let correctedNormX = (rawNormX - 0.5) * inputBuffer + 0.5 + let correctedNormY = (rawNormY - 0.5) * inputBuffer + 0.5 + var hostX = correctedNormX * CGFloat(config.width) + var hostY = correctedNormY * CGFloat(config.height) + hostX = min(max(hostX, 0), CGFloat(config.width)) + hostY = min(max(hostY, 0), CGFloat(config.height)) + currentMousePosition = CGPoint(x: hostX, y: hostY) + LiSendMousePositionEvent(Int16(hostX), Int16(hostY), Int16(config.width), Int16(config.height)) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + sendMouseButton(action: 0, button: 1) + if let touch = touches.first { updateCursorFromSystemPointer(location: touch.location(in: self)) } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + if let touch = touches.first { updateCursorFromSystemPointer(location: touch.location(in: self)) } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { sendMouseButton(action: 1, button: 1) } + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { sendMouseButton(action: 1, button: 1) } + + @objc private func handleScroll(_ gesture: UIPanGestureRecognizer) { + guard gesture.state == .changed || gesture.state == .began else { lastScrollTranslation = .zero; return } + let currentTranslation = gesture.translation(in: self) + let deltaY = (currentTranslation.y - lastScrollTranslation.y) + let deltaX = (currentTranslation.x - lastScrollTranslation.x) + if deltaY != 0 { LiSendHighResScrollEvent(Int16((deltaY / self.bounds.height) * wheelDelta * 20.0)) } + if deltaX != 0 { LiSendHighResHScrollEvent(Int16(-(deltaX / self.bounds.width) * wheelDelta * 20.0)) } + lastScrollTranslation = currentTranslation + } +} diff --git a/UserGuideView.swift b/UserGuideView.swift index 08e29e371..dbb8d7f3a 100644 --- a/UserGuideView.swift +++ b/UserGuideView.swift @@ -1,9 +1,8 @@ // // UserGuideView.swift -// Moonlight Vision +// Neo Moonlight // -// Created by NeoVectorX on 2/2/25. -// Copyright © 2025 Moonlight Game Streaming Project. All rights reserved. +// // import SwiftUI @@ -86,7 +85,7 @@ struct UserGuideView: View { SetupStep(number: 1, text: "Download & Install Sunshine or Apollo on your gaming PC", color: brandBlue) SetupStep(number: 2, text: "Access Web UI at https://localhost:47990", color: brandBlue) - SetupStep(number: 3, text: "Find your PC in Moonlight on AVP and enter the PIN shown to authorize", color: brandBlue) + SetupStep(number: 3, text: "Find your PC in Moonlight on AVP and enter the PIN shown to authorize. Important: If using Apollo, be sure to enable all permissions on the PIN page", color: brandBlue) } .padding() .background(Color.white.opacity(0.05)) @@ -96,7 +95,7 @@ struct UserGuideView: View { // Step 2: Optimal Settings GuideSection( - title: "Step 2: Optimal Moonlight Settings", + title: "Step 2: Recommended Moonlight Settings", icon: "slider.horizontal.3", iconColor: brandBlue ) { @@ -160,7 +159,7 @@ struct UserGuideView: View { VStack(alignment: .leading, spacing: 4) { Text("M5 Vision Pro Only: AV1 Codec") .font(.headline) - Text("AV1 offers slightly improved image quality and compression efficiency.") + Text("AV1 offers slightly improved image quality and higher compression efficiency.") .font(.caption) .foregroundColor(.secondary) } @@ -199,6 +198,384 @@ struct UserGuideView: View { "Smoothest Video: Consistent frame display timing. Best for visually demanding games where stutter-free streaming is the priority" ] ) + + SpecialSettingCard( + icon: "gamecontroller.fill", + iconColor: brandBlue, + title: "Input Mode Toggle (Curved Display)", + description: "Cycle through three input modes in Curved Display mode for different use cases.", + details: [ + "Three Input Modes: Toggle between Gaze Control, Screen Adjust, and Controller Mode", + "Controller Mode: When enabled, Bluetooth controllers connected to Vision Pro will function. Ensure keyboard is disabled to avoid conflict with controller input", + "Long Press to Lock: Long press the input mode button to disable hand/gaze input. Useful for eating or resting your hands without moving the cursor. Long press again to re-enable." + ] + ) + + SpecialSettingCard( + icon: "mic.fill", + iconColor: brandBlue, + title: "Mic Streamer Compatibility Mode", + description: "Adds a mute button in Curved Display immersive mode that connects to Mic Streamer.", + details: [ + "Run Mic Streamer and start streaming the mic. Toggle Mic Streamer Compatibility Mode On for mic control while in the Curved Display immersive mode" + ] + ) + } + } + + // Co-op Gameplay Section + GuideSection( + title: "Co-op Gameplay", + icon: "person.2.fill", + iconColor: brandBlue + ) { + VStack(alignment: .leading, spacing: 16) { + Text("Play together with a friend using SharePlay. One person hosts the session while the other joins as a guest with a second controller.") + .font(.subheadline) + .foregroundColor(.secondary) + .padding(.bottom, 4) + + // Host Instructions + VStack(alignment: .leading, spacing: 12) { + HStack(alignment: .top) { + Image(systemName: "person.crop.circle.badge.checkmark") + .foregroundColor(.orange) + .font(.title3) + VStack(alignment: .leading, spacing: 4) { + Text("Host Setup") + .font(.headline) + .foregroundColor(.white) + Text("The person who owns the gaming PC starts and manages the session.") + .font(.caption) + .foregroundColor(.white.opacity(0.6)) + } + } + .padding() + .background(Color.orange.opacity(0.15)) + .cornerRadius(10) + + // Network Configuration for Hosts + VStack(alignment: .leading, spacing: 16) { + // Connection Mode Selection + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "arrow.left.arrow.right.circle.fill") + .foregroundColor(brandBlue) + Text("Connection Mode") + .font(.subheadline) + .fontWeight(.semibold) + .foregroundColor(.white) + } + + Text("Choose your connection mode when hosting:") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.leading, 28) + + VStack(alignment: .leading, spacing: 8) { + HStack(alignment: .top, spacing: 8) { + Image(systemName: "house.fill") + .foregroundColor(.green) + .font(.caption) + .frame(width: 20) + VStack(alignment: .leading, spacing: 2) { + Text("Local Mode") + .font(.caption) + .fontWeight(.semibold) + .foregroundColor(.white) + Text("Both players on the same Wi-Fi network. No setup required.") + .font(.caption2) + .foregroundColor(.white.opacity(0.7)) + } + } + + HStack(alignment: .top, spacing: 8) { + Image(systemName: "globe") + .foregroundColor(.orange) + .font(.caption) + .frame(width: 20) + VStack(alignment: .leading, spacing: 2) { + Text("Online Mode") + .font(.caption) + .fontWeight(.semibold) + .foregroundColor(.white) + Text("Playing remotely over the internet. Requires port forwarding.") + .font(.caption2) + .foregroundColor(.white.opacity(0.7)) + } + } + } + .padding(.leading, 28) + } + + // Port Forwarding Requirements + VStack(alignment: .leading, spacing: 8) { + HStack(spacing: 6) { + Image(systemName: "exclamationmark.triangle.fill") + .foregroundColor(.red) + Text("Port Forwarding (Online Mode Only)") + .font(.subheadline) + .fontWeight(.semibold) + .foregroundColor(.white) + } + + Text("If using Online Mode, you MUST forward these ports on your router or the connection will fail:") + .font(.caption) + .foregroundColor(.white.opacity(0.8)) + .padding(.leading, 28) + + VStack(alignment: .leading, spacing: 6) { + HStack(spacing: 12) { + Text("TCP") + .font(.caption) + .fontWeight(.bold) + .foregroundColor(.orange) + .frame(width: 40, alignment: .leading) + + Text("47984-47990, 48000-48010") + .font(.caption) + .fontWeight(.medium) + .foregroundColor(.white) + } + + HStack(spacing: 12) { + Text("UDP") + .font(.caption) + .fontWeight(.bold) + .foregroundColor(.orange) + .frame(width: 40, alignment: .leading) + + Text("47998-48010") + .font(.caption) + .fontWeight(.medium) + .foregroundColor(.white) + } + } + .padding(10) + .background(Color.white.opacity(0.08)) + .cornerRadius(8) + .padding(.leading, 28) + + Text("Forward these ports to your gaming PC's local IP address in your router settings.") + .font(.caption2) + .foregroundColor(.white.opacity(0.7)) + .italic() + .padding(.leading, 28) + } + + // Security Note + VStack(alignment: .leading, spacing: 6) { + HStack(spacing: 6) { + Image(systemName: "info.circle.fill") + .foregroundColor(.cyan) + Text("Note on Port Forwarding") + .font(.caption) + .fontWeight(.semibold) + .foregroundColor(.white) + } + + Text("Opening ports allows external connections but makes your PC visible online. Only share your connection with people you trust. If you want a more secure alternative to opening ports, look at options for private VPN like Tailscale or ZeroTier.") + .font(.caption2) + .foregroundColor(.white.opacity(0.7)) + .padding(.leading, 28) + } + } + .padding() + .background(Color.white.opacity(0.05)) + .cornerRadius(12) + + VStack(alignment: .leading, spacing: 10) { + CoopStep(text: "Start a FaceTime call with your friend") + CoopStep(text: "In Neo Moonight settings, set Controller Mode to 'Single/Co-op'") + CoopStep(text: "Click the Co-op button on the main menu") + CoopStep(text: "Click 'Host Co-op Session'") + CoopStep(text: "Select your PC or App to stream. Important: Use Desktop or a physical monitor app. Apollo virtual displays are not supported for co-op.") + CoopStep(text: "Toggle between 'Local' or 'Online' mode") + CoopStep(text: "Click 'Start Co-op Session' - the session will launch for you, you'll hear an audio cue and a SharePlay Message will appear, select 'SharePlay', not 'SharePlay for Me'") + CoopStep(text: "Wait for your friend to join. If they're a new guest, you'll need to authorize the PIN that will appear for them. They will need to share the PIN with you to add them in Apollo or Sunshine. Important: Enable ALL permissions including controller for the guest client in Apollo settings, otherwise their gamepad won't work!") + CoopStep(text: "If using Curved Display mode, select Controller Mode to activate your gamepad") + } + .padding() + .background(Color.white.opacity(0.03)) + .cornerRadius(12) + } + + // Guest Instructions + VStack(alignment: .leading, spacing: 12) { + HStack(alignment: .top) { + Image(systemName: "person.crop.circle.badge.plus") + .foregroundColor(.pink) + .font(.title3) + VStack(alignment: .leading, spacing: 4) { + Text("Guest Setup") + .font(.headline) + .foregroundColor(.white) + Text("Join your friend's gaming session and play together.") + .font(.caption) + .foregroundColor(.white.opacity(0.6)) + } + } + .padding() + .background(Color.pink.opacity(0.15)) + .cornerRadius(10) + + VStack(alignment: .leading, spacing: 10) { + CoopStep(text: "Join the FaceTime call with the host") + CoopStep(text: "In Settings, set Controller Mode to 'Single/Co-op'") + CoopStep(text: "Wait for the host to launch their session - you'll hear a SharePlay audio cue") + CoopStep(text: "A SharePlay window will appear - click 'Open' to reveal the session") + CoopStep(text: "In Neo Moonlight, click the Co-op button on the main menu") + CoopStep(text: "Click 'Join Co-op Session' and select the available session") + CoopStep(text: "Click 'Join Session' - if you've connected before, the stream launches automatically") + CoopStep(text: "For first-time connections, you'll see a PIN - share it with the host") + CoopStep(text: "The host must enter your PIN in Sunshine/Apollo to authorize you") + CoopStep(text: "Once authorized, your stream will launch") + CoopStep(text: "If using Curved Display mode, select Controller Mode to activate your gamepad") + } + .padding() + .background(Color.white.opacity(0.03)) + .cornerRadius(12) + } + + // Important Notes + VStack(alignment: .leading, spacing: 12) { + Text("Important Co-op Notes:") + .font(.headline) + .foregroundColor(brandBlue) + .padding(.top, 8) + + QuickTip( + icon: "exclamationmark.triangle.fill", + iconColor: .yellow, + tip: "Experimental Feature", + detail: "Co-op mode is highly experimental. You may encounter bugs, connection issues, or unexpected behavior." + ) + + QuickTip( + icon: "person.2.fill", + iconColor: .blue, + tip: "Maximum Players", + detail: "Co-op sessions support a maximum of 2 players (1 host + 1 guest)." + ) + + QuickTip( + icon: "video.fill", + iconColor: .orange, + tip: "FaceTime Required", + detail: "Both players must be in an active FaceTime call for co-op to work. " + ) + + QuickTip( + icon: "gamecontroller.fill", + iconColor: .purple, + tip: "Controller Setup", + detail: "IMPORTANT: Connect your controller via Bluetooth BEFORE joining the co-op session to ensure correct player assignment (Player 1 for host, Player 2 for guest). Set Controller Mode to 'Single/Co-op' in Settings before starting. Once streaming in Curved Display mode, use the input mode toggle to select Controller Mode. Ensure keyboard is disabled to avoid conflicts." + ) + + QuickTip( + icon: "wifi", + iconColor: .green, + tip: "Network Performance", + detail: "For best results, both players should be on the same local network. Remote play over the internet is supported but may have higher latency, a strong connection is required. If experiencing connection issues or poor quality, try reducing the resolution (1080p or 1440p recommended for remote play) and lowering the bitrate." + ) + + QuickTip( + icon: "slider.horizontal.3", + iconColor: brandBlue, + tip: "Frame Rate", + detail: "Co-op sessions run at 90 FPS for compatibility with all Vision Pro models (M2 and M5). Solo streaming supports up to 120 FPS on M5 units." + ) + + QuickTip( + icon: "envelope.badge.fill", + iconColor: .orange, + tip: "Invite Button", + detail: "If your guest disconnects during the session, use the Invite button in the top control bar to re-invite them. The guest will receive a new SharePlay notification and can rejoin the same session without the host needing to restart." + ) + + QuickTip( + icon: "key.fill", + iconColor: .cyan, + tip: "PIN Authorization", + detail: "First-time guests need PIN authorization. The guest receives a PIN that must be entered by the host in Sunshine/Apollo. Important: The host must also enable all permissions in Apollo for the guest client, otherwise their gamepad won't work." + ) + + QuickTip( + icon: "clock.fill", + iconColor: .yellow, + tip: "Connection Time", + detail: "The initial connection between host and guest can sometimes take a moment to establish, please be patient." + ) + + QuickTip( + icon: "shield.fill", + iconColor: .red, + tip: "Firewall Settings", + detail: "If the guest cannot connect in Online mode, ensure your PC's firewall (Windows Defender, antivirus software, etc.) allows Sunshine/Apollo through. Firewall blocking is a common connection issue." + ) + + VStack(alignment: .leading, spacing: 12) { + HStack(alignment: .top, spacing: 12) { + Image(systemName: "network") + .font(.title3) + .foregroundColor(.blue) + .frame(width: 24) + + VStack(alignment: .leading, spacing: 4) { + Text("Testing Port Forwarding") + .font(.subheadline) + .fontWeight(.semibold) + .foregroundColor(.white) + + VStack(alignment: .leading, spacing: 8) { + Text("After configuring port forwarding, test your ports to verify they're open. Ensure Sunshine is running first, then use a port checker tool:") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + + HStack(spacing: 12) { + Link(destination: URL(string: "https://canyouseeme.org")!) { + HStack(spacing: 6) { + Image(systemName: "arrow.up.right.square.fill") + .font(.caption) + Text("CanYouSeeMe.org") + .font(.caption) + .fontWeight(.medium) + } + .foregroundColor(brandBlue) + } + + Link(destination: URL(string: "https://portchecker.io")!) { + HStack(spacing: 6) { + Image(systemName: "arrow.up.right.square.fill") + .font(.caption) + Text("Portchecker.io") + .font(.caption) + .fontWeight(.medium) + } + .foregroundColor(brandBlue) + } + } + .padding(.top, 2) + + Text("Test key ports like 47984, 47990, 48010. If they report \"Open\" or \"Success,\" your port forwarding (both TCP and UDP) is configured correctly. \"Closed\" or \"Error\" means the ports are blocked by your router or firewall.") + .font(.caption) + .foregroundColor(.white.opacity(0.7)) + .padding(.top, 4) + } + } + } + } + + QuickTip( + icon: "person.crop.circle", + iconColor: .purple, + tip: "FaceTime Personas", + detail: "In Curved Display mode (immersive space) you won't see your friend's FaceTime persona . Only Flat Display mode shows personas during co-op sessions." + ) + } + .padding() + .background(Color.white.opacity(0.05)) + .cornerRadius(12) } } @@ -209,7 +586,7 @@ struct UserGuideView: View { iconColor: brandBlue ) { VStack(alignment: .leading, spacing: 16) { - Text("Once you're actively streaming, both Standard and Curved Display modes offer powerful controls and features:") + Text("Once you're actively streaming, both Flat and Curved Display modes offer powerful controls and features:") .font(.subheadline) .foregroundColor(.white.opacity(0.6)) .padding(.bottom, 4) @@ -221,10 +598,10 @@ struct UserGuideView: View { .foregroundColor(.blue) .font(.title3) VStack(alignment: .leading, spacing: 4) { - Text("Standard Display Features") + Text("Flat Display Features") .font(.headline) .foregroundColor(.white) - Text("Traditional windowed gaming with full system integration.") + Text("Traditional windowed gaming with full system integration and external app visibility.") .font(.caption) .foregroundColor(.white.opacity(0.6)) } @@ -241,7 +618,7 @@ struct UserGuideView: View { brandBlue: brandBlue ) InStreamFeature( - icon: "moon.fill", + icon: "lightbulb.fill", title: "Passthrough Dimming", description: "Reduce outside distractions with environment dimming", brandBlue: brandBlue @@ -252,6 +629,12 @@ struct UserGuideView: View { description: "Switch between Spatial Audio and Direct Stereo", brandBlue: brandBlue ) + InStreamFeature( + icon: "hand.point.up.left.fill", + title: "Touch Control", + description: "Trackpad-style hand dragging or physical mouse/trackpad support. Long press the control mode button to disable hand/gaze input when needed.", + brandBlue: brandBlue + ) } } @@ -283,14 +666,8 @@ struct UserGuideView: View { ) InStreamFeature( icon: "arrow.up.left.and.arrow.down.right", - title: "Pinch to Scale", - description: "Pinch with two fingers to resize the screen", - brandBlue: brandBlue - ) - InStreamFeature( - icon: "hand.point.up.left.fill", - title: "Screen AutoLock", - description: "The screen auto locks when the icons fade out. Click the icons to highlight them, then pinch-hold the screen to drag the screen to preferred position ", + title: "Screen Adjustment", + description: "Enable Screen Adjust Mode using the input mode toggle. Once enabled, pinch and drag to reposition the screen, or pinch with both fingers to change the scale.", brandBlue: brandBlue ) InStreamFeature( @@ -312,9 +689,15 @@ struct UserGuideView: View { brandBlue: brandBlue ) InStreamFeature( - icon: "moon.fill", - title: "Advanced Dimming", - description: "Multiple dimming modes", + icon: "lightbulb.fill", + title: "Advanced Lighting", + description: "Choose from various gradient presets, two reactive modes that dynamically respond to screen content, or the immersive Starfield effect.", + brandBlue: brandBlue + ) + InStreamFeature( + icon: "moon.stars.fill", + title: "Star Distance (Starfield)", + description: "When using Starfield lighting, adjust star proximity with three presets: Close (default), Medium, and Far. Ideal for preventing star clipping on scaled displays.", brandBlue: brandBlue ) InStreamFeature( @@ -337,14 +720,21 @@ struct UserGuideView: View { icon: "eye.slash.fill", iconColor: .orange, tip: "Curved Display Immersive Mode", - detail: "In Curved Display mode, other apps and system windows will not be visible. Switch to Standard Display if you need to multitask. " + detail: "In Curved Display mode, other apps and system windows will not be visible. Switch to Flat Display if you need to multitask. " ) QuickTip( icon: "mountain.2.fill", iconColor: .green, tip: "Apple Environments", - detail: "Choose an Apple environment first, launch Curved Display mode, then rotate the digital crown wheel to reveal the scenic backdrop." + detail: "Choose an Apple environment first, launch Curved Display mode, then rotate the digital crown to reveal the environment." + ) + + QuickTip( + icon: "lock.fill", + iconColor: .gray, + tip: "Disable Hand Input", + detail: "Long press the control mode button (Gaze/Touch Control) to disable hand and gaze input. This lets you eat, adjust your headset, or rest your hands without accidentally moving the cursor. Long press again to re-enable." ) } @@ -372,7 +762,7 @@ struct UserGuideView: View { icon: "wifi", iconColor: brandBlue, tip: "Wi-Fi Optimization", - detail: "Manually set your 5 GHz router channel to 149 (or 44). This eliminates rhythmic stuttering caused by Apple's AWDL protocol (AirDrop/Handoff)." + detail: "Manually set your router channel to 149 (or 44). This eliminates rhythmic stuttering caused by Apple's AWDL protocol (AirDrop/Handoff)." ) PerformanceTip( @@ -382,6 +772,13 @@ struct UserGuideView: View { detail: "Connect your controller via Bluetooth directly to your PC for the lowest latency input." ) + PerformanceTip( + icon: "exclamationmark.triangle.fill", + iconColor: .red, + tip: "Controller Not Working in Curved Display?", + detail: "Enable Controller Mode in the control bar and ensure the keyboard is disabled." + ) + PerformanceTip( icon: "wrench.and.screwdriver", iconColor: brandBlue, @@ -654,6 +1051,23 @@ struct QuickTip: View { } } +struct CoopStep: View { + let text: String + + var body: some View { + HStack(alignment: .top, spacing: 10) { + Image(systemName: "checkmark.circle.fill") + .font(.caption) + .foregroundColor(Color(red: 0.5, green: 0.7, blue: 1.0).opacity(0.7)) + .frame(width: 16) + + Text(text) + .font(.caption) + .foregroundColor(.white.opacity(0.85)) + } + } +} + #Preview { UserGuideView() } diff --git a/moonlight-common/moonlight-common-c/src/Connection.c b/moonlight-common/moonlight-common-c/src/Connection.c index acab3e2c5..ff0b9b487 100644 --- a/moonlight-common/moonlight-common-c/src/Connection.c +++ b/moonlight-common/moonlight-common-c/src/Connection.c @@ -526,4 +526,4 @@ int LiStartConnection(PSERVER_INFORMATION serverInfo, PSTREAM_CONFIGURATION stre const char* LiGetLaunchUrlQueryParameters() { return "&corever=0"; -} \ No newline at end of file +} diff --git a/original-repo-commits.txt b/original-repo-commits.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tree.json b/tree.json new file mode 100644 index 000000000..64c88647d --- /dev/null +++ b/tree.json @@ -0,0 +1,31170 @@ +{ + "sha": "e762aa61faf70716f2f6b71f81859b25a2d6db3d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e762aa61faf70716f2f6b71f81859b25a2d6db3d", + "tree": [ + { + "path": ".github", + "mode": "040000", + "type": "tree", + "sha": "c113124a55a0d192dd4f0d3f7896b43af857ffed", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c113124a55a0d192dd4f0d3f7896b43af857ffed" + }, + { + "path": ".github/ISSUE_TEMPLATE", + "mode": "040000", + "type": "tree", + "sha": "6d3b8d67ee2138a64f97c0d5fb46bf9db934429e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6d3b8d67ee2138a64f97c0d5fb46bf9db934429e" + }, + { + "path": ".github/ISSUE_TEMPLATE/bug_report.md", + "mode": "100644", + "type": "blob", + "sha": "fb0e827f31354bdcc7f2d847bc63fbef63efefdd", + "size": 2481, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fb0e827f31354bdcc7f2d847bc63fbef63efefdd" + }, + { + "path": ".github/ISSUE_TEMPLATE/config.yml", + "mode": "100644", + "type": "blob", + "sha": "3ba13e0cec6cbbfd462e9ebf529dd2093148cd69", + "size": 28, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3ba13e0cec6cbbfd462e9ebf529dd2093148cd69" + }, + { + "path": ".github/ISSUE_TEMPLATE/feature_request.md", + "mode": "100644", + "type": "blob", + "sha": "066b2d920a28db73b4ba3a0b35e6905eeeef5772", + "size": 560, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/066b2d920a28db73b4ba3a0b35e6905eeeef5772" + }, + { + "path": ".github/auto-comment.yml", + "mode": "100644", + "type": "blob", + "sha": "e6985d222f3e87c27bc33ba8a1bf18286dceff60", + "size": 452, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e6985d222f3e87c27bc33ba8a1bf18286dceff60" + }, + { + "path": ".github/lock.yml", + "mode": "100644", + "type": "blob", + "sha": "1ba1162bbd2895d64de9277f0c76d976edceacbf", + "size": 909, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1ba1162bbd2895d64de9277f0c76d976edceacbf" + }, + { + "path": ".github/no-response.yml", + "mode": "100644", + "type": "blob", + "sha": "156bc9e083772552e31cc3558cd412279f5e301f", + "size": 376, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/156bc9e083772552e31cc3558cd412279f5e301f" + }, + { + "path": ".github/stale.yml", + "mode": "100644", + "type": "blob", + "sha": "df9115c27ba099d73902d1515cdf87481994beb2", + "size": 348, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df9115c27ba099d73902d1515cdf87481994beb2" + }, + { + "path": ".gitignore", + "mode": "100644", + "type": "blob", + "sha": "72c7f140f9170783f8cee968057d1840c67889b2", + "size": 96, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c7f140f9170783f8cee968057d1840c67889b2" + }, + { + "path": ".gitmodules", + "mode": "100644", + "type": "blob", + "sha": "ca517c2f607cf8fa365c6c72285076f23a5f1576", + "size": 238, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca517c2f607cf8fa365c6c72285076f23a5f1576" + }, + { + "path": "BuildScripts", + "mode": "040000", + "type": "tree", + "sha": "c2edb52d49bd3e96cc69471d4b8c64d669c39314", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c2edb52d49bd3e96cc69471d4b8c64d669c39314" + }, + { + "path": "BuildScripts/build-libopus.sh", + "mode": "100755", + "type": "blob", + "sha": "aa4e568584e0e6f89a8c15c48de6c35bd662f2cc", + "size": 5291, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/aa4e568584e0e6f89a8c15c48de6c35bd662f2cc" + }, + { + "path": "CHANGELOG.md", + "mode": "100644", + "type": "blob", + "sha": "e5055bec4ae9e5febdbef7b951e9df3f4a66945e", + "size": 8413, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e5055bec4ae9e5febdbef7b951e9df3f4a66945e" + }, + { + "path": "Frameworks", + "mode": "040000", + "type": "tree", + "sha": "60f670dbd73cfffb22940dbf2c83767e35aecd0f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/60f670dbd73cfffb22940dbf2c83767e35aecd0f" + }, + { + "path": "Frameworks/OpenSSL.xcframework", + "mode": "040000", + "type": "tree", + "sha": "42f865f7e178a3bbe6144badf5f32fb1eb6164ef", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/42f865f7e178a3bbe6144badf5f32fb1eb6164ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "ce2d3a78d42f9ffe9bffb16dcbdf70712523dd44", + "size": 4675, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce2d3a78d42f9ffe9bffb16dcbdf70712523dd44" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "e68a95c47edf33bb9400af07e3ede503bc37eb78", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e68a95c47edf33bb9400af07e3ede503bc37eb78" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature/CodeDirectory", + "mode": "100644", + "type": "blob", + "sha": "ff04d85d50c0c5eeb4b6afb17c2eebafe14e40f7", + "size": 151, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff04d85d50c0c5eeb4b6afb17c2eebafe14e40f7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature/CodeRequirements", + "mode": "100644", + "type": "blob", + "sha": "5a9743ff5ebc019a2ffb53ba5e8d2a90b64c1d74", + "size": 176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5a9743ff5ebc019a2ffb53ba5e8d2a90b64c1d74" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature/CodeRequirements-1", + "mode": "100644", + "type": "blob", + "sha": "ce51ee9c2bc549f5f07120554feb27b9ef14cb61", + "size": 199, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce51ee9c2bc549f5f07120554feb27b9ef14cb61" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "0dcc23177051e6497b0e8a5d497909897d24cd60", + "size": 547162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0dcc23177051e6497b0e8a5d497909897d24cd60" + }, + { + "path": "Frameworks/OpenSSL.xcframework/_CodeSignature/CodeSignature", + "mode": "100644", + "type": "blob", + "sha": "64ee324110ed3ba8783bcdc2eff3a98837bb6cb7", + "size": 9184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64ee324110ed3ba8783bcdc2eff3a98837bb6cb7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64", + "mode": "040000", + "type": "tree", + "sha": "d6e4d1cbb8dcc24e7e945fbe592aa9344caa6f99", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d6e4d1cbb8dcc24e7e945fbe592aa9344caa6f99" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "3a1f2288ed0df698ca4aaa1f5f018a38cb5790cb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/3a1f2288ed0df698ca4aaa1f5f018a38cb5790cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "bcc898c39f16dee7755cedb11a4a6615974e9203", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bcc898c39f16dee7755cedb11a4a6615974e9203" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "1dacd74f2f9c29c6891dca71905016a4bf19c290", + "size": 4290, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1dacd74f2f9c29c6891dca71905016a4bf19c290" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "e63a4d0c863e01bb76a2718e0fa0c125df2db93f", + "size": 770, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e63a4d0c863e01bb76a2718e0fa0c125df2db93f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "f7adcca5a70692a21d5a1fa80983c01697582f10", + "size": 4363056, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f7adcca5a70692a21d5a1fa80983c01697582f10" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "bbf2be4f906b665fe5265f52d35a45f5efb67c41", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bbf2be4f906b665fe5265f52d35a45f5efb67c41" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "1f5da04d332fcbbb1dcbe10973977d541596817d", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5da04d332fcbbb1dcbe10973977d541596817d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst", + "mode": "040000", + "type": "tree", + "sha": "8bae49c5416110d883a927a24bc7b815151b2931", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8bae49c5416110d883a927a24bc7b815151b2931" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "f9029935197be90b7479820e20de44f99fe516eb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f9029935197be90b7479820e20de44f99fe516eb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Headers", + "mode": "120000", + "type": "blob", + "sha": "a177d2a6b92600696030834c319f5e1434f9ee6a", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a177d2a6b92600696030834c319f5e1434f9ee6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Modules", + "mode": "120000", + "type": "blob", + "sha": "5736f3186e797b8b787748c9979d0fed3b0536c3", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5736f3186e797b8b787748c9979d0fed3b0536c3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/OpenSSL", + "mode": "120000", + "type": "blob", + "sha": "79c9cbef65c7b39c087f85020a629ff38b093c19", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79c9cbef65c7b39c087f85020a629ff38b093c19" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Resources", + "mode": "120000", + "type": "blob", + "sha": "953ee36f3bb709faf58a351e0b33c353e337c0a2", + "size": 26, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953ee36f3bb709faf58a351e0b33c353e337c0a2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions", + "mode": "040000", + "type": "tree", + "sha": "cce91e802d9d07232bb94a55b1209107c2168746", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/cce91e802d9d07232bb94a55b1209107c2168746" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A", + "mode": "040000", + "type": "tree", + "sha": "b29ef7d4565e3b95ca2250d3dea8d4b4282f287b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b29ef7d4565e3b95ca2250d3dea8d4b4282f287b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers", + "mode": "040000", + "type": "tree", + "sha": "2dda8fa35f1300847de986d568945aa76a259327", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2dda8fa35f1300847de986d568945aa76a259327" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "775e0c381a9601471e9fb4f07e1932792f1b2985", + "size": 4295, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/775e0c381a9601471e9fb4f07e1932792f1b2985" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2a55da517387989d699110338a849af1b0b40d0f", + "size": 8884160, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a55da517387989d699110338a849af1b0b40d0f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources", + "mode": "040000", + "type": "tree", + "sha": "de6848c35a59d57c43c209b4ed36be680bf6eb6c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/de6848c35a59d57c43c209b4ed36be680bf6eb6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "33144952bd71edefbaba7d156087e7af482711d0", + "size": 1366, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/33144952bd71edefbaba7d156087e7af482711d0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "83c5b7d1bc58cad30575f61f6d2c0d0b9abd22da", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/83c5b7d1bc58cad30575f61f6d2c0d0b9abd22da" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "d8a60f1df8491a6f2dfd13437ef071fab44a2eb4", + "size": 22138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d8a60f1df8491a6f2dfd13437ef071fab44a2eb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/Current", + "mode": "120000", + "type": "blob", + "sha": "8c7e5a667f1b771847fe88c01c3de34413a1b220", + "size": 1, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c7e5a667f1b771847fe88c01c3de34413a1b220" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "93c50431e5fee03548f4d9a75e4ec1079e8667b3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/93c50431e5fee03548f4d9a75e4ec1079e8667b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "46b09ec00024704d8333c91d0ff2867264f55ac6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/46b09ec00024704d8333c91d0ff2867264f55ac6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "5edf9e50bb0ef661f8de7cedfa4005ffb8832594", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5edf9e50bb0ef661f8de7cedfa4005ffb8832594" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "1dacd74f2f9c29c6891dca71905016a4bf19c290", + "size": 4290, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1dacd74f2f9c29c6891dca71905016a4bf19c290" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "dbb80d1d24bcad0bfa2f0732a878b98200d0d1bf", + "size": 750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dbb80d1d24bcad0bfa2f0732a878b98200d0d1bf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "4446a443b15793f5ac200265db9d005457084adb", + "size": 8901168, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4446a443b15793f5ac200265db9d005457084adb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "1a7cffab82202397bb15d415e7b445ea7843088b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1a7cffab82202397bb15d415e7b445ea7843088b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "13269e6b204a69d328312aac210e3d6278edf848", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13269e6b204a69d328312aac210e3d6278edf848" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64", + "mode": "040000", + "type": "tree", + "sha": "905b5f1cd4cdbd4c3dad6b0148bf83a79bac0d5a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/905b5f1cd4cdbd4c3dad6b0148bf83a79bac0d5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "bb9e44e9a54986f89e1a4210213d9af239fe5aae", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bb9e44e9a54986f89e1a4210213d9af239fe5aae" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Headers", + "mode": "120000", + "type": "blob", + "sha": "a177d2a6b92600696030834c319f5e1434f9ee6a", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a177d2a6b92600696030834c319f5e1434f9ee6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Modules", + "mode": "120000", + "type": "blob", + "sha": "5736f3186e797b8b787748c9979d0fed3b0536c3", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5736f3186e797b8b787748c9979d0fed3b0536c3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/OpenSSL", + "mode": "120000", + "type": "blob", + "sha": "79c9cbef65c7b39c087f85020a629ff38b093c19", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79c9cbef65c7b39c087f85020a629ff38b093c19" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Resources", + "mode": "120000", + "type": "blob", + "sha": "953ee36f3bb709faf58a351e0b33c353e337c0a2", + "size": 26, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953ee36f3bb709faf58a351e0b33c353e337c0a2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions", + "mode": "040000", + "type": "tree", + "sha": "c59a1b7eb3777a661610fdc2747348775a1e687f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c59a1b7eb3777a661610fdc2747348775a1e687f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A", + "mode": "040000", + "type": "tree", + "sha": "482998a9a2b132df4dda85e5cc7823fb5f2bf2f4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/482998a9a2b132df4dda85e5cc7823fb5f2bf2f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers", + "mode": "040000", + "type": "tree", + "sha": "2dda8fa35f1300847de986d568945aa76a259327", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2dda8fa35f1300847de986d568945aa76a259327" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "775e0c381a9601471e9fb4f07e1932792f1b2985", + "size": 4295, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/775e0c381a9601471e9fb4f07e1932792f1b2985" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "d436fa5d1b4a28cc2116606e9fd023e0934eed48", + "size": 8901424, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d436fa5d1b4a28cc2116606e9fd023e0934eed48" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources", + "mode": "040000", + "type": "tree", + "sha": "8227cfa7535a3b2d81b321f7fa9bf8273649b82e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8227cfa7535a3b2d81b321f7fa9bf8273649b82e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "88f5c2003ae34d424568994d59b6bbe8337a8ed7", + "size": 1297, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88f5c2003ae34d424568994d59b6bbe8337a8ed7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "2b5dd7c646e07ed104e39886b033ed06d5be6594", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2b5dd7c646e07ed104e39886b033ed06d5be6594" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "f5dc838ccf1ddb64d99088daba5da662166cd16a", + "size": 22138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f5dc838ccf1ddb64d99088daba5da662166cd16a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/Current", + "mode": "120000", + "type": "blob", + "sha": "8c7e5a667f1b771847fe88c01c3de34413a1b220", + "size": 1, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c7e5a667f1b771847fe88c01c3de34413a1b220" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64", + "mode": "040000", + "type": "tree", + "sha": "8a0dc36684ddc8c451d6fe31927444a0f5b28657", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8a0dc36684ddc8c451d6fe31927444a0f5b28657" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "8ff5c88a0d50e880ffb253d4ef38130b9cfef019", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8ff5c88a0d50e880ffb253d4ef38130b9cfef019" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "9220b679479b18f90bc2a2fdf4d009d05171fde3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9220b679479b18f90bc2a2fdf4d009d05171fde3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8", + "size": 4353, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "ca854c34c6c1fd7acc58282e0acac1fdb599a8ea", + "size": 720, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca854c34c6c1fd7acc58282e0acac1fdb599a8ea" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2fb882ef5dbb695afa7320ab09fd4670275d4efb", + "size": 4363056, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2fb882ef5dbb695afa7320ab09fd4670275d4efb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "0af5f392110c7d3ed3c3641b690ac730c0ba2b25", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0af5f392110c7d3ed3c3641b690ac730c0ba2b25" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "191d772f3b64e393a8498e867a163e11d741a0c0", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/191d772f3b64e393a8498e867a163e11d741a0c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "9fb9e4796dcd45d01f7fe67dce93cc4ac15b16f7", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9fb9e4796dcd45d01f7fe67dce93cc4ac15b16f7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "11d4dade270a9f5c329e14c88e9f447dab1486a2", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/11d4dade270a9f5c329e14c88e9f447dab1486a2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "22021713f4f7cdd9a518226642f57a55d7eef088", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/22021713f4f7cdd9a518226642f57a55d7eef088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8", + "size": 4353, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "577aca59a40cbb1addbcddc8347a0ec90c0d1d87", + "size": 747, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/577aca59a40cbb1addbcddc8347a0ec90c0d1d87" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "3e796dc9eb83a2f706fe7d5b4c678b46ef27363e", + "size": 8901184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e796dc9eb83a2f706fe7d5b4c678b46ef27363e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "5c8372277d1259e41ae8b197ef6f28d7c1ead1ab", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5c8372277d1259e41ae8b197ef6f28d7c1ead1ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "efd4aa387ec83dba75d932163b5db01e8832ae20", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/efd4aa387ec83dba75d932163b5db01e8832ae20" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k", + "mode": "040000", + "type": "tree", + "sha": "5793035294f6a228daf73085dd03a1813c1212a4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5793035294f6a228daf73085dd03a1813c1212a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "6b4c5c0ad4c3e610ecfa29118fe99bd23470bd03", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6b4c5c0ad4c3e610ecfa29118fe99bd23470bd03" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "9d2c115fd6eb5f63abaaa3a5f97794fa4480b32f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9d2c115fd6eb5f63abaaa3a5f97794fa4480b32f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ccd77db9da4f4ac8995735e790dafb2157e3e2de", + "size": 4359, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ccd77db9da4f4ac8995735e790dafb2157e3e2de" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "342e3a4f1c2d27595f672f93bd864363e8279b8f", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/342e3a4f1c2d27595f672f93bd864363e8279b8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "2803c46a67ce4cada7ece29df876a673cfd9f476", + "size": 713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2803c46a67ce4cada7ece29df876a673cfd9f476" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2a0be17bc1b7740f2adb93d50efa36c232f525af", + "size": 12051280, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a0be17bc1b7740f2adb93d50efa36c232f525af" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "0054fa2d16d52c1a69b2e2ccd9b204b751a7e90f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0054fa2d16d52c1a69b2e2ccd9b204b751a7e90f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "71db764dc686de3b259c615f9d01e31b8b5adf50", + "size": 42976, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/71db764dc686de3b259c615f9d01e31b8b5adf50" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "db3ff7fe2ff019431931d98f915ea256be20ae9a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/db3ff7fe2ff019431931d98f915ea256be20ae9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "d91038d5186ec990b1051e12e831516b96e8c038", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d91038d5186ec990b1051e12e831516b96e8c038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "699364e889eba46eb05af355aa9cfc35d7288e41", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/699364e889eba46eb05af355aa9cfc35d7288e41" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ccd77db9da4f4ac8995735e790dafb2157e3e2de", + "size": 4359, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ccd77db9da4f4ac8995735e790dafb2157e3e2de" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "0274ad4bf0a970ad5c027fa04536ced180ffba39", + "size": 736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0274ad4bf0a970ad5c027fa04536ced180ffba39" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "0b605fe2dced681b0ddc410bfbb25d669e26d3e6", + "size": 8867536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b605fe2dced681b0ddc410bfbb25d669e26d3e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "9a8120e00cf9b236a3883abdca8199329023dbd5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9a8120e00cf9b236a3883abdca8199329023dbd5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "69fa880d9313618951044bddfe735cd9bf8656fd", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/69fa880d9313618951044bddfe735cd9bf8656fd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64", + "mode": "040000", + "type": "tree", + "sha": "d5a8160145e629d3d29a8396af37009b5acbb751", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d5a8160145e629d3d29a8396af37009b5acbb751" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "8606eb90dd0b331ab70d932bf4f7a0806a26ed17", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8606eb90dd0b331ab70d932bf4f7a0806a26ed17" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "7df571c060ba71fbbcd8649d71ec9be7fe50cb25", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7df571c060ba71fbbcd8649d71ec9be7fe50cb25" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "cc8c2a011e0e46ea0c9a353491f93dfbffa004d4", + "size": 4292, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cc8c2a011e0e46ea0c9a353491f93dfbffa004d4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "654db420cbd9fef146d971c16749ef31c1ae1c79", + "size": 702, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/654db420cbd9fef146d971c16749ef31c1ae1c79" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "c3c9452bc2ce77d4cab81f9923261769d6b9976a", + "size": 4362304, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c3c9452bc2ce77d4cab81f9923261769d6b9976a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "2ffa74812f9edc099209418b2a1791e357eec2a4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2ffa74812f9edc099209418b2a1791e357eec2a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "aa76877fe172bede85208439e561b5bb06cd0975", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/aa76877fe172bede85208439e561b5bb06cd0975" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "dc8652c5b7c5b496dd236dba4e90a724588b1c18", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dc8652c5b7c5b496dd236dba4e90a724588b1c18" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "37abff84a20abab34f4c64307cd28e9d66fa3613", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/37abff84a20abab34f4c64307cd28e9d66fa3613" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "ba01613b9b23dfecb1de66ee5fa50f1f169c4b56", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/ba01613b9b23dfecb1de66ee5fa50f1f169c4b56" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "cc8c2a011e0e46ea0c9a353491f93dfbffa004d4", + "size": 4292, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cc8c2a011e0e46ea0c9a353491f93dfbffa004d4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "e3a3301fba1b9bc728af31c4e904a99e20534208", + "size": 723, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e3a3301fba1b9bc728af31c4e904a99e20534208" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "b3a57b4cdc5afd11112734413f48a57fdba065d3", + "size": 8867536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b3a57b4cdc5afd11112734413f48a57fdba065d3" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "6ce75d38d376314bdefd1aecc2aefb6985a7c599", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6ce75d38d376314bdefd1aecc2aefb6985a7c599" + }, + { + "path": "Frameworks/OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "c1ce16059d1be6905dc5e99a050cf241ada1c8e0", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c1ce16059d1be6905dc5e99a050cf241ada1c8e0" + }, + { + "path": "LICENSE.txt", + "mode": "100644", + "type": "blob", + "sha": "94a9ed024d3859793618152ea559a168bbcbb5e2", + "size": 35147, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/94a9ed024d3859793618152ea559a168bbcbb5e2" + }, + { + "path": "Limelight", + "mode": "040000", + "type": "tree", + "sha": "fc3b8e3334ce36d1cfda3245d1a39e12e6824e4e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fc3b8e3334ce36d1cfda3245d1a39e12e6824e4e" + }, + { + "path": "Limelight/Crypto", + "mode": "040000", + "type": "tree", + "sha": "f29ce9cd93bb8e95584ba3c1e5d64b2ac14dd39a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f29ce9cd93bb8e95584ba3c1e5d64b2ac14dd39a" + }, + { + "path": "Limelight/Crypto/CryptoManager.h", + "mode": "100644", + "type": "blob", + "sha": "b1fc76de4e906f46a403578ad9006f44fe1e7ad7", + "size": 877, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b1fc76de4e906f46a403578ad9006f44fe1e7ad7" + }, + { + "path": "Limelight/Crypto/CryptoManager.m", + "mode": "100644", + "type": "blob", + "sha": "f9603cc6cedd79c1e8174b72886723f794c2122e", + "size": 9130, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f9603cc6cedd79c1e8174b72886723f794c2122e" + }, + { + "path": "Limelight/Crypto/IdManager.h", + "mode": "100644", + "type": "blob", + "sha": "1e5aaebd332272939b93c49e49db6a0b826fa709", + "size": 211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5aaebd332272939b93c49e49db6a0b826fa709" + }, + { + "path": "Limelight/Crypto/IdManager.m", + "mode": "100644", + "type": "blob", + "sha": "3208490e6963c9afbabdd017873db9fe99b30726", + "size": 747, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3208490e6963c9afbabdd017873db9fe99b30726" + }, + { + "path": "Limelight/Crypto/mkcert.c", + "mode": "100644", + "type": "blob", + "sha": "b21b812f806abbef6a8da087c07fbbfd9d5d3b6e", + "size": 2782, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b21b812f806abbef6a8da087c07fbbfd9d5d3b6e" + }, + { + "path": "Limelight/Crypto/mkcert.h", + "mode": "100644", + "type": "blob", + "sha": "f3c62f8b0b1e0ce20b916b1d79291e4c19126bbe", + "size": 442, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f3c62f8b0b1e0ce20b916b1d79291e4c19126bbe" + }, + { + "path": "Limelight/Database", + "mode": "040000", + "type": "tree", + "sha": "6272a7fe050e27f40ccd5c9c08fbec3b4d14e01b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6272a7fe050e27f40ccd5c9c08fbec3b4d14e01b" + }, + { + "path": "Limelight/Database/DataManager.h", + "mode": "100644", + "type": "blob", + "sha": "bb0962689e14d89a06cb7d35e50665f8bb92acee", + "size": 1913, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bb0962689e14d89a06cb7d35e50665f8bb92acee" + }, + { + "path": "Limelight/Database/DataManager.m", + "mode": "100644", + "type": "blob", + "sha": "74b6b3ef00f18c0e8c8d2819fb3913ece4874c1f", + "size": 10405, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/74b6b3ef00f18c0e8c8d2819fb3913ece4874c1f" + }, + { + "path": "Limelight/Database/TemporarySettings.h", + "mode": "100644", + "type": "blob", + "sha": "491f6b7a2f309b54da2d745a620c1371c7aeac4c", + "size": 1273, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/491f6b7a2f309b54da2d745a620c1371c7aeac4c" + }, + { + "path": "Limelight/Database/TemporarySettings.m", + "mode": "100644", + "type": "blob", + "sha": "35ab8bf9edad73eb7de117348a2ffd629b910ca6", + "size": 4366, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35ab8bf9edad73eb7de117348a2ffd629b910ca6" + }, + { + "path": "Limelight/Font", + "mode": "040000", + "type": "tree", + "sha": "f85384b590ed8b6e7ecd0fd6306b7b05f18681a7", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f85384b590ed8b6e7ecd0fd6306b7b05f18681a7" + }, + { + "path": "Limelight/Font/Roboto", + "mode": "040000", + "type": "tree", + "sha": "f92e8203bbc7fe3643e35dd79414b7f866be1108", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f92e8203bbc7fe3643e35dd79414b7f866be1108" + }, + { + "path": "Limelight/Font/Roboto/Roboto-BlackItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "ec309c78557bd0798aab34333867feb5cac992d9", + "size": 149644, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec309c78557bd0798aab34333867feb5cac992d9" + }, + { + "path": "Limelight/Font/Roboto/Roboto-BoldItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "dcd0f800730ba1a562ce450a8079f77e7500eb3a", + "size": 144700, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dcd0f800730ba1a562ce450a8079f77e7500eb3a" + }, + { + "path": "Limelight/Font/Roboto/Roboto-Italic.ttf", + "mode": "100755", + "type": "blob", + "sha": "f382c6874359c1e98bdc2a2ecd1d141e8f1cc15e", + "size": 148540, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f382c6874359c1e98bdc2a2ecd1d141e8f1cc15e" + }, + { + "path": "Limelight/Font/Roboto/Roboto-LightItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "b8f52963716da01c0ddfaa564aecc1bd2cce9d00", + "size": 145932, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b8f52963716da01c0ddfaa564aecc1bd2cce9d00" + }, + { + "path": "Limelight/Font/Roboto/Roboto-MediumItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "67e25f0197465f051496ad1e7ccd175402228527", + "size": 147876, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/67e25f0197465f051496ad1e7ccd175402228527" + }, + { + "path": "Limelight/Font/Roboto/Roboto-ThinItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "63e9f97186f8ba7703e019dd0bd29f3c875d60fc", + "size": 132376, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/63e9f97186f8ba7703e019dd0bd29f3c875d60fc" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-Bold.ttf", + "mode": "100755", + "type": "blob", + "sha": "48dd63534bae7019b7a4e48ec648e29ce153ccf0", + "size": 141796, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/48dd63534bae7019b7a4e48ec648e29ce153ccf0" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-BoldItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "ad728646a17f2c5f972c7fa4ec887511292f7937", + "size": 145256, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ad728646a17f2c5f972c7fa4ec887511292f7937" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-Italic.ttf", + "mode": "100755", + "type": "blob", + "sha": "a232513d592c414ce19e90e7535002fe3900ec11", + "size": 144404, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a232513d592c414ce19e90e7535002fe3900ec11" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-Light.ttf", + "mode": "100755", + "type": "blob", + "sha": "a6e368d40eacc749999c887f55452f03729f02ad", + "size": 141384, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a6e368d40eacc749999c887f55452f03729f02ad" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-LightItalic.ttf", + "mode": "100755", + "type": "blob", + "sha": "5b2b6ae087b385571599d8f5a5dac7019faca3e7", + "size": 145104, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b2b6ae087b385571599d8f5a5dac7019faca3e7" + }, + { + "path": "Limelight/Font/Roboto/RobotoCondensed-Regular.ttf", + "mode": "100755", + "type": "blob", + "sha": "65bf32a19f9fe3d42d7f48f3f35c56b62b83513a", + "size": 140396, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65bf32a19f9fe3d42d7f48f3f35c56b62b83513a" + }, + { + "path": "Limelight/Input", + "mode": "040000", + "type": "tree", + "sha": "6dccdb4579ac536c21b90ba7fbf9552205259c09", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6dccdb4579ac536c21b90ba7fbf9552205259c09" + }, + { + "path": "Limelight/Input/AbsoluteTouchHandler.h", + "mode": "100644", + "type": "blob", + "sha": "cbdb455d6a486f365e6e3ba3b05cd351d4c19f3d", + "size": 332, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cbdb455d6a486f365e6e3ba3b05cd351d4c19f3d" + }, + { + "path": "Limelight/Input/AbsoluteTouchHandler.m", + "mode": "100644", + "type": "blob", + "sha": "b9b8c59c4abae7651360196cb2fc64599687f494", + "size": 4365, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b9b8c59c4abae7651360196cb2fc64599687f494" + }, + { + "path": "Limelight/Input/Controller.h", + "mode": "100644", + "type": "blob", + "sha": "6e4511cfdda55f03dedc0999922776af2afa23ff", + "size": 2205, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e4511cfdda55f03dedc0999922776af2afa23ff" + }, + { + "path": "Limelight/Input/Controller.m", + "mode": "100644", + "type": "blob", + "sha": "7587928b5439dd2dd6ef0d5fc8450599497dd604", + "size": 218, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7587928b5439dd2dd6ef0d5fc8450599497dd604" + }, + { + "path": "Limelight/Input/ControllerSupport.h", + "mode": "100644", + "type": "blob", + "sha": "542dc6e824d56112f3d52e297c6371fb4a4155e8", + "size": 2649, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/542dc6e824d56112f3d52e297c6371fb4a4155e8" + }, + { + "path": "Limelight/Input/ControllerSupport.m", + "mode": "100644", + "type": "blob", + "sha": "02bf14417c16f9d07c13d9e46d9bab012ff8edd2", + "size": 71750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/02bf14417c16f9d07c13d9e46d9bab012ff8edd2" + }, + { + "path": "Limelight/Input/HapticContext.h", + "mode": "100644", + "type": "blob", + "sha": "b8f2b61c03ccb9ee293da554991bce4ad005688a", + "size": 605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b8f2b61c03ccb9ee293da554991bce4ad005688a" + }, + { + "path": "Limelight/Input/HapticContext.m", + "mode": "100644", + "type": "blob", + "sha": "b61124ccceb97fb2f8e6921b2b0d9ae5b1d5d7b1", + "size": 5804, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b61124ccceb97fb2f8e6921b2b0d9ae5b1d5d7b1" + }, + { + "path": "Limelight/Input/KeyboardInputField.h", + "mode": "100644", + "type": "blob", + "sha": "eff86ebe99733af437586500981ba168e1bae1b0", + "size": 302, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eff86ebe99733af437586500981ba168e1bae1b0" + }, + { + "path": "Limelight/Input/KeyboardInputField.m", + "mode": "100644", + "type": "blob", + "sha": "2fb0e731ec2261e050b2cfa495fa26d0bd5344a1", + "size": 429, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2fb0e731ec2261e050b2cfa495fa26d0bd5344a1" + }, + { + "path": "Limelight/Input/KeyboardSupport.h", + "mode": "100644", + "type": "blob", + "sha": "6cecb4d5655971449d67d4d20670be70b1cff411", + "size": 612, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6cecb4d5655971449d67d4d20670be70b1cff411" + }, + { + "path": "Limelight/Input/KeyboardSupport.m", + "mode": "100644", + "type": "blob", + "sha": "fa6601b03caffef89d4a1befe249abf778a47c4e", + "size": 14771, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fa6601b03caffef89d4a1befe249abf778a47c4e" + }, + { + "path": "Limelight/Input/Moonlight-Bridging-Header.h", + "mode": "100644", + "type": "blob", + "sha": "f4d793a7373aa7bba8e115631eac4fde8027f332", + "size": 953, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f4d793a7373aa7bba8e115631eac4fde8027f332" + }, + { + "path": "Limelight/Input/OnScreenControls.h", + "mode": "100644", + "type": "blob", + "sha": "29997de34bae4aa4fecc89e590e6481310a5eced", + "size": 1053, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/29997de34bae4aa4fecc89e590e6481310a5eced" + }, + { + "path": "Limelight/Input/OnScreenControls.m", + "mode": "100644", + "type": "blob", + "sha": "ed4b6dbde6a372774c03245f127178b4ad40d59b", + "size": 41046, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed4b6dbde6a372774c03245f127178b4ad40d59b" + }, + { + "path": "Limelight/Input/RelativeTouchHandler.h", + "mode": "100644", + "type": "blob", + "sha": "2f8d9dbda36eb4242fb4a27f1a9b465cb89df43e", + "size": 332, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f8d9dbda36eb4242fb4a27f1a9b465cb89df43e" + }, + { + "path": "Limelight/Input/RelativeTouchHandler.m", + "mode": "100644", + "type": "blob", + "sha": "64d7da465d615d62b5dcdb9566353d86397a78a2", + "size": 7884, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64d7da465d615d62b5dcdb9566353d86397a78a2" + }, + { + "path": "Limelight/Input/StreamView.h", + "mode": "100644", + "type": "blob", + "sha": "b5794d27731e83705d203d2623b89ad19503498e", + "size": 1095, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b5794d27731e83705d203d2623b89ad19503498e" + }, + { + "path": "Limelight/Input/StreamView.m", + "mode": "100644", + "type": "blob", + "sha": "cf385b577892a6b84383d5f5fadc1ed765d8b479", + "size": 41582, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cf385b577892a6b84383d5f5fadc1ed765d8b479" + }, + { + "path": "Limelight/Limelight-Info.plist", + "mode": "100644", + "type": "blob", + "sha": "e66ee4d55792f0ecbf30ca8a183bb423265de584", + "size": 2893, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e66ee4d55792f0ecbf30ca8a183bb423265de584" + }, + { + "path": "Limelight/Limelight-Prefix.pch", + "mode": "100644", + "type": "blob", + "sha": "4e945b81ae6d9f96da923cfa0a27e0b4576d3fe2", + "size": 500, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4e945b81ae6d9f96da923cfa0a27e0b4576d3fe2" + }, + { + "path": "Limelight/Limelight.xcdatamodeld", + "mode": "040000", + "type": "tree", + "sha": "04672e6ecc955143dc6589a0bcb46033eb47356f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/04672e6ecc955143dc6589a0bcb46033eb47356f" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/.xccurrentversion", + "mode": "100644", + "type": "blob", + "sha": "b202eb9f368d017552dd25575d147ce527059397", + "size": 268, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b202eb9f368d017552dd25575d147ce527059397" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight 0.3.0.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "346d4b295bda148eef988ce39b685a7db5cd1cfa", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/346d4b295bda148eef988ce39b685a7db5cd1cfa" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight 0.3.0.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "04e06bba5855ed2986b940f44d89c11ece024ff1", + "size": 1832, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04e06bba5855ed2986b940f44d89c11ece024ff1" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight 0.3.1.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "295f4844b3a664f799d3973011bf6c468367fb45", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/295f4844b3a664f799d3973011bf6c468367fb45" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight 0.3.1.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "30aff7255f6fd0ff9bfbc87a32af60214039d74d", + "size": 1832, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30aff7255f6fd0ff9bfbc87a32af60214039d74d" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "a0318f65af468864fac419de340fc1e23548deec", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a0318f65af468864fac419de340fc1e23548deec" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "c2c5be8bf5abf1080e6f2bd99606bf4736681b08", + "size": 1321, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c2c5be8bf5abf1080e6f2bd99606bf4736681b08" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.0-2.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "d18874f3d6b0417112f51857313596869763e53e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d18874f3d6b0417112f51857313596869763e53e" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.0-2.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "a9ff5b4d249284048c4f96f049bc04785554e063", + "size": 2957, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9ff5b4d249284048c4f96f049bc04785554e063" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.0.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "0afe88855c326b1c36c75563b713fa325e0dc1da", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0afe88855c326b1c36c75563b713fa325e0dc1da" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.0.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "f116d13dddc14449dcb8898f6d51f95d6d5a689a", + "size": 2640, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f116d13dddc14449dcb8898f6d51f95d6d5a689a" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "5e33ec7dc5cb53178add98dd861f7d7a9782f388", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5e33ec7dc5cb53178add98dd861f7d7a9782f388" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.1.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "090bd637367ccb794137bfd89429d51415ffcf47", + "size": 3941, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/090bd637367ccb794137bfd89429d51415ffcf47" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "ce66fa5500ad6cd3526df2f8f3831975c00dd2e6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/ce66fa5500ad6cd3526df2f8f3831975c00dd2e6" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "36b6e45eeb12e672f200cf6705d0980cfc2f41c0", + "size": 5820, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/36b6e45eeb12e672f200cf6705d0980cfc2f41c0" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.2.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "fbd94f21f45be17eeaa51cb6af81aba0f3da53d8", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fbd94f21f45be17eeaa51cb6af81aba0f3da53d8" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.2.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "0d3feba0bac5e967f7f2f119006cb4236d49a205", + "size": 3816, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0d3feba0bac5e967f7f2f119006cb4236d49a205" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.3.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "7c828f1c0eab5e4ecd334a57892aa57f264be6b5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7c828f1c0eab5e4ecd334a57892aa57f264be6b5" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.3.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "9eee4f104ff6f961d217985fdeb887958a8f52e9", + "size": 3911, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9eee4f104ff6f961d217985fdeb887958a8f52e9" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.4.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "6fc5abe29c67bb426b75c418d0294d63d729ac66", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6fc5abe29c67bb426b75c418d0294d63d729ac66" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.4.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "ce5077c4719973342a233b18a07b3e521fb33907", + "size": 4005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce5077c4719973342a233b18a07b3e521fb33907" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.5.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "71468b8f7d22ab7b01e5fda0ad8dcce847f0d65f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/71468b8f7d22ab7b01e5fda0ad8dcce847f0d65f" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.5.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "89bac307895fbea3bc4bb86ca7ce5834d52783a6", + "size": 4134, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/89bac307895fbea3bc4bb86ca7ce5834d52783a6" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "911878d6d563a8078ff1fcdf6ced3ee758471e31", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/911878d6d563a8078ff1fcdf6ced3ee758471e31" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "39de9e94116909d2aaaf89b2b8c4cd2719a82fd1", + "size": 4387, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/39de9e94116909d2aaaf89b2b8c4cd2719a82fd1" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "fcd84d0312412d85e1a12d86145df4cf4bfd3638", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fcd84d0312412d85e1a12d86145df4cf4bfd3638" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "712c76a7e85ed0d84091a60b9191d39a1dea37af", + "size": 4651, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/712c76a7e85ed0d84091a60b9191d39a1dea37af" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "d2d578f87673309b6e96a1fca7aad1771dbe0274", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d2d578f87673309b6e96a1fca7aad1771dbe0274" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "19d6d78afa20c85b676abf3151889b515616dd86", + "size": 4783, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/19d6d78afa20c85b676abf3151889b515616dd86" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel", + "mode": "040000", + "type": "tree", + "sha": "7978b62e87aa1e4bfa58faa2b70e2097fde161a0", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7978b62e87aa1e4bfa58faa2b70e2097fde161a0" + }, + { + "path": "Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel/contents", + "mode": "100644", + "type": "blob", + "sha": "30a96bc03306dc766f5d0e19b8671a53c4cf3f83", + "size": 4785, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30a96bc03306dc766f5d0e19b8671a53c4cf3f83" + }, + { + "path": "Limelight/Network", + "mode": "040000", + "type": "tree", + "sha": "1e45a91811736c51b40d61951e295d459c346598", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1e45a91811736c51b40d61951e295d459c346598" + }, + { + "path": "Limelight/Network/AppAssetManager.h", + "mode": "100644", + "type": "blob", + "sha": "b0b0ae65ff0d82e8fec243b55a463fdeb9bdf33e", + "size": 543, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0b0ae65ff0d82e8fec243b55a463fdeb9bdf33e" + }, + { + "path": "Limelight/Network/AppAssetManager.m", + "mode": "100644", + "type": "blob", + "sha": "0de0bd14e2561999e9a2ca430cfb7db9ec4fb229", + "size": 1891, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0de0bd14e2561999e9a2ca430cfb7db9ec4fb229" + }, + { + "path": "Limelight/Network/AppAssetResponse.h", + "mode": "100644", + "type": "blob", + "sha": "ad225f8fc3ee1ca094ccbc4053331851bee3e2c3", + "size": 235, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ad225f8fc3ee1ca094ccbc4053331851bee3e2c3" + }, + { + "path": "Limelight/Network/AppAssetResponse.m", + "mode": "100644", + "type": "blob", + "sha": "0fb9ff84c0a8c90d37bfd4a1769f5b31bbe80b2e", + "size": 508, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0fb9ff84c0a8c90d37bfd4a1769f5b31bbe80b2e" + }, + { + "path": "Limelight/Network/AppAssetRetriever.h", + "mode": "100644", + "type": "blob", + "sha": "0abc5addd1dfeaa2d66bff61345ef777ee8b4fb4", + "size": 413, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0abc5addd1dfeaa2d66bff61345ef777ee8b4fb4" + }, + { + "path": "Limelight/Network/AppAssetRetriever.m", + "mode": "100644", + "type": "blob", + "sha": "304362587118e68cc3cc6e075c26a1848a60dcd4", + "size": 1574, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/304362587118e68cc3cc6e075c26a1848a60dcd4" + }, + { + "path": "Limelight/Network/AppListResponse.h", + "mode": "100644", + "type": "blob", + "sha": "46ba1931b976c24e71cc98d14a9576c70e22a479", + "size": 317, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46ba1931b976c24e71cc98d14a9576c70e22a479" + }, + { + "path": "Limelight/Network/AppListResponse.m", + "mode": "100644", + "type": "blob", + "sha": "5c3ff7114acb1b395cbb9bf6160ce6a5ace185f0", + "size": 5987, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c3ff7114acb1b395cbb9bf6160ce6a5ace185f0" + }, + { + "path": "Limelight/Network/ConnectionHelper.h", + "mode": "100644", + "type": "blob", + "sha": "5a28ffe02ae8deafdba18a8f54c3ab1dde600b9e", + "size": 395, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5a28ffe02ae8deafdba18a8f54c3ab1dde600b9e" + }, + { + "path": "Limelight/Network/ConnectionHelper.m", + "mode": "100644", + "type": "blob", + "sha": "bbbe16504b1e87b7840fc4f5411c38e0fe036b0f", + "size": 1231, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bbbe16504b1e87b7840fc4f5411c38e0fe036b0f" + }, + { + "path": "Limelight/Network/DiscoveryManager.h", + "mode": "100644", + "type": "blob", + "sha": "8959a35f7537b71c5e5c2a1c395feaac393b96fc", + "size": 861, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8959a35f7537b71c5e5c2a1c395feaac393b96fc" + }, + { + "path": "Limelight/Network/DiscoveryManager.m", + "mode": "100644", + "type": "blob", + "sha": "c40210779f0f08ee2a708c6f105997dc35aea592", + "size": 13111, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c40210779f0f08ee2a708c6f105997dc35aea592" + }, + { + "path": "Limelight/Network/DiscoveryWorker.h", + "mode": "100644", + "type": "blob", + "sha": "bc5eba706cd3a74e31746dd9e9ddf4e523253b32", + "size": 343, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bc5eba706cd3a74e31746dd9e9ddf4e523253b32" + }, + { + "path": "Limelight/Network/DiscoveryWorker.m", + "mode": "100644", + "type": "blob", + "sha": "87301ad0713e999c6666e2f69a26022b50e966e0", + "size": 5413, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/87301ad0713e999c6666e2f69a26022b50e966e0" + }, + { + "path": "Limelight/Network/HttpManager.h", + "mode": "100644", + "type": "blob", + "sha": "2d6ff065e378f797d30dfe78891bffdc425d1546", + "size": 1356, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2d6ff065e378f797d30dfe78891bffdc425d1546" + }, + { + "path": "Limelight/Network/HttpManager.m", + "mode": "100644", + "type": "blob", + "sha": "ed2c818ca78dc00f6c9bf4c58549039f974a993a", + "size": 17247, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed2c818ca78dc00f6c9bf4c58549039f974a993a" + }, + { + "path": "Limelight/Network/HttpRequest.h", + "mode": "100644", + "type": "blob", + "sha": "ace3da2e7be804ea192019d7af2062ec38d5eaf6", + "size": 714, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ace3da2e7be804ea192019d7af2062ec38d5eaf6" + }, + { + "path": "Limelight/Network/HttpRequest.m", + "mode": "100644", + "type": "blob", + "sha": "afb1c8966f5754e41fba7710fed0663a8dcc2f5a", + "size": 1032, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/afb1c8966f5754e41fba7710fed0663a8dcc2f5a" + }, + { + "path": "Limelight/Network/HttpResponse.h", + "mode": "100644", + "type": "blob", + "sha": "70478a50b376364677c2b237488f3fa91a8adc5a", + "size": 702, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/70478a50b376364677c2b237488f3fa91a8adc5a" + }, + { + "path": "Limelight/Network/HttpResponse.m", + "mode": "100644", + "type": "blob", + "sha": "f9c29148763c32f424cf266a0f41adb3f9113fc0", + "size": 2937, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f9c29148763c32f424cf266a0f41adb3f9113fc0" + }, + { + "path": "Limelight/Network/MDNSManager.h", + "mode": "100644", + "type": "blob", + "sha": "659d2f81d1b6d0be5f3f4aa7051547b95dcc3454", + "size": 513, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/659d2f81d1b6d0be5f3f4aa7051547b95dcc3454" + }, + { + "path": "Limelight/Network/MDNSManager.m", + "mode": "100644", + "type": "blob", + "sha": "b3994afafd135462ba92649109914a9148ac7794", + "size": 10178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b3994afafd135462ba92649109914a9148ac7794" + }, + { + "path": "Limelight/Network/PairManager.h", + "mode": "100644", + "type": "blob", + "sha": "2cc29d2b75402389d443707b39f8f7ff1f6ff52b", + "size": 521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2cc29d2b75402389d443707b39f8f7ff1f6ff52b" + }, + { + "path": "Limelight/Network/PairManager.m", + "mode": "100644", + "type": "blob", + "sha": "bac91b8b9bb53229860e005c510b13465bd20deb", + "size": 10397, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bac91b8b9bb53229860e005c510b13465bd20deb" + }, + { + "path": "Limelight/Network/ServerInfoResponse.h", + "mode": "100644", + "type": "blob", + "sha": "2b8b3c6cc5a77acc0552370494f69df5753f699d", + "size": 726, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b8b3c6cc5a77acc0552370494f69df5753f699d" + }, + { + "path": "Limelight/Network/ServerInfoResponse.m", + "mode": "100644", + "type": "blob", + "sha": "68154768c1d053afc20e4040111ac858ae2573a2", + "size": 4624, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/68154768c1d053afc20e4040111ac858ae2573a2" + }, + { + "path": "Limelight/Network/WakeOnLanManager.h", + "mode": "100644", + "type": "blob", + "sha": "925b4a1527c450653ac0218190e640c5d947e205", + "size": 476, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/925b4a1527c450653ac0218190e640c5d947e205" + }, + { + "path": "Limelight/Network/WakeOnLanManager.m", + "mode": "100644", + "type": "blob", + "sha": "af4dd0e8edd85b3ded9d429534b671a585cd1d82", + "size": 4941, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/af4dd0e8edd85b3ded9d429534b671a585cd1d82" + }, + { + "path": "Limelight/Stream", + "mode": "040000", + "type": "tree", + "sha": "7b2cf43d39048f60c63f563e1b1452d8d1e19000", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7b2cf43d39048f60c63f563e1b1452d8d1e19000" + }, + { + "path": "Limelight/Stream/AnyVideoDecoderRenderer.h", + "mode": "100644", + "type": "blob", + "sha": "c485533dcf39dc8a8bd2db6c204bfc03232ad4d7", + "size": 579, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c485533dcf39dc8a8bd2db6c204bfc03232ad4d7" + }, + { + "path": "Limelight/Stream/Connection.h", + "mode": "100644", + "type": "blob", + "sha": "69d96c94f388ca2f985d518a1abfef8d16323c26", + "size": 1066, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/69d96c94f388ca2f985d518a1abfef8d16323c26" + }, + { + "path": "Limelight/Stream/Connection.m", + "mode": "100644", + "type": "blob", + "sha": "ec25143fe8af08a6438fee2438a85ca2a41a687a", + "size": 18312, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec25143fe8af08a6438fee2438a85ca2a41a687a" + }, + { + "path": "Limelight/Stream/ConnectionCallbacks.h", + "mode": "100644", + "type": "blob", + "sha": "f9c13b4e5e5343efc4b20f366ce341d4f6caa27e", + "size": 1113, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f9c13b4e5e5343efc4b20f366ce341d4f6caa27e" + }, + { + "path": "Limelight/Stream/HDRParsingUtils.h", + "mode": "100644", + "type": "blob", + "sha": "102ff5b1adee1f1678d7ecad603e59dd70468544", + "size": 498, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/102ff5b1adee1f1678d7ecad603e59dd70468544" + }, + { + "path": "Limelight/Stream/HDRParsingUtils.m", + "mode": "100644", + "type": "blob", + "sha": "86eb7f7358430f83cf0ee0dee8105f6029113f66", + "size": 2678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/86eb7f7358430f83cf0ee0dee8105f6029113f66" + }, + { + "path": "Limelight/Stream/StreamConfiguration.swift", + "mode": "100644", + "type": "blob", + "sha": "d38335d7f5edebe6a39d2f419d61f9d6ae65ebe7", + "size": 3309, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d38335d7f5edebe6a39d2f419d61f9d6ae65ebe7" + }, + { + "path": "Limelight/Stream/StreamManager.h", + "mode": "100644", + "type": "blob", + "sha": "7e04f167c820a01ad44c96fd3b2954c5b09ccbe4", + "size": 536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7e04f167c820a01ad44c96fd3b2954c5b09ccbe4" + }, + { + "path": "Limelight/Stream/StreamManager.m", + "mode": "100644", + "type": "blob", + "sha": "cfbae6e8d89e43d7a46affb02b80a1d43122a2af", + "size": 7795, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cfbae6e8d89e43d7a46affb02b80a1d43122a2af" + }, + { + "path": "Limelight/Stream/VideoDecoderRenderer.h", + "mode": "100644", + "type": "blob", + "sha": "44721924f65f9dcc1d59eec83340ca1db9c1bd3c", + "size": 749, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/44721924f65f9dcc1d59eec83340ca1db9c1bd3c" + }, + { + "path": "Limelight/Stream/VideoDecoderRenderer.m", + "mode": "100644", + "type": "blob", + "sha": "76df81a57a903186094544a5a58638fef059de8e", + "size": 28668, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76df81a57a903186094544a5a58638fef059de8e" + }, + { + "path": "Limelight/TemporaryApp.swift", + "mode": "100644", + "type": "blob", + "sha": "8b54ce8abeda7e1a62a37551df364cdd703d6356", + "size": 1196, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8b54ce8abeda7e1a62a37551df364cdd703d6356" + }, + { + "path": "Limelight/TemporaryHost.swift", + "mode": "100644", + "type": "blob", + "sha": "89041983304e03b404fd9246cc891e6972c4336d", + "size": 4813, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/89041983304e03b404fd9246cc891e6972c4336d" + }, + { + "path": "Limelight/TemporarySettings.swift", + "mode": "100644", + "type": "blob", + "sha": "0013d48159382a927d685fff50f77d1fad825a0c", + "size": 17601, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0013d48159382a927d685fff50f77d1fad825a0c" + }, + { + "path": "Limelight/Utility", + "mode": "040000", + "type": "tree", + "sha": "8ce3cd2b10ac2c5b93ad662145d740a88398d60b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8ce3cd2b10ac2c5b93ad662145d740a88398d60b" + }, + { + "path": "Limelight/Utility/Logger.h", + "mode": "100644", + "type": "blob", + "sha": "0ffe5c49a6dc6e6d38714985a3f5f2b8c83ffd2f", + "size": 523, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0ffe5c49a6dc6e6d38714985a3f5f2b8c83ffd2f" + }, + { + "path": "Limelight/Utility/Logger.m", + "mode": "100644", + "type": "blob", + "sha": "3d1d004fdad3f5ba53255e57a4ad5cf40113cf67", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d1d004fdad3f5ba53255e57a4ad5cf40113cf67" + }, + { + "path": "Limelight/Utility/NSData+Conversion.h", + "mode": "100644", + "type": "blob", + "sha": "7ded798dbff3524b3d091f6741a46ef314c2fe3b", + "size": 146, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ded798dbff3524b3d091f6741a46ef314c2fe3b" + }, + { + "path": "Limelight/Utility/NSData+Conversion.m", + "mode": "100644", + "type": "blob", + "sha": "8b8689b492e2aab11415bec09f1ae39a1b412f1c", + "size": 704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8b8689b492e2aab11415bec09f1ae39a1b412f1c" + }, + { + "path": "Limelight/Utility/Utils.h", + "mode": "100644", + "type": "blob", + "sha": "e114218dadf96ea028be77f5853fac745eaa3fbf", + "size": 1111, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e114218dadf96ea028be77f5853fac745eaa3fbf" + }, + { + "path": "Limelight/Utility/Utils.m", + "mode": "100644", + "type": "blob", + "sha": "fded11b77eed20515133ab7fcd14dab4bb148e93", + "size": 5215, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fded11b77eed20515133ab7fcd14dab4bb148e93" + }, + { + "path": "Limelight/Utils.swift", + "mode": "100644", + "type": "blob", + "sha": "0392cfe4186c14390efa9e48e8b27a047efd3a1e", + "size": 491, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0392cfe4186c14390efa9e48e8b27a047efd3a1e" + }, + { + "path": "Limelight/combined_swift_code.txt", + "mode": "100644", + "type": "blob", + "sha": "3b256f73d4320d3d6b6a042bea24ec3b5b17df09", + "size": 11783, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3b256f73d4320d3d6b6a042bea24ec3b5b17df09" + }, + { + "path": "Limelight/combiner.py", + "mode": "100644", + "type": "blob", + "sha": "e089c849a2a7411de1c43a45e2095d3a2379a3b4", + "size": 4281, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e089c849a2a7411de1c43a45e2095d3a2379a3b4" + }, + { + "path": "Limelight/en.lproj", + "mode": "040000", + "type": "tree", + "sha": "0237597b848a1890bb30ba0ff4102f8107cafdcb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0237597b848a1890bb30ba0ff4102f8107cafdcb" + }, + { + "path": "Limelight/en.lproj/InfoPlist.strings", + "mode": "100644", + "type": "blob", + "sha": "477b28ff8f86a3158a71c4934fbd3a2456717d7a", + "size": 45, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/477b28ff8f86a3158a71c4934fbd3a2456717d7a" + }, + { + "path": "Limelight/main.m", + "mode": "100644", + "type": "blob", + "sha": "0dbc0e3e43222a3890020fcbf3e831d1c7a51ff1", + "size": 418, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0dbc0e3e43222a3890020fcbf3e831d1c7a51ff1" + }, + { + "path": "Moonlight TV", + "mode": "040000", + "type": "tree", + "sha": "e8c69cec788b480858f6ed07d1336b832fb77526", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e8c69cec788b480858f6ed07d1336b832fb77526" + }, + { + "path": "Moonlight TV/Assets.xcassets", + "mode": "040000", + "type": "tree", + "sha": "01d8e9813bcc35b02dec74cddce52e0e8767edd4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/01d8e9813bcc35b02dec74cddce52e0e8767edd4" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets", + "mode": "040000", + "type": "tree", + "sha": "0f14c8be70b5024c5eae40282afb029ed34858e0", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0f14c8be70b5024c5eae40282afb029ed34858e0" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack", + "mode": "040000", + "type": "tree", + "sha": "7752c35f6aff1da5a2ec3c848b9b05e731efbee9", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7752c35f6aff1da5a2ec3c848b9b05e731efbee9" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "0e5262bd5639ed706fef59180063318dab21a730", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0e5262bd5639ed706fef59180063318dab21a730" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "879042b035b8a3fa125ba46b4065b986437f823c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/879042b035b8a3fa125ba46b4065b986437f823c" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "670729817b4d5c52a93f9cf055316a0f255f0195", + "size": 148, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/670729817b4d5c52a93f9cf055316a0f255f0195" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/bg-app.jpg", + "mode": "100644", + "type": "blob", + "sha": "7d956c04d9e2f249d6989cabad620bae80fb6f37", + "size": 31223, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7d956c04d9e2f249d6989cabad620bae80fb6f37" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "d29f024ed5c3128ad5835d7b44176860dc84dac4", + "size": 249, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d29f024ed5c3128ad5835d7b44176860dc84dac4" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "4b880652a25cc581e615967bc96795aee2131c68", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4b880652a25cc581e615967bc96795aee2131c68" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "c9710067ac797257d76ab5e01750ea874c4d8879", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c9710067ac797257d76ab5e01750ea874c4d8879" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "48ecb4fa43e287f506607be7383b6e11f466ca0f", + "size": 115, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/48ecb4fa43e287f506607be7383b6e11f466ca0f" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "4891c596411aef079836ba96666a5a2281d40f94", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4891c596411aef079836ba96666a5a2281d40f94" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "bf94944daaec52bcaaba5f72134a2292638136a5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bf94944daaec52bcaaba5f72134a2292638136a5" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "ece4178309b61575ffc5375919bd9381b9560ceb", + "size": 152, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ece4178309b61575ffc5375919bd9381b9560ceb" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/wedges-app.png", + "mode": "100644", + "type": "blob", + "sha": "6704ca22bbf0ab6eac6c9f8e9a3d3181f31dd3a5", + "size": 77235, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6704ca22bbf0ab6eac6c9f8e9a3d3181f31dd3a5" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack", + "mode": "040000", + "type": "tree", + "sha": "3d84d61d06282125bcc5c959270c393a09e9f933", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/3d84d61d06282125bcc5c959270c393a09e9f933" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "e5dbce477fe30f799adf9f9a0fefa193b9570b8a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e5dbce477fe30f799adf9f9a0fefa193b9570b8a" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "b49fa60774778dcff37666585d3e6567b19ea0fb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b49fa60774778dcff37666585d3e6567b19ea0fb" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "f103f41ed23e3a568723fa12a30a086210560646", + "size": 253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f103f41ed23e3a568723fa12a30a086210560646" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/bg.jpg", + "mode": "100644", + "type": "blob", + "sha": "745d47e125b2890bf8c0b2a5edeb6cf5d9a58e62", + "size": 8541, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/745d47e125b2890bf8c0b2a5edeb6cf5d9a58e62" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/bg@2.jpg", + "mode": "100644", + "type": "blob", + "sha": "6b4890e8cb7815308b9b9331645a7ed85333378b", + "size": 21868, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4890e8cb7815308b9b9331645a7ed85333378b" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "d29f024ed5c3128ad5835d7b44176860dc84dac4", + "size": 249, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d29f024ed5c3128ad5835d7b44176860dc84dac4" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "99accd117f3c362ce772113d44a2a009b33a0c73", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/99accd117f3c362ce772113d44a2a009b33a0c73" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "00cc1468b3641fddd8a6bca516a2d2730dbe5d71", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/00cc1468b3641fddd8a6bca516a2d2730dbe5d71" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "16a370df0147cffb86e00a4f4f78544aabe22990", + "size": 193, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/16a370df0147cffb86e00a4f4f78544aabe22990" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "54cbea171ff3f89b200581a2828897535693203f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/54cbea171ff3f89b200581a2828897535693203f" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "bdccaa7c0e83f80aa70fb5e64c08cbbc74f7544e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bdccaa7c0e83f80aa70fb5e64c08cbbc74f7544e" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "2bddca35c829ccfd99a652cc40402aa6c44ff994", + "size": 261, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2bddca35c829ccfd99a652cc40402aa6c44ff994" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Wedges.png", + "mode": "100644", + "type": "blob", + "sha": "c45bdb37cbf4e5af4d7939faa6edfa02d1c33980", + "size": 15055, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c45bdb37cbf4e5af4d7939faa6edfa02d1c33980" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Wedges@2.png", + "mode": "100644", + "type": "blob", + "sha": "925cc3a3ec39eb34d79504f4279cadca2e340f0c", + "size": 39573, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/925cc3a3ec39eb34d79504f4279cadca2e340f0c" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "db288f368f11348a7077acb27682d3abfd6388d3", + "size": 662, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/db288f368f11348a7077acb27682d3abfd6388d3" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset", + "mode": "040000", + "type": "tree", + "sha": "34268c8ff6c56dc553b96b4d7fdb40b8de820e60", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/34268c8ff6c56dc553b96b4d7fdb40b8de820e60" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "44273a55ab4d51c756d763f9add2e89261b9f7ec", + "size": 497, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/44273a55ab4d51c756d763f9add2e89261b9f7ec" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/topshelf-wide@1-1.png", + "mode": "100644", + "type": "blob", + "sha": "a14ef597a29fedaf92a4207c3a055f3a70bdc0fa", + "size": 407178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a14ef597a29fedaf92a4207c3a055f3a70bdc0fa" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/topshelf-wide@1.png", + "mode": "100644", + "type": "blob", + "sha": "a14ef597a29fedaf92a4207c3a055f3a70bdc0fa", + "size": 407178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a14ef597a29fedaf92a4207c3a055f3a70bdc0fa" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/topshelf-wide@2-1.png", + "mode": "100644", + "type": "blob", + "sha": "5e532f4bc9bd581baa1d9efbfeb824de67eb1f9e", + "size": 1211737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5e532f4bc9bd581baa1d9efbfeb824de67eb1f9e" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/topshelf-wide@2.png", + "mode": "100644", + "type": "blob", + "sha": "5e532f4bc9bd581baa1d9efbfeb824de67eb1f9e", + "size": 1211737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5e532f4bc9bd581baa1d9efbfeb824de67eb1f9e" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset", + "mode": "040000", + "type": "tree", + "sha": "e21efeebb4e6323d94f99903bfa54ac792b9084b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e21efeebb4e6323d94f99903bfa54ac792b9084b" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "bd8b0b635fd325324c4bed9c14389960ce3279a0", + "size": 477, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bd8b0b635fd325324c4bed9c14389960ce3279a0" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/topshelf@1-1.png", + "mode": "100644", + "type": "blob", + "sha": "99646a75062653388400db9564795a81b757ff5c", + "size": 400453, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/99646a75062653388400db9564795a81b757ff5c" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/topshelf@1.png", + "mode": "100644", + "type": "blob", + "sha": "99646a75062653388400db9564795a81b757ff5c", + "size": 400453, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/99646a75062653388400db9564795a81b757ff5c" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/topshelf@2-1.png", + "mode": "100644", + "type": "blob", + "sha": "830a2745c15f35ccc735c1f7ce1dd5cc45204f38", + "size": 1186530, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/830a2745c15f35ccc735c1f7ce1dd5cc45204f38" + }, + { + "path": "Moonlight TV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/topshelf@2.png", + "mode": "100644", + "type": "blob", + "sha": "830a2745c15f35ccc735c1f7ce1dd5cc45204f38", + "size": 1186530, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/830a2745c15f35ccc735c1f7ce1dd5cc45204f38" + }, + { + "path": "Moonlight TV/Assets.xcassets/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "da4a164c918651cdd1e11dca5cc62c333f097601", + "size": 62, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da4a164c918651cdd1e11dca5cc62c333f097601" + }, + { + "path": "Moonlight TV/Assets.xcassets/Launch Image.launchimage", + "mode": "040000", + "type": "tree", + "sha": "9ba57da2702e567532faf8ea853b3c1d94400ad7", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9ba57da2702e567532faf8ea853b3c1d94400ad7" + }, + { + "path": "Moonlight TV/Assets.xcassets/Launch Image.launchimage/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "c446e92252f10ca4ea89b7fcc55010a1c6417ef1", + "size": 495, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c446e92252f10ca4ea89b7fcc55010a1c6417ef1" + }, + { + "path": "Moonlight TV/Assets.xcassets/Launch Image.launchimage/Simulator Screen Shot - Apple TV 4K - 2019-09-22 at 20.39.12.png", + "mode": "100644", + "type": "blob", + "sha": "c518271124c2407abf2cf29d73293d34d9c0886f", + "size": 5280994, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c518271124c2407abf2cf29d73293d34d9c0886f" + }, + { + "path": "Moonlight TV/Base.lproj", + "mode": "040000", + "type": "tree", + "sha": "17cc58b75c1b208de93e66855234d304acb7e769", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/17cc58b75c1b208de93e66855234d304acb7e769" + }, + { + "path": "Moonlight TV/Base.lproj/Main.storyboard", + "mode": "100644", + "type": "blob", + "sha": "7c0413fd1d5b721de445d560c489e375d22b813d", + "size": 8879, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7c0413fd1d5b721de445d560c489e375d22b813d" + }, + { + "path": "Moonlight TV/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "b91ee818efc232f3066ff5dee5e4d1c9376a682c", + "size": 1867, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b91ee818efc232f3066ff5dee5e4d1c9376a682c" + }, + { + "path": "Moonlight TV/Settings.bundle", + "mode": "040000", + "type": "tree", + "sha": "1b54c82acffcb49429d41723d445a858001a9e83", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1b54c82acffcb49429d41723d445a858001a9e83" + }, + { + "path": "Moonlight TV/Settings.bundle/Root.plist", + "mode": "100644", + "type": "blob", + "sha": "80881885e10ecbd7e9a8fb35fff3edb28210e289", + "size": 5938, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/80881885e10ecbd7e9a8fb35fff3edb28210e289" + }, + { + "path": "Moonlight TV/Settings.bundle/en.lproj", + "mode": "040000", + "type": "tree", + "sha": "f90c1eb1b5abfd87664fe362ab0cd00fee70a892", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f90c1eb1b5abfd87664fe362ab0cd00fee70a892" + }, + { + "path": "Moonlight TV/Settings.bundle/en.lproj/Root.strings", + "mode": "100644", + "type": "blob", + "sha": "8cd87b9d6b20c1fbf87bd4db3db267fca5ad4df9", + "size": 546, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8cd87b9d6b20c1fbf87bd4db3db267fca5ad4df9" + }, + { + "path": "Moonlight TV/main.m", + "mode": "100644", + "type": "blob", + "sha": "df13448903423e77e7a9d7d81efb0edfe5cd040a", + "size": 435, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df13448903423e77e7a9d7d81efb0edfe5cd040a" + }, + { + "path": "Moonlight Vision", + "mode": "040000", + "type": "tree", + "sha": "9a1424a925fc4bdf2947db6642043c45975263bd", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9a1424a925fc4bdf2947db6642043c45975263bd" + }, + { + "path": "Moonlight Vision/AV1Helper.h", + "mode": "100644", + "type": "blob", + "sha": "d9913fd31ce5c152ce8b7afd6d6c4eaf34d1441f", + "size": 705, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9913fd31ce5c152ce8b7afd6d6c4eaf34d1441f" + }, + { + "path": "Moonlight Vision/AV1Helper.m", + "mode": "100644", + "type": "blob", + "sha": "23ade73cb81927ae1289b6f46adfacc747f9a0f4", + "size": 6470, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23ade73cb81927ae1289b6f46adfacc747f9a0f4" + }, + { + "path": "Moonlight Vision/AppIntents", + "mode": "040000", + "type": "tree", + "sha": "adf0df67a7f82bdb6b3e7aa9fbbb7cc2de10e9c6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/adf0df67a7f82bdb6b3e7aa9fbbb7cc2de10e9c6" + }, + { + "path": "Moonlight Vision/AppIntents/DummyView.swift", + "mode": "100644", + "type": "blob", + "sha": "f770fd30960af933ede9a5501ee41e20f0b0245e", + "size": 910, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f770fd30960af933ede9a5501ee41e20f0b0245e" + }, + { + "path": "Moonlight Vision/AppIntents/MoonlightAppEntity.swift", + "mode": "100644", + "type": "blob", + "sha": "0a5ed3c5fa284a3679651532caddd05197dac8b6", + "size": 1808, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0a5ed3c5fa284a3679651532caddd05197dac8b6" + }, + { + "path": "Moonlight Vision/AppIntents/MoonlightHostAppEntity.swift", + "mode": "100644", + "type": "blob", + "sha": "4376240abf48d4a5232c95f84e273917bf06ef15", + "size": 1403, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4376240abf48d4a5232c95f84e273917bf06ef15" + }, + { + "path": "Moonlight Vision/AppIntents/OpenStreamAppIntent.swift", + "mode": "100644", + "type": "blob", + "sha": "62edcbc4ea86874dad57ac1fdb667fdf4a452718", + "size": 1549, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62edcbc4ea86874dad57ac1fdb667fdf4a452718" + }, + { + "path": "Moonlight Vision/AppsView.swift", + "mode": "100644", + "type": "blob", + "sha": "e59a2657f0d4c1e1b72b92d1a0a069a7270ac096", + "size": 6662, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e59a2657f0d4c1e1b72b92d1a0a069a7270ac096" + }, + { + "path": "Moonlight Vision/AudioHelpers.swift", + "mode": "100644", + "type": "blob", + "sha": "7e7f41ca7ea7307ecfe25d10b3b88c9bb6f51d5d", + "size": 3059, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7e7f41ca7ea7307ecfe25d10b3b88c9bb6f51d5d" + }, + { + "path": "Moonlight Vision/CVMetalHelpers.swift", + "mode": "100644", + "type": "blob", + "sha": "124e890f91b8f4e4de79de0cb708d9bfa239b2d4", + "size": 21355, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/124e890f91b8f4e4de79de0cb708d9bfa239b2d4" + }, + { + "path": "Moonlight Vision/ComputerView.swift", + "mode": "100644", + "type": "blob", + "sha": "a127e04be7a7949c5911112239a97960612570df", + "size": 11495, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a127e04be7a7949c5911112239a97960612570df" + }, + { + "path": "Moonlight Vision/ComputerViewWrapper.swift", + "mode": "100644", + "type": "blob", + "sha": "0f9dd413a2c4c88cc379e37a253748c1e400cbbf", + "size": 1080, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f9dd413a2c4c88cc379e37a253748c1e400cbbf" + }, + { + "path": "Moonlight Vision/ControlPanel", + "mode": "040000", + "type": "tree", + "sha": "6bff80b9f7fdf3fc02f486b54b866b6b1fd8268a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6bff80b9f7fdf3fc02f486b54b866b6b1fd8268a" + }, + { + "path": "Moonlight Vision/ControlPanel/StandardControlPanelView.swift", + "mode": "100644", + "type": "blob", + "sha": "1fc56f11297de6da346c367342731c248896f73c", + "size": 20044, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1fc56f11297de6da346c367342731c248896f73c" + }, + { + "path": "Moonlight Vision/DrawableVideoDecoder.swift", + "mode": "100644", + "type": "blob", + "sha": "e2e8f0921cc9a4c02ce748e7c5151caa1603f264", + "size": 48585, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e2e8f0921cc9a4c02ce748e7c5151caa1603f264" + }, + { + "path": "Moonlight Vision/Environment", + "mode": "040000", + "type": "tree", + "sha": "1849b8c9ea1a6bb6ab51967562b7c4d4a4c3b679", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1849b8c9ea1a6bb6ab51967562b7c4d4a4c3b679" + }, + { + "path": "Moonlight Vision/Environment/EnvironmentStateHandler.swift", + "mode": "100644", + "type": "blob", + "sha": "761db401a3746ea69313e48f6502194d0fa0f025", + "size": 3982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/761db401a3746ea69313e48f6502194d0fa0f025" + }, + { + "path": "Moonlight Vision/Environment/ImmersionStyleManager.swift", + "mode": "100644", + "type": "blob", + "sha": "2f3c2b0e4484c3f37137174a04a3fb3df48f845f", + "size": 334, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f3c2b0e4484c3f37137174a04a3fb3df48f845f" + }, + { + "path": "Moonlight Vision/Environment/ImmersiveEnvironment.swift", + "mode": "100644", + "type": "blob", + "sha": "147125af3960f406fb0999d0bc1b56434e07230d", + "size": 7419, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/147125af3960f406fb0999d0bc1b56434e07230d" + }, + { + "path": "Moonlight Vision/ImmersiveControls", + "mode": "040000", + "type": "tree", + "sha": "ea70ca153ef7c44f699f78573a81e7c8d3e23f00", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/ea70ca153ef7c44f699f78573a81e7c8d3e23f00" + }, + { + "path": "Moonlight Vision/ImmersiveControls/ImmersiveControlPanelView.swift", + "mode": "100644", + "type": "blob", + "sha": "e237fd39b1e652a6e4b2aa372686dc6ff1a5697b", + "size": 22491, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e237fd39b1e652a6e4b2aa372686dc6ff1a5697b" + }, + { + "path": "Moonlight Vision/ImmersiveControls/ImmersiveDockView.swift", + "mode": "100644", + "type": "blob", + "sha": "5816972904f92ebf0acf0d38acfb8504f59fdcd0", + "size": 2594, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5816972904f92ebf0acf0d38acfb8504f59fdcd0" + }, + { + "path": "Moonlight Vision/ImmersiveControls/StreamControlState.swift", + "mode": "100644", + "type": "blob", + "sha": "0cadd525cdeae265f701b329e6595eadb877efd7", + "size": 3615, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0cadd525cdeae265f701b329e6595eadb877efd7" + }, + { + "path": "Moonlight Vision/InputCaptureView.swift", + "mode": "100644", + "type": "blob", + "sha": "e27f5da8fed7029d64e2a0458d571591c9407c54", + "size": 5548, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e27f5da8fed7029d64e2a0458d571591c9407c54" + }, + { + "path": "Moonlight Vision/LanguagePromptView.swift", + "mode": "100644", + "type": "blob", + "sha": "8d8ac2f3250f1cc938505189cc8c458e4750a193", + "size": 1331, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8d8ac2f3250f1cc938505189cc8c458e4750a193" + }, + { + "path": "Moonlight Vision/LocalizationHelper.swift", + "mode": "100644", + "type": "blob", + "sha": "7a8f20e356134f862760ba5d462abd06361b761b", + "size": 1259, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7a8f20e356134f862760ba5d462abd06361b761b" + }, + { + "path": "Moonlight Vision/MainContentView.swift", + "mode": "100644", + "type": "blob", + "sha": "acaf602e08ecd6f0fe5ea0e295db2790fa6916eb", + "size": 11422, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/acaf602e08ecd6f0fe5ea0e295db2790fa6916eb" + }, + { + "path": "Moonlight Vision/MainViewModel.swift", + "mode": "100644", + "type": "blob", + "sha": "9ddd11397c2794f62c69dc494e8c2891b7e3949a", + "size": 24786, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9ddd11397c2794f62c69dc494e8c2891b7e3949a" + }, + { + "path": "Moonlight Vision/MoonlightVisionApp.swift", + "mode": "100644", + "type": "blob", + "sha": "1472125274310855a37ddcc16e3cf8fdf20e9f22", + "size": 6531, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1472125274310855a37ddcc16e3cf8fdf20e9f22" + }, + { + "path": "Moonlight Vision/ObservableConnectionManager.swift", + "mode": "100644", + "type": "blob", + "sha": "7627e6717f5093e0880992d55d982806352c6fbc", + "size": 3293, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7627e6717f5093e0880992d55d982806352c6fbc" + }, + { + "path": "Moonlight Vision/RealityKitStreamView.swift", + "mode": "100644", + "type": "blob", + "sha": "70e71483071d84918d16b49237d777cce9dd32a7", + "size": 89503, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/70e71483071d84918d16b49237d777cce9dd32a7" + }, + { + "path": "Moonlight Vision/Resources", + "mode": "040000", + "type": "tree", + "sha": "4fda7c0a45be03002843017eab15563e5c4cc5e2", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4fda7c0a45be03002843017eab15563e5c4cc5e2" + }, + { + "path": "Moonlight Vision/Resources/Localizable.strings", + "mode": "100644", + "type": "blob", + "sha": "c3c3149ed9fbe89471568cf98d56e7634fef9240", + "size": 75, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c3c3149ed9fbe89471568cf98d56e7634fef9240" + }, + { + "path": "Moonlight Vision/Resources/en.lproj", + "mode": "040000", + "type": "tree", + "sha": "150171a6a41460323d0786bcbd13b48be9bf27e4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/150171a6a41460323d0786bcbd13b48be9bf27e4" + }, + { + "path": "Moonlight Vision/Resources/en.lproj/Localizable.strings", + "mode": "100644", + "type": "blob", + "sha": "abfb3f28d697befaf322e272ef6b0ca3ea8a2fa0", + "size": 7684, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/abfb3f28d697befaf322e272ef6b0ca3ea8a2fa0" + }, + { + "path": "Moonlight Vision/Resources/zh-Hans.lproj", + "mode": "040000", + "type": "tree", + "sha": "61d2bbb876b5b9a12ba36c7029ad8884e379022e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/61d2bbb876b5b9a12ba36c7029ad8884e379022e" + }, + { + "path": "Moonlight Vision/Resources/zh-Hans.lproj/Localizable.strings", + "mode": "100644", + "type": "blob", + "sha": "d0aa2ccc09dad35b922173a037641eb9ce1cddaa", + "size": 7536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa2ccc09dad35b922173a037641eb9ce1cddaa" + }, + { + "path": "Moonlight Vision/SBSMaterial.usda", + "mode": "100644", + "type": "blob", + "sha": "4ead0689e9f23edf9bfbb5d87cb2d2a03fe4178b", + "size": 3190, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ead0689e9f23edf9bfbb5d87cb2d2a03fe4178b" + }, + { + "path": "Moonlight Vision/SDLMainWrapper.h", + "mode": "100644", + "type": "blob", + "sha": "7b25a217a630e8baf48986914b7f2c212d64709f", + "size": 347, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7b25a217a630e8baf48986914b7f2c212d64709f" + }, + { + "path": "Moonlight Vision/SDLMainWrapper.m", + "mode": "100644", + "type": "blob", + "sha": "e36e2f3ff8575955dbafe1bf0cc474db757e4127", + "size": 328, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e36e2f3ff8575955dbafe1bf0cc474db757e4127" + }, + { + "path": "Moonlight Vision/SettingsView.swift", + "mode": "100644", + "type": "blob", + "sha": "718558271ae06e910ca73d9d15ab7f5b7c52667e", + "size": 27705, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/718558271ae06e910ca73d9d15ab7f5b7c52667e" + }, + { + "path": "Moonlight Vision/Shaders.metal", + "mode": "100644", + "type": "blob", + "sha": "6e590c806cfcca543af56e5b1af9de9860610320", + "size": 6011, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e590c806cfcca543af56e5b1af9de9860610320" + }, + { + "path": "Moonlight Vision/SidebarView.swift", + "mode": "100644", + "type": "blob", + "sha": "5c37d84679b8883e290f7f19f05f1d0709b80dca", + "size": 763, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c37d84679b8883e290f7f19f05f1d0709b80dca" + }, + { + "path": "Moonlight Vision/StandardControlPanelView.swift", + "mode": "100644", + "type": "blob", + "sha": "3409f5432c94dd1ed31b9f09c989bef33d40277f", + "size": 12014, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3409f5432c94dd1ed31b9f09c989bef33d40277f" + }, + { + "path": "Moonlight Vision/StreamControls.swift", + "mode": "100644", + "type": "blob", + "sha": "8f74429ddb98886b08770c474c24484f5a73b88e", + "size": 4763, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f74429ddb98886b08770c474c24484f5a73b88e" + }, + { + "path": "Moonlight Vision/UIKitStreamView.swift", + "mode": "100644", + "type": "blob", + "sha": "3e39e83faf98060b5a62acac0f22ef7dface1d24", + "size": 18356, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e39e83faf98060b5a62acac0f22ef7dface1d24" + }, + { + "path": "Moonlight Vision/UpdatesView.swift", + "mode": "100644", + "type": "blob", + "sha": "b264da57f42e3a0b996fddcfa41650e058a2b8bb", + "size": 24669, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b264da57f42e3a0b996fddcfa41650e058a2b8bb" + }, + { + "path": "Moonlight Vision/VideoTypes.swift", + "mode": "100644", + "type": "blob", + "sha": "5f6c20f8cd749fc5460f6ee6d560e91ac0db06fd", + "size": 129, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5f6c20f8cd749fc5460f6ee6d560e91ac0db06fd" + }, + { + "path": "Moonlight XrOS.entitlements", + "mode": "100644", + "type": "blob", + "sha": "63f246736106df2133304ba4b8db939f3b964db6", + "size": 251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/63f246736106df2133304ba4b8db939f3b964db6" + }, + { + "path": "Moonlight copy-Info.plist", + "mode": "100644", + "type": "blob", + "sha": "a1a34f5ad5e830b670ceb3036ad0ab74c36a7192", + "size": 2535, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a1a34f5ad5e830b670ceb3036ad0ab74c36a7192" + }, + { + "path": "Moonlight iOS", + "mode": "040000", + "type": "tree", + "sha": "a4d1115d1984f1fd74a13352ae192894202a6fb3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a4d1115d1984f1fd74a13352ae192894202a6fb3" + }, + { + "path": "Moonlight iOS/AppCollectionView.h", + "mode": "100644", + "type": "blob", + "sha": "40c59ab05a8a6917d0cd9438e977fa2c18720712", + "size": 231, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/40c59ab05a8a6917d0cd9438e977fa2c18720712" + }, + { + "path": "Moonlight iOS/AppCollectionView.m", + "mode": "100644", + "type": "blob", + "sha": "4ee9988c49ee3c9fb0d19372da834be5502dc5e4", + "size": 611, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ee9988c49ee3c9fb0d19372da834be5502dc5e4" + }, + { + "path": "Moonlight iOS/AppDelegate.h", + "mode": "100644", + "type": "blob", + "sha": "52e51e59039f57b55adf1b35be7737818441508c", + "size": 861, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/52e51e59039f57b55adf1b35be7737818441508c" + }, + { + "path": "Moonlight iOS/AppDelegate.m", + "mode": "100644", + "type": "blob", + "sha": "118edb883046cd48c4f47b0abb686ca9caf64536", + "size": 8439, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/118edb883046cd48c4f47b0abb686ca9caf64536" + }, + { + "path": "Moonlight iOS/ComputerScrollView.h", + "mode": "100644", + "type": "blob", + "sha": "16a93cef7afdb304e224dc8d572df8302e16ce2b", + "size": 229, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/16a93cef7afdb304e224dc8d572df8302e16ce2b" + }, + { + "path": "Moonlight iOS/ComputerScrollView.m", + "mode": "100644", + "type": "blob", + "sha": "c9610170dfdc387e84ea534257bb435420ae7fac", + "size": 614, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9610170dfdc387e84ea534257bb435420ae7fac" + }, + { + "path": "Moonlight iOS/Images.xcassets", + "mode": "040000", + "type": "tree", + "sha": "49714b685d4dfaae53defb04d73811e6d24f8797", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/49714b685d4dfaae53defb04d73811e6d24f8797" + }, + { + "path": "Moonlight iOS/Images.xcassets/AButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "952d812fa8e8b4968453f95e5606e4a7afafcfc4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/952d812fa8e8b4968453f95e5606e4a7afafcfc4" + }, + { + "path": "Moonlight iOS/Images.xcassets/AButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "b4d9c34559693b6718429fc6b3b6076e809c2014", + "size": 360, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b4d9c34559693b6718429fc6b3b6076e809c2014" + }, + { + "path": "Moonlight iOS/Images.xcassets/AButton.imageset/a_button_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "8e2b6c21d77234876376bc8a7839cb91c78ff333", + "size": 6702, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e2b6c21d77234876376bc8a7839cb91c78ff333" + }, + { + "path": "Moonlight iOS/Images.xcassets/AButton.imageset/a_button_80x80@2x.png", + "mode": "100644", + "type": "blob", + "sha": "a1b6d68d6e8e84e723a7fed9d7df4750442ed571", + "size": 1057, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a1b6d68d6e8e84e723a7fed9d7df4750442ed571" + }, + { + "path": "Moonlight iOS/Images.xcassets/AddOverlayIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "24fa91d082c594665d2b86bd66893c56d033a3e8", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/24fa91d082c594665d2b86bd66893c56d033a3e8" + }, + { + "path": "Moonlight iOS/Images.xcassets/AddOverlayIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "813ddd3d63f0e25de955cd42e243bba82330aa38", + "size": 300, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/813ddd3d63f0e25de955cd42e243bba82330aa38" + }, + { + "path": "Moonlight iOS/Images.xcassets/AddOverlayIcon.imageset/add.pdf", + "mode": "100644", + "type": "blob", + "sha": "78b6f2f859becddaf5641c361effdcf2047d9765", + "size": 1061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/78b6f2f859becddaf5641c361effdcf2047d9765" + }, + { + "path": "Moonlight iOS/Images.xcassets/AltIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "5d7a6154a44d31f8e9da8ea7f54b4e51cbfd2af3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5d7a6154a44d31f8e9da8ea7f54b4e51cbfd2af3" + }, + { + "path": "Moonlight iOS/Images.xcassets/AltIcon.imageset/AltIcon.png", + "mode": "100644", + "type": "blob", + "sha": "222f6437aae1a811ddd3d8a64dafe8f1616c907f", + "size": 2486, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/222f6437aae1a811ddd3d8a64dafe8f1616c907f" + }, + { + "path": "Moonlight iOS/Images.xcassets/AltIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "29a9ae7a7d495397d7072b215f839017effd455f", + "size": 305, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/29a9ae7a7d495397d7072b215f839017effd455f" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset", + "mode": "040000", + "type": "tree", + "sha": "b2d99f0bce06b4245e1badb6b017cc1bbc469c06", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b2d99f0bce06b4245e1badb6b017cc1bbc469c06" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/1024x icon.png", + "mode": "100644", + "type": "blob", + "sha": "93eca38b69f6935fde53fa5b4248d8c7185bf625", + "size": 33186, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/93eca38b69f6935fde53fa5b4248d8c7185bf625" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "1a88ad37c7abc266c4accdc05dddce6c4e68f184", + "size": 2207, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1a88ad37c7abc266c4accdc05dddce6c4e68f184" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png", + "mode": "100644", + "type": "blob", + "sha": "49a6d8cf3c4916beca2c8d09130369173336919d", + "size": 1583, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/49a6d8cf3c4916beca2c8d09130369173336919d" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png", + "mode": "100644", + "type": "blob", + "sha": "4b02770504e6d3a1e289db6698d9daa43ccd2fa8", + "size": 3040, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b02770504e6d3a1e289db6698d9daa43ccd2fa8" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png", + "mode": "100644", + "type": "blob", + "sha": "4b02770504e6d3a1e289db6698d9daa43ccd2fa8", + "size": 3040, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b02770504e6d3a1e289db6698d9daa43ccd2fa8" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png", + "mode": "100644", + "type": "blob", + "sha": "2d84c50fa94e7ef601d72bd14d997634a541ce4b", + "size": 4700, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2d84c50fa94e7ef601d72bd14d997634a541ce4b" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png", + "mode": "100644", + "type": "blob", + "sha": "fa7bb64b2c6e5c5b4510a3ffe8314893648fca08", + "size": 2143, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fa7bb64b2c6e5c5b4510a3ffe8314893648fca08" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png", + "mode": "100644", + "type": "blob", + "sha": "10d955b93aa953c9e5682f3f77439044c0cbee1e", + "size": 4306, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/10d955b93aa953c9e5682f3f77439044c0cbee1e" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png", + "mode": "100644", + "type": "blob", + "sha": "10d955b93aa953c9e5682f3f77439044c0cbee1e", + "size": 4306, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/10d955b93aa953c9e5682f3f77439044c0cbee1e" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png", + "mode": "100644", + "type": "blob", + "sha": "2bb7d5ef08b6c5fe7317976b10bc058b7c483a0b", + "size": 6610, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2bb7d5ef08b6c5fe7317976b10bc058b7c483a0b" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png", + "mode": "100644", + "type": "blob", + "sha": "2bb7d5ef08b6c5fe7317976b10bc058b7c483a0b", + "size": 6610, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2bb7d5ef08b6c5fe7317976b10bc058b7c483a0b" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png", + "mode": "100644", + "type": "blob", + "sha": "29bed7e9f5480a49780cde32d7f796c066aef3a6", + "size": 10232, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/29bed7e9f5480a49780cde32d7f796c066aef3a6" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png", + "mode": "100644", + "type": "blob", + "sha": "958f7ae96332cecb3f79160192d97f4f3c5436d9", + "size": 4074, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/958f7ae96332cecb3f79160192d97f4f3c5436d9" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png", + "mode": "100644", + "type": "blob", + "sha": "c3c4861d3a31fd2ab4cc9b9734913a99cf3a2cd3", + "size": 8748, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c3c4861d3a31fd2ab4cc9b9734913a99cf3a2cd3" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png", + "mode": "100644", + "type": "blob", + "sha": "284e50a7e9b1bf4072d383e21f9231da742b8865", + "size": 9720, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/284e50a7e9b1bf4072d383e21f9231da742b8865" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack", + "mode": "040000", + "type": "tree", + "sha": "b87d4b0c777f042f38dd9ab695317dea87bf1e53", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b87d4b0c777f042f38dd9ab695317dea87bf1e53" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "e1aee260553a2028a784d66ec14210054ffd1ab9", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e1aee260553a2028a784d66ec14210054ffd1ab9" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "6abc2375eafee37e59b0d44410f5e1e0dca4369e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6abc2375eafee37e59b0d44410f5e1e0dca4369e" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "1f4f1dddd0d813326175e1f203e896b3e66cda4f", + "size": 173, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f4f1dddd0d813326175e1f203e896b3e66cda4f" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/bg@2.jpg", + "mode": "100644", + "type": "blob", + "sha": "6c674db0b8f5c7663a88494ab85367287b6dfc4f", + "size": 48589, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6c674db0b8f5c7663a88494ab85367287b6dfc4f" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "73c00596a7fca3f3d4bdd64053b69d86745f9e10", + "size": 63, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73c00596a7fca3f3d4bdd64053b69d86745f9e10" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "950af4d85a8e15b9373b16764b7f9ff3ecc219d1", + "size": 265, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/950af4d85a8e15b9373b16764b7f9ff3ecc219d1" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "47b91058f96500d0b6138befae95174f0076d47a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/47b91058f96500d0b6138befae95174f0076d47a" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "eeefe8e980e1fa2a53a1f692d7ccd4de3a774833", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/eeefe8e980e1fa2a53a1f692d7ccd4de3a774833" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "04056a547f776e77884f080fbe8276d0c58b30a5", + "size": 142, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04056a547f776e77884f080fbe8276d0c58b30a5" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "73c00596a7fca3f3d4bdd64053b69d86745f9e10", + "size": 63, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73c00596a7fca3f3d4bdd64053b69d86745f9e10" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer", + "mode": "040000", + "type": "tree", + "sha": "e6c485df17a9173b4eb6c314f021caac08604a27", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e6c485df17a9173b4eb6c314f021caac08604a27" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset", + "mode": "040000", + "type": "tree", + "sha": "07833cd96825809a2798ae5c78b215f9320a949b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/07833cd96825809a2798ae5c78b215f9320a949b" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "33d4cda0aa87cc01c68bb60cba25b6d54db93fdb", + "size": 177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/33d4cda0aa87cc01c68bb60cba25b6d54db93fdb" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Wedges@2.png", + "mode": "100644", + "type": "blob", + "sha": "7263b543a98736ec427e59da2c079b70af9d4399", + "size": 127005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7263b543a98736ec427e59da2c079b70af9d4399" + }, + { + "path": "Moonlight iOS/Images.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "73c00596a7fca3f3d4bdd64053b69d86745f9e10", + "size": 63, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73c00596a7fca3f3d4bdd64053b69d86745f9e10" + }, + { + "path": "Moonlight iOS/Images.xcassets/BButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "93d5a321d3836022fdf9225375e34f42c6b8a0a0", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/93d5a321d3836022fdf9225375e34f42c6b8a0a0" + }, + { + "path": "Moonlight iOS/Images.xcassets/BButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "64de99cca736e021e9a449b0b7e4ed4e5497d16f", + "size": 360, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64de99cca736e021e9a449b0b7e4ed4e5497d16f" + }, + { + "path": "Moonlight iOS/Images.xcassets/BButton.imageset/b_button_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "04089f3baac46178b15f47c3e5f099aba85c236b", + "size": 6418, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04089f3baac46178b15f47c3e5f099aba85c236b" + }, + { + "path": "Moonlight iOS/Images.xcassets/BButton.imageset/b_button_80x80@2x.png", + "mode": "100644", + "type": "blob", + "sha": "18649f4660860b3bcaa2fdf5440090d2296b1941", + "size": 1053, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/18649f4660860b3bcaa2fdf5440090d2296b1941" + }, + { + "path": "Moonlight iOS/Images.xcassets/Computer.imageset", + "mode": "040000", + "type": "tree", + "sha": "d856fefc15771063ddefc4a1d50d7c614b3b9982", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d856fefc15771063ddefc4a1d50d7c614b3b9982" + }, + { + "path": "Moonlight iOS/Images.xcassets/Computer.imageset/Computer.pdf", + "mode": "100644", + "type": "blob", + "sha": "9aa1572ed58a44b3bee77209e8e33064598ed0d4", + "size": 1124, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9aa1572ed58a44b3bee77209e8e33064598ed0d4" + }, + { + "path": "Moonlight iOS/Images.xcassets/Computer.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "ef963c3d54ebf91aeb9752bb443440108ec2c097", + "size": 305, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ef963c3d54ebf91aeb9752bb443440108ec2c097" + }, + { + "path": "Moonlight iOS/Images.xcassets/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "73c00596a7fca3f3d4bdd64053b69d86745f9e10", + "size": 63, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73c00596a7fca3f3d4bdd64053b69d86745f9e10" + }, + { + "path": "Moonlight iOS/Images.xcassets/ControlIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "1f3325ca9913e6000445e56f691bf8aa1aca1fbf", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1f3325ca9913e6000445e56f691bf8aa1aca1fbf" + }, + { + "path": "Moonlight iOS/Images.xcassets/ControlIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "24227b35095eb88873ec6d6326562bc00c274f2e", + "size": 309, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/24227b35095eb88873ec6d6326562bc00c274f2e" + }, + { + "path": "Moonlight iOS/Images.xcassets/ControlIcon.imageset/ControlIcon.png", + "mode": "100644", + "type": "blob", + "sha": "48433dd16072f6ec70fdfbd73733cc7b6f83e018", + "size": 2741, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/48433dd16072f6ec70fdfbd73733cc7b6f83e018" + }, + { + "path": "Moonlight iOS/Images.xcassets/DeleteIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "8111a2ba707fcbe657cfcaa2b54af0c20679fc15", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8111a2ba707fcbe657cfcaa2b54af0c20679fc15" + }, + { + "path": "Moonlight iOS/Images.xcassets/DeleteIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "09d0484e9a1f7c78fb9ac37b2e65b43e5503cb38", + "size": 308, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/09d0484e9a1f7c78fb9ac37b2e65b43e5503cb38" + }, + { + "path": "Moonlight iOS/Images.xcassets/DeleteIcon.imageset/DeleteIcon.png", + "mode": "100644", + "type": "blob", + "sha": "3a3e323f8f761ec242c9f82bc345a0ab05bba1e3", + "size": 2646, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3a3e323f8f761ec242c9f82bc345a0ab05bba1e3" + }, + { + "path": "Moonlight iOS/Images.xcassets/DoneIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "970600ac949924209f79e6669614f709f6aefe4c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/970600ac949924209f79e6669614f709f6aefe4c" + }, + { + "path": "Moonlight iOS/Images.xcassets/DoneIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "9229c641aa8aedca1879857839f6ad9215924a97", + "size": 306, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9229c641aa8aedca1879857839f6ad9215924a97" + }, + { + "path": "Moonlight iOS/Images.xcassets/DoneIcon.imageset/doneIcon.png", + "mode": "100644", + "type": "blob", + "sha": "f4d178f58daf5fd1f2a1d7b727243b299378ad37", + "size": 405, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f4d178f58daf5fd1f2a1d7b727243b299378ad37" + }, + { + "path": "Moonlight iOS/Images.xcassets/DownButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "04d7860f17816df257a71eb10ed92a826cb574cb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/04d7860f17816df257a71eb10ed92a826cb574cb" + }, + { + "path": "Moonlight iOS/Images.xcassets/DownButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "5297392dcd66a1b56cac8e8de2b51ddfc665c702", + "size": 351, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5297392dcd66a1b56cac8e8de2b51ddfc665c702" + }, + { + "path": "Moonlight iOS/Images.xcassets/DownButton.imageset/down_61x75@2x.png", + "mode": "100644", + "type": "blob", + "sha": "0557ceec9a9a84d8d805e02d80ba588c9bc0dfee", + "size": 455, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0557ceec9a9a84d8d805e02d80ba588c9bc0dfee" + }, + { + "path": "Moonlight iOS/Images.xcassets/DownButton.imageset/down_93x114@3x.png", + "mode": "100644", + "type": "blob", + "sha": "8c193d503eeee3bce90376a96871e49eae75a631", + "size": 3637, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c193d503eeee3bce90376a96871e49eae75a631" + }, + { + "path": "Moonlight iOS/Images.xcassets/ErrorOverlayIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "0883246ef6c47ab4bcb6e8134d962ad3e019e9f2", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0883246ef6c47ab4bcb6e8134d962ad3e019e9f2" + }, + { + "path": "Moonlight iOS/Images.xcassets/ErrorOverlayIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "66c6dba5dd768c9359e4ef5c07118727f4d80350", + "size": 302, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/66c6dba5dd768c9359e4ef5c07118727f4d80350" + }, + { + "path": "Moonlight iOS/Images.xcassets/ErrorOverlayIcon.imageset/error.pdf", + "mode": "100644", + "type": "blob", + "sha": "f024de823e5cc3f57faf0dc31b9441dfedbbd5b7", + "size": 988, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f024de823e5cc3f57faf0dc31b9441dfedbbd5b7" + }, + { + "path": "Moonlight iOS/Images.xcassets/EscapeIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "2b9d9d4e060d01cd82f6daa9beefe566dbfd5897", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2b9d9d4e060d01cd82f6daa9beefe566dbfd5897" + }, + { + "path": "Moonlight iOS/Images.xcassets/EscapeIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "5533897a49f0096146f0fdfe9ee2979baae6794d", + "size": 308, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5533897a49f0096146f0fdfe9ee2979baae6794d" + }, + { + "path": "Moonlight iOS/Images.xcassets/EscapeIcon.imageset/EscapeIcon.png", + "mode": "100644", + "type": "blob", + "sha": "262f024c1aad14e4f4bc5ddd537929fdc12a73f8", + "size": 2900, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/262f024c1aad14e4f4bc5ddd537929fdc12a73f8" + }, + { + "path": "Moonlight iOS/Images.xcassets/L1.imageset", + "mode": "040000", + "type": "tree", + "sha": "4a7be4cfa7c5302ae74f59831e1902705de64282", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4a7be4cfa7c5302ae74f59831e1902705de64282" + }, + { + "path": "Moonlight iOS/Images.xcassets/L1.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "a2d194d0ba3a76fc17fcd06679d473c4d77bf040", + "size": 386, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a2d194d0ba3a76fc17fcd06679d473c4d77bf040" + }, + { + "path": "Moonlight iOS/Images.xcassets/L1.imageset/L1_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "c676d218119339b2d4faa22d3e5512b0c517da19", + "size": 6434, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c676d218119339b2d4faa22d3e5512b0c517da19" + }, + { + "path": "Moonlight iOS/Images.xcassets/L1.imageset/L1_40x40@1x.png", + "mode": "100644", + "type": "blob", + "sha": "7c69c086353e0a2dca5a8459b6e5c655da7fd6c0", + "size": 2722, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7c69c086353e0a2dca5a8459b6e5c655da7fd6c0" + }, + { + "path": "Moonlight iOS/Images.xcassets/L1.imageset/L1_80x80@2x.png", + "mode": "100644", + "type": "blob", + "sha": "c3f711013aaf8e94d205889f516adee567f75e17", + "size": 4425, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c3f711013aaf8e94d205889f516adee567f75e17" + }, + { + "path": "Moonlight iOS/Images.xcassets/L2.imageset", + "mode": "040000", + "type": "tree", + "sha": "4a1d10fa9e43b56dc97e69dc2f69f8065bc37a9a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4a1d10fa9e43b56dc97e69dc2f69f8065bc37a9a" + }, + { + "path": "Moonlight iOS/Images.xcassets/L2.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "edd902036c49ea06fd91a03285c592f5bdaef3a8", + "size": 348, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/edd902036c49ea06fd91a03285c592f5bdaef3a8" + }, + { + "path": "Moonlight iOS/Images.xcassets/L2.imageset/L2_120x120@2x.png", + "mode": "100644", + "type": "blob", + "sha": "ad72d5bcb970c75cb5b5f3ada1948b98d8a6e526", + "size": 8253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ad72d5bcb970c75cb5b5f3ada1948b98d8a6e526" + }, + { + "path": "Moonlight iOS/Images.xcassets/L2.imageset/L2_60x60@1x.png", + "mode": "100644", + "type": "blob", + "sha": "fefe8f62ead57e9d28186a1d64a94ea3f06c4490", + "size": 3970, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fefe8f62ead57e9d28186a1d64a94ea3f06c4490" + }, + { + "path": "Moonlight iOS/Images.xcassets/L3.imageset", + "mode": "040000", + "type": "tree", + "sha": "e49fc5d76037031c9c97da63d83700aa229582f4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e49fc5d76037031c9c97da63d83700aa229582f4" + }, + { + "path": "Moonlight iOS/Images.xcassets/L3.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "5c09745666b5adbd3d64a904b3740eb834637b22", + "size": 388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c09745666b5adbd3d64a904b3740eb834637b22" + }, + { + "path": "Moonlight iOS/Images.xcassets/L3.imageset/L3_160x160@2x.png", + "mode": "100644", + "type": "blob", + "sha": "98e4d9588c4925e06f15d3bf7c3894a28a6e7c8c", + "size": 11721, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/98e4d9588c4925e06f15d3bf7c3894a28a6e7c8c" + }, + { + "path": "Moonlight iOS/Images.xcassets/L3.imageset/L3_240x240@3x.png", + "mode": "100644", + "type": "blob", + "sha": "d8f2b10df363d0550aec390e460867b444a90338", + "size": 17317, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d8f2b10df363d0550aec390e460867b444a90338" + }, + { + "path": "Moonlight iOS/Images.xcassets/L3.imageset/L3_80x80@1x.png", + "mode": "100644", + "type": "blob", + "sha": "a15667812796d77f6cc62925934af5cbfc296163", + "size": 5631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a15667812796d77f6cc62925934af5cbfc296163" + }, + { + "path": "Moonlight iOS/Images.xcassets/LeftButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "9452671fbe850ad6422845d4e3486bb4791ce319", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9452671fbe850ad6422845d4e3486bb4791ce319" + }, + { + "path": "Moonlight iOS/Images.xcassets/LeftButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "e4ffafa9a7f34370e80f5d57a12161fbde6fab59", + "size": 351, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e4ffafa9a7f34370e80f5d57a12161fbde6fab59" + }, + { + "path": "Moonlight iOS/Images.xcassets/LeftButton.imageset/left_114x92@3x.png", + "mode": "100644", + "type": "blob", + "sha": "adfed54a0c3e72cac8052ef28dd5502629a4d49c", + "size": 3672, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adfed54a0c3e72cac8052ef28dd5502629a4d49c" + }, + { + "path": "Moonlight iOS/Images.xcassets/LeftButton.imageset/left_76x61@2x.png", + "mode": "100644", + "type": "blob", + "sha": "3ab41503b3f3fc957dceadbc47b4bd76be89932b", + "size": 525, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3ab41503b3f3fc957dceadbc47b4bd76be89932b" + }, + { + "path": "Moonlight iOS/Images.xcassets/LockedOverlayIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "fcd60a2a97cf86280be57b2d4b8c020b8e86c45d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fcd60a2a97cf86280be57b2d4b8c020b8e86c45d" + }, + { + "path": "Moonlight iOS/Images.xcassets/LockedOverlayIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "cdaf694424b8cf4051fb636fb1ac435262f49695", + "size": 301, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cdaf694424b8cf4051fb636fb1ac435262f49695" + }, + { + "path": "Moonlight iOS/Images.xcassets/LockedOverlayIcon.imageset/lock.pdf", + "mode": "100644", + "type": "blob", + "sha": "fe5b7374c073bdf9f951474492966b545aa022c1", + "size": 1132, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fe5b7374c073bdf9f951474492966b545aa022c1" + }, + { + "path": "Moonlight iOS/Images.xcassets/NoAppImage.imageset", + "mode": "040000", + "type": "tree", + "sha": "d89b667b73aed725cb44a8b8f8e01dd3ae870f4d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d89b667b73aed725cb44a8b8f8e01dd3ae870f4d" + }, + { + "path": "Moonlight iOS/Images.xcassets/NoAppImage.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "68259b8aeb914213259122ef4a5b7c5dd80bc812", + "size": 426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/68259b8aeb914213259122ef4a5b7c5dd80bc812" + }, + { + "path": "Moonlight iOS/Images.xcassets/NoAppImage.imageset/limelight_no_app_image_1x.png", + "mode": "100755", + "type": "blob", + "sha": "59eb1e97c49a894a1486f9611a63b4cf8200ff3b", + "size": 1102, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/59eb1e97c49a894a1486f9611a63b4cf8200ff3b" + }, + { + "path": "Moonlight iOS/Images.xcassets/NoAppImage.imageset/limelight_no_app_image_2x.png", + "mode": "100755", + "type": "blob", + "sha": "a94e7362ef915ce668850406fcf3064afbe62e94", + "size": 1479, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a94e7362ef915ce668850406fcf3064afbe62e94" + }, + { + "path": "Moonlight iOS/Images.xcassets/NoAppImage.imageset/limelight_no_app_image_3x.png", + "mode": "100755", + "type": "blob", + "sha": "4cbad3e0439718265ea3c96656475d0c83fd4a49", + "size": 1622, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4cbad3e0439718265ea3c96656475d0c83fd4a49" + }, + { + "path": "Moonlight iOS/Images.xcassets/Play.imageset", + "mode": "040000", + "type": "tree", + "sha": "d64e7df0d76c7e0dceaa26114bab200922ac68b6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d64e7df0d76c7e0dceaa26114bab200922ac68b6" + }, + { + "path": "Moonlight iOS/Images.xcassets/Play.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "e30bc55424e28ab0b276bcfebb3227e4caa64a88", + "size": 301, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e30bc55424e28ab0b276bcfebb3227e4caa64a88" + }, + { + "path": "Moonlight iOS/Images.xcassets/Play.imageset/play.png", + "mode": "100644", + "type": "blob", + "sha": "d03e6e6e1fc75ad8ca5a6e9e329797967dddd58e", + "size": 17407, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d03e6e6e1fc75ad8ca5a6e9e329797967dddd58e" + }, + { + "path": "Moonlight iOS/Images.xcassets/R1.imageset", + "mode": "040000", + "type": "tree", + "sha": "112414904b5c978e37e7beeb0b0efb8fd9c0820c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/112414904b5c978e37e7beeb0b0efb8fd9c0820c" + }, + { + "path": "Moonlight iOS/Images.xcassets/R1.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "3b0bce9987ce174979c720f1c2f9a9bb3c159fd7", + "size": 388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3b0bce9987ce174979c720f1c2f9a9bb3c159fd7" + }, + { + "path": "Moonlight iOS/Images.xcassets/R1.imageset/R1_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "537a24352159856e14d106e6bc0e3fe5b7da6fbe", + "size": 7682, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/537a24352159856e14d106e6bc0e3fe5b7da6fbe" + }, + { + "path": "Moonlight iOS/Images.xcassets/R1.imageset/R1_40x40@1x.png", + "mode": "100644", + "type": "blob", + "sha": "51abcd6633af40453c1cfff95eacaa16492b8b0e", + "size": 2869, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/51abcd6633af40453c1cfff95eacaa16492b8b0e" + }, + { + "path": "Moonlight iOS/Images.xcassets/R1.imageset/R1_80x80@1x-1.png", + "mode": "100644", + "type": "blob", + "sha": "c7a1da2077b5c68e980b13036c26d48e755e5e82", + "size": 5164, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c7a1da2077b5c68e980b13036c26d48e755e5e82" + }, + { + "path": "Moonlight iOS/Images.xcassets/R2.imageset", + "mode": "040000", + "type": "tree", + "sha": "0a5f090e3962af8d919b6f074d629e2044e3ee99", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0a5f090e3962af8d919b6f074d629e2044e3ee99" + }, + { + "path": "Moonlight iOS/Images.xcassets/R2.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "0c1a895b004e8ef36272b34ba32c985c61b8663d", + "size": 348, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0c1a895b004e8ef36272b34ba32c985c61b8663d" + }, + { + "path": "Moonlight iOS/Images.xcassets/R2.imageset/R2_120x120@2x.png", + "mode": "100644", + "type": "blob", + "sha": "fa7adb4804c440a5f5f1088a3e1911ed6f776b31", + "size": 9556, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fa7adb4804c440a5f5f1088a3e1911ed6f776b31" + }, + { + "path": "Moonlight iOS/Images.xcassets/R2.imageset/R2_60x60@1x.png", + "mode": "100644", + "type": "blob", + "sha": "6f6ad1f0a516d9d9f0c87d876899a6edaa5e6bd5", + "size": 4341, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6f6ad1f0a516d9d9f0c87d876899a6edaa5e6bd5" + }, + { + "path": "Moonlight iOS/Images.xcassets/R3.imageset", + "mode": "040000", + "type": "tree", + "sha": "fd17fe42e5b046096884dd5584edccc6381d5a6b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fd17fe42e5b046096884dd5584edccc6381d5a6b" + }, + { + "path": "Moonlight iOS/Images.xcassets/R3.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "de75fdf08c0a4d0b3e621fe5b25405edc140abb3", + "size": 388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de75fdf08c0a4d0b3e621fe5b25405edc140abb3" + }, + { + "path": "Moonlight iOS/Images.xcassets/R3.imageset/R3_160x160@2x.png", + "mode": "100644", + "type": "blob", + "sha": "f7791e6490b017d7dfccd64bb1af18c5518733c9", + "size": 13398, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f7791e6490b017d7dfccd64bb1af18c5518733c9" + }, + { + "path": "Moonlight iOS/Images.xcassets/R3.imageset/R3_240x240@3x.png", + "mode": "100644", + "type": "blob", + "sha": "cd2f172fecf4953ad5429fd1144fcde0a8dc1faa", + "size": 19974, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cd2f172fecf4953ad5429fd1144fcde0a8dc1faa" + }, + { + "path": "Moonlight iOS/Images.xcassets/R3.imageset/R3_80x80@1x.png", + "mode": "100644", + "type": "blob", + "sha": "319dacd00ca7987e3ce7ec9de54256079a8940b2", + "size": 6300, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/319dacd00ca7987e3ce7ec9de54256079a8940b2" + }, + { + "path": "Moonlight iOS/Images.xcassets/RightButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "a52c1c79ae40181f86cac7e9de9038b96141373b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a52c1c79ae40181f86cac7e9de9038b96141373b" + }, + { + "path": "Moonlight iOS/Images.xcassets/RightButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "31e1dcb0e7b43c2b394281e8c1301220f6a934fb", + "size": 353, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/31e1dcb0e7b43c2b394281e8c1301220f6a934fb" + }, + { + "path": "Moonlight iOS/Images.xcassets/RightButton.imageset/right_114x93@3x.png", + "mode": "100644", + "type": "blob", + "sha": "2db167f3b31885cde184c5d8a48a34557e57b6e0", + "size": 3624, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2db167f3b31885cde184c5d8a48a34557e57b6e0" + }, + { + "path": "Moonlight iOS/Images.xcassets/RightButton.imageset/right_75x61@2x.png", + "mode": "100644", + "type": "blob", + "sha": "c717a8dcbc939499c07c0ce4984ac0367cfa249d", + "size": 549, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c717a8dcbc939499c07c0ce4984ac0367cfa249d" + }, + { + "path": "Moonlight iOS/Images.xcassets/SelectButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "38d292d5e6522565f7efe6b19e74ef0331fa71c1", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/38d292d5e6522565f7efe6b19e74ef0331fa71c1" + }, + { + "path": "Moonlight iOS/Images.xcassets/SelectButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "f62ac9beab6fea1e716689123fa0ddb123f0c25a", + "size": 419, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f62ac9beab6fea1e716689123fa0ddb123f0c25a" + }, + { + "path": "Moonlight iOS/Images.xcassets/SelectButton.imageset/select_button_108x48@2x.png", + "mode": "100644", + "type": "blob", + "sha": "4969cdd335d7551bfe0790ae6109979d3cd51231", + "size": 735, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4969cdd335d7551bfe0790ae6109979d3cd51231" + }, + { + "path": "Moonlight iOS/Images.xcassets/SelectButton.imageset/select_button_162x72@3x.png", + "mode": "100644", + "type": "blob", + "sha": "27de27a8d93312020ee6dc0e107bd47a2be04d1f", + "size": 5279, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27de27a8d93312020ee6dc0e107bd47a2be04d1f" + }, + { + "path": "Moonlight iOS/Images.xcassets/SelectButton.imageset/select_button_54x24@1x.png", + "mode": "100644", + "type": "blob", + "sha": "32b2e99be1c810ff23d72571740148b4a2eb3ad5", + "size": 1671, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32b2e99be1c810ff23d72571740148b4a2eb3ad5" + }, + { + "path": "Moonlight iOS/Images.xcassets/ShiftIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "29272fe1422ed93ab246f6a41ecf6ede4123ea27", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/29272fe1422ed93ab246f6a41ecf6ede4123ea27" + }, + { + "path": "Moonlight iOS/Images.xcassets/ShiftIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "12d9131a7da7b7486bfdcaa27afebefe7abf77d9", + "size": 307, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/12d9131a7da7b7486bfdcaa27afebefe7abf77d9" + }, + { + "path": "Moonlight iOS/Images.xcassets/ShiftIcon.imageset/ShiftIcon.png", + "mode": "100644", + "type": "blob", + "sha": "3e33f4a9bb03ae71b01435681e1e34f4645eaf6f", + "size": 719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e33f4a9bb03ae71b01435681e1e34f4645eaf6f" + }, + { + "path": "Moonlight iOS/Images.xcassets/StartButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "a03033658d314ae3e26caeb7a98fcce92c973909", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a03033658d314ae3e26caeb7a98fcce92c973909" + }, + { + "path": "Moonlight iOS/Images.xcassets/StartButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "0902a5ae9bc67fc5b6971be1ea38d76dbb23c8c7", + "size": 416, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0902a5ae9bc67fc5b6971be1ea38d76dbb23c8c7" + }, + { + "path": "Moonlight iOS/Images.xcassets/StartButton.imageset/start_button_108x48@2x.png", + "mode": "100644", + "type": "blob", + "sha": "c60040457700a5e25c1482a940fe952786014d65", + "size": 774, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c60040457700a5e25c1482a940fe952786014d65" + }, + { + "path": "Moonlight iOS/Images.xcassets/StartButton.imageset/start_button_162x72@3x.png", + "mode": "100644", + "type": "blob", + "sha": "f6bfa9c9c090816af65e7c31fc47ce60c68eaa56", + "size": 4930, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f6bfa9c9c090816af65e7c31fc47ce60c68eaa56" + }, + { + "path": "Moonlight iOS/Images.xcassets/StartButton.imageset/start_button_54x24@1x.png", + "mode": "100644", + "type": "blob", + "sha": "ff9b0be3a55c8bb305b635131e8b93a2db6f1bf3", + "size": 1567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff9b0be3a55c8bb305b635131e8b93a2db6f1bf3" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickInner.imageset", + "mode": "040000", + "type": "tree", + "sha": "e1b1f0484dedad696c768cd95a2aeae64d5ba2df", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e1b1f0484dedad696c768cd95a2aeae64d5ba2df" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickInner.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "6b13eb09bf51041122ce93d246b5808df7634d9f", + "size": 413, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b13eb09bf51041122ce93d246b5808df7634d9f" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickInner.imageset/stick_inner_144x146@3x.png", + "mode": "100644", + "type": "blob", + "sha": "5471a5a25ec1bb2275e3b9777154d5cf8df4f504", + "size": 6536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5471a5a25ec1bb2275e3b9777154d5cf8df4f504" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickInner.imageset/stick_inner_48x49@1x.png", + "mode": "100644", + "type": "blob", + "sha": "779c6a279cad86250269ce6ff99f5524484f1b0f", + "size": 2113, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/779c6a279cad86250269ce6ff99f5524484f1b0f" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickInner.imageset/stick_inner_96x97@2x.png", + "mode": "100644", + "type": "blob", + "sha": "c09763aba5e458146fb9deb52b3081bde0727388", + "size": 1104, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c09763aba5e458146fb9deb52b3081bde0727388" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickOuter.imageset", + "mode": "040000", + "type": "tree", + "sha": "a4cf94413ca68ee87e50b1ea52833387bc03839f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a4cf94413ca68ee87e50b1ea52833387bc03839f" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickOuter.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "4048b3fd948a31aa143f04b0d9ec619403ba66f2", + "size": 415, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4048b3fd948a31aa143f04b0d9ec619403ba66f2" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickOuter.imageset/stick_outer_160x160@2x.png", + "mode": "100644", + "type": "blob", + "sha": "5748edeaef21da1723a186abc4cf13c9ef17d5ee", + "size": 1678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5748edeaef21da1723a186abc4cf13c9ef17d5ee" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickOuter.imageset/stick_outer_240x240@3x.png", + "mode": "100644", + "type": "blob", + "sha": "f8d5d5f5c00daf2869a8acbacf7b4fb8ef55ef5e", + "size": 12104, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f8d5d5f5c00daf2869a8acbacf7b4fb8ef55ef5e" + }, + { + "path": "Moonlight iOS/Images.xcassets/StickOuter.imageset/stick_outer_80x80@1x.png", + "mode": "100644", + "type": "blob", + "sha": "40b55be27c7ce77e279d5d5289c1c53294f6a990", + "size": 3645, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/40b55be27c7ce77e279d5d5289c1c53294f6a990" + }, + { + "path": "Moonlight iOS/Images.xcassets/TabIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "09f27c66ea8dedd091f7ef4136fa97212628874e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/09f27c66ea8dedd091f7ef4136fa97212628874e" + }, + { + "path": "Moonlight iOS/Images.xcassets/TabIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "fd7d96eec066a87075a93790aee136b3e1085670", + "size": 305, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd7d96eec066a87075a93790aee136b3e1085670" + }, + { + "path": "Moonlight iOS/Images.xcassets/TabIcon.imageset/TabIcon.png", + "mode": "100644", + "type": "blob", + "sha": "f562b1d3918097a702120785031fae05c5d82792", + "size": 2707, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f562b1d3918097a702120785031fae05c5d82792" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "1b42797471bba5c0b2aabe5f0b4f182db94f4c1e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1b42797471bba5c0b2aabe5f0b4f182db94f4c1e" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "280a9b96150423e870a137e6062df4ca6c407f2c", + "size": 347, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/280a9b96150423e870a137e6062df4ca6c407f2c" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpButton.imageset/up_61x76@2x.png", + "mode": "100644", + "type": "blob", + "sha": "a2b194ede9056d6d1af9d5daaf42d9c1658e1463", + "size": 452, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a2b194ede9056d6d1af9d5daaf42d9c1658e1463" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpButton.imageset/up_93x116@3x.png", + "mode": "100644", + "type": "blob", + "sha": "2549cff84f231ed506b583bfcd940b3b7c3ee572", + "size": 3456, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2549cff84f231ed506b583bfcd940b3b7c3ee572" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "a3b514cab927d00dca13b77654279692c8da2d70", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a3b514cab927d00dca13b77654279692c8da2d70" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "0f0fff7be78e4c45b7bf4411495b4e6bbf3ec790", + "size": 305, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f0fff7be78e4c45b7bf4411495b4e6bbf3ec790" + }, + { + "path": "Moonlight iOS/Images.xcassets/UpIcon.imageset/up_arrow.pdf", + "mode": "100644", + "type": "blob", + "sha": "1fa5a70fa88da43e98eb64b622b54b54573d7572", + "size": 990, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1fa5a70fa88da43e98eb64b622b54b54573d7572" + }, + { + "path": "Moonlight iOS/Images.xcassets/WindowsIcon.imageset", + "mode": "040000", + "type": "tree", + "sha": "4427cfd08733775174f455e9285211f55e07e665", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4427cfd08733775174f455e9285211f55e07e665" + }, + { + "path": "Moonlight iOS/Images.xcassets/WindowsIcon.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "778eea37facb1698c91328bcb4a8cc9874a5d2aa", + "size": 309, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/778eea37facb1698c91328bcb4a8cc9874a5d2aa" + }, + { + "path": "Moonlight iOS/Images.xcassets/WindowsIcon.imageset/WindowsIcon.png", + "mode": "100644", + "type": "blob", + "sha": "60dec54464f5efcbac3b2dec145a37d22d802ab9", + "size": 2534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/60dec54464f5efcbac3b2dec145a37d22d802ab9" + }, + { + "path": "Moonlight iOS/Images.xcassets/XButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "b4aed7ec0fe048a9c1a2c5a0e944520797e7d0a0", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b4aed7ec0fe048a9c1a2c5a0e944520797e7d0a0" + }, + { + "path": "Moonlight iOS/Images.xcassets/XButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "f3967aa1b5b9ea246f81d91ce5aa42d3f4ad50ec", + "size": 360, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f3967aa1b5b9ea246f81d91ce5aa42d3f4ad50ec" + }, + { + "path": "Moonlight iOS/Images.xcassets/XButton.imageset/x_button_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "77a15a9c8b821c3f55d8de591e1faaf24f188ebc", + "size": 7108, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/77a15a9c8b821c3f55d8de591e1faaf24f188ebc" + }, + { + "path": "Moonlight iOS/Images.xcassets/XButton.imageset/x_button_80x80@2x.png", + "mode": "100644", + "type": "blob", + "sha": "125ce38ef01f1a282ea8f9721efac9840d337898", + "size": 1078, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/125ce38ef01f1a282ea8f9721efac9840d337898" + }, + { + "path": "Moonlight iOS/Images.xcassets/YButton.imageset", + "mode": "040000", + "type": "tree", + "sha": "79b8889f3eed33749838fd4535c07bfc93671558", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/79b8889f3eed33749838fd4535c07bfc93671558" + }, + { + "path": "Moonlight iOS/Images.xcassets/YButton.imageset/Contents.json", + "mode": "100644", + "type": "blob", + "sha": "501e9fa0f69c2832579e85466cb9f3a2a774e004", + "size": 360, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/501e9fa0f69c2832579e85466cb9f3a2a774e004" + }, + { + "path": "Moonlight iOS/Images.xcassets/YButton.imageset/y_button_120x120@3x.png", + "mode": "100644", + "type": "blob", + "sha": "6e64408dd21ea9a688beb9e1bafced568f1abd9f", + "size": 6398, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e64408dd21ea9a688beb9e1bafced568f1abd9f" + }, + { + "path": "Moonlight iOS/Images.xcassets/YButton.imageset/y_button_80x80@2x.png", + "mode": "100644", + "type": "blob", + "sha": "626f2240e2f1c14d2168ff166e4304228d24f6f0", + "size": 969, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/626f2240e2f1c14d2168ff166e4304228d24f6f0" + }, + { + "path": "Moonlight iOS/Launch Screen.xib", + "mode": "100644", + "type": "blob", + "sha": "c238181f327a4e8d9614199ddc48b1d9e239d2f3", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c238181f327a4e8d9614199ddc48b1d9e239d2f3" + }, + { + "path": "Moonlight iOS/UIAppView.h", + "mode": "100644", + "type": "blob", + "sha": "9cb26895c19d384715dc9ed9ef1a3b71cafa9963", + "size": 617, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cb26895c19d384715dc9ed9ef1a3b71cafa9963" + }, + { + "path": "Moonlight iOS/UIAppView.m", + "mode": "100644", + "type": "blob", + "sha": "a55e17be4346e1f84960a8417aaef83cee69fa16", + "size": 7962, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a55e17be4346e1f84960a8417aaef83cee69fa16" + }, + { + "path": "Moonlight iOS/UIComputerView.h", + "mode": "100644", + "type": "blob", + "sha": "b717afd28a653acf5de3ebaa62a040a73473679f", + "size": 684, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b717afd28a653acf5de3ebaa62a040a73473679f" + }, + { + "path": "Moonlight iOS/UIComputerView.m", + "mode": "100644", + "type": "blob", + "sha": "722e4ec839a5e04028cb5deae576f0701a8ea0f4", + "size": 7342, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/722e4ec839a5e04028cb5deae576f0701a8ea0f4" + }, + { + "path": "Moonlight iOS/ViewControllers", + "mode": "040000", + "type": "tree", + "sha": "d1e8663fafe43656128d466dcd212c96923b031c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d1e8663fafe43656128d466dcd212c96923b031c" + }, + { + "path": "Moonlight iOS/ViewControllers/LoadingFrameViewController.h", + "mode": "100644", + "type": "blob", + "sha": "eb48071d72be8e6b762e8b3296de80e44a5a521c", + "size": 457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb48071d72be8e6b762e8b3296de80e44a5a521c" + }, + { + "path": "Moonlight iOS/ViewControllers/LoadingFrameViewController.m", + "mode": "100644", + "type": "blob", + "sha": "550ea60ac4dfbdc89c93620fde3d1f390033ce06", + "size": 2577, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/550ea60ac4dfbdc89c93620fde3d1f390033ce06" + }, + { + "path": "Moonlight iOS/ViewControllers/MainFrameViewController.h", + "mode": "100644", + "type": "blob", + "sha": "09aea735ed788b90cc1a6a85df683d6d7d9e0cf0", + "size": 743, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/09aea735ed788b90cc1a6a85df683d6d7d9e0cf0" + }, + { + "path": "Moonlight iOS/ViewControllers/MainFrameViewController.m", + "mode": "100644", + "type": "blob", + "sha": "68de596f2ea287e74a41c1e42b80742e61e379ca", + "size": 62042, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/68de596f2ea287e74a41c1e42b80742e61e379ca" + }, + { + "path": "Moonlight iOS/ViewControllers/SWRevealViewController.h", + "mode": "100755", + "type": "blob", + "sha": "3eea2633dfb8ae48430d9c0db7ea99b6803692a7", + "size": 22895, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3eea2633dfb8ae48430d9c0db7ea99b6803692a7" + }, + { + "path": "Moonlight iOS/ViewControllers/SWRevealViewController.m", + "mode": "100755", + "type": "blob", + "sha": "bf648031fc5db24f6f7987bfb539bfb6231da42f", + "size": 68221, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf648031fc5db24f6f7987bfb539bfb6231da42f" + }, + { + "path": "Moonlight iOS/ViewControllers/SettingsViewController.h", + "mode": "100644", + "type": "blob", + "sha": "1a79162da010cd3855d1f954c858e58bb97613d2", + "size": 1853, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1a79162da010cd3855d1f954c858e58bb97613d2" + }, + { + "path": "Moonlight iOS/ViewControllers/SettingsViewController.m", + "mode": "100644", + "type": "blob", + "sha": "0e4727ce8de9f24b54251a501800e5fa17274576", + "size": 23796, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0e4727ce8de9f24b54251a501800e5fa17274576" + }, + { + "path": "Moonlight iOS/ViewControllers/StreamFrameViewController.h", + "mode": "100644", + "type": "blob", + "sha": "7f0155a401a3a6cd3d1e9701d54950dccef69be8", + "size": 962, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7f0155a401a3a6cd3d1e9701d54950dccef69be8" + }, + { + "path": "Moonlight iOS/ViewControllers/StreamFrameViewController.m", + "mode": "100644", + "type": "blob", + "sha": "332331db8455d43741aad7162265f0e42363a779", + "size": 30991, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/332331db8455d43741aad7162265f0e42363a779" + }, + { + "path": "Moonlight iOS/iPad.storyboard", + "mode": "100644", + "type": "blob", + "sha": "9017b15b91c18852597939d7fcfbf1c91d089b81", + "size": 45119, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9017b15b91c18852597939d7fcfbf1c91d089b81" + }, + { + "path": "Moonlight iOS/iPhone.storyboard", + "mode": "100644", + "type": "blob", + "sha": "03aa007501391bf4d6fbccba362c6cdb8959119b", + "size": 44748, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/03aa007501391bf4d6fbccba362c6cdb8959119b" + }, + { + "path": "Moonlight.xcodeproj", + "mode": "040000", + "type": "tree", + "sha": "0a8831f434b09572a25b4c4d876955466fa60a9a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0a8831f434b09572a25b4c4d876955466fa60a9a" + }, + { + "path": "Moonlight.xcodeproj/project.pbxproj", + "mode": "100644", + "type": "blob", + "sha": "47f70b5ff1ddfce6ff16fe8b609fcaf088d722c8", + "size": 149482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/47f70b5ff1ddfce6ff16fe8b609fcaf088d722c8" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace", + "mode": "040000", + "type": "tree", + "sha": "7a28455f3dbe96568bfda34e97c4a21e85134855", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7a28455f3dbe96568bfda34e97c4a21e85134855" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata", + "mode": "100644", + "type": "blob", + "sha": "919434a6254f0e9651f402737811be6634a03e9c", + "size": 135, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/919434a6254f0e9651f402737811be6634a03e9c" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata", + "mode": "040000", + "type": "tree", + "sha": "9afb8dab8a06b93bdb859685dc04bd55e508e890", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9afb8dab8a06b93bdb859685dc04bd55e508e890" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist", + "mode": "100644", + "type": "blob", + "sha": "18d981003d68d0546c4804ac2ff47dd97c6e7921", + "size": 238, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/18d981003d68d0546c4804ac2ff47dd97c6e7921" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/Limelight.xccheckout", + "mode": "100644", + "type": "blob", + "sha": "6aa8b3a75d13ecbc9249c3c952ff10bc01a4851a", + "size": 2022, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6aa8b3a75d13ecbc9249c3c952ff10bc01a4851a" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/Moonlight.xccheckout", + "mode": "100644", + "type": "blob", + "sha": "70c836b85991931edb6510ba62985c5a7f761b80", + "size": 2022, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/70c836b85991931edb6510ba62985c5a7f761b80" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/project.xccheckout", + "mode": "100644", + "type": "blob", + "sha": "d88df67debd339c89407c645a3fc3af7d84ee348", + "size": 2040, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d88df67debd339c89407c645a3fc3af7d84ee348" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/swiftpm", + "mode": "040000", + "type": "tree", + "sha": "8b2dea77f68f61226102bf53a573a57875fe8b9d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8b2dea77f68f61226102bf53a573a57875fe8b9d" + }, + { + "path": "Moonlight.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved", + "mode": "100644", + "type": "blob", + "sha": "8d2617ac9694d9341c1eb941144938f351976ad2", + "size": 664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8d2617ac9694d9341c1eb941144938f351976ad2" + }, + { + "path": "OpenSSL.xcframework", + "mode": "040000", + "type": "tree", + "sha": "42f865f7e178a3bbe6144badf5f32fb1eb6164ef", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/42f865f7e178a3bbe6144badf5f32fb1eb6164ef" + }, + { + "path": "OpenSSL.xcframework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "ce2d3a78d42f9ffe9bffb16dcbdf70712523dd44", + "size": 4675, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce2d3a78d42f9ffe9bffb16dcbdf70712523dd44" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "e68a95c47edf33bb9400af07e3ede503bc37eb78", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e68a95c47edf33bb9400af07e3ede503bc37eb78" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature/CodeDirectory", + "mode": "100644", + "type": "blob", + "sha": "ff04d85d50c0c5eeb4b6afb17c2eebafe14e40f7", + "size": 151, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff04d85d50c0c5eeb4b6afb17c2eebafe14e40f7" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature/CodeRequirements", + "mode": "100644", + "type": "blob", + "sha": "5a9743ff5ebc019a2ffb53ba5e8d2a90b64c1d74", + "size": 176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5a9743ff5ebc019a2ffb53ba5e8d2a90b64c1d74" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature/CodeRequirements-1", + "mode": "100644", + "type": "blob", + "sha": "ce51ee9c2bc549f5f07120554feb27b9ef14cb61", + "size": 199, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce51ee9c2bc549f5f07120554feb27b9ef14cb61" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "0dcc23177051e6497b0e8a5d497909897d24cd60", + "size": 547162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0dcc23177051e6497b0e8a5d497909897d24cd60" + }, + { + "path": "OpenSSL.xcframework/_CodeSignature/CodeSignature", + "mode": "100644", + "type": "blob", + "sha": "64ee324110ed3ba8783bcdc2eff3a98837bb6cb7", + "size": 9184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64ee324110ed3ba8783bcdc2eff3a98837bb6cb7" + }, + { + "path": "OpenSSL.xcframework/ios-arm64", + "mode": "040000", + "type": "tree", + "sha": "d6e4d1cbb8dcc24e7e945fbe592aa9344caa6f99", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d6e4d1cbb8dcc24e7e945fbe592aa9344caa6f99" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "3a1f2288ed0df698ca4aaa1f5f018a38cb5790cb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/3a1f2288ed0df698ca4aaa1f5f018a38cb5790cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "bcc898c39f16dee7755cedb11a4a6615974e9203", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bcc898c39f16dee7755cedb11a4a6615974e9203" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "1dacd74f2f9c29c6891dca71905016a4bf19c290", + "size": 4290, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1dacd74f2f9c29c6891dca71905016a4bf19c290" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "e63a4d0c863e01bb76a2718e0fa0c125df2db93f", + "size": 770, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e63a4d0c863e01bb76a2718e0fa0c125df2db93f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "f7adcca5a70692a21d5a1fa80983c01697582f10", + "size": 4363056, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f7adcca5a70692a21d5a1fa80983c01697582f10" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "bbf2be4f906b665fe5265f52d35a45f5efb67c41", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bbf2be4f906b665fe5265f52d35a45f5efb67c41" + }, + { + "path": "OpenSSL.xcframework/ios-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "1f5da04d332fcbbb1dcbe10973977d541596817d", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5da04d332fcbbb1dcbe10973977d541596817d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst", + "mode": "040000", + "type": "tree", + "sha": "8bae49c5416110d883a927a24bc7b815151b2931", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8bae49c5416110d883a927a24bc7b815151b2931" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "f9029935197be90b7479820e20de44f99fe516eb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/f9029935197be90b7479820e20de44f99fe516eb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Headers", + "mode": "120000", + "type": "blob", + "sha": "a177d2a6b92600696030834c319f5e1434f9ee6a", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a177d2a6b92600696030834c319f5e1434f9ee6a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Modules", + "mode": "120000", + "type": "blob", + "sha": "5736f3186e797b8b787748c9979d0fed3b0536c3", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5736f3186e797b8b787748c9979d0fed3b0536c3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/OpenSSL", + "mode": "120000", + "type": "blob", + "sha": "79c9cbef65c7b39c087f85020a629ff38b093c19", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79c9cbef65c7b39c087f85020a629ff38b093c19" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Resources", + "mode": "120000", + "type": "blob", + "sha": "953ee36f3bb709faf58a351e0b33c353e337c0a2", + "size": 26, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953ee36f3bb709faf58a351e0b33c353e337c0a2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions", + "mode": "040000", + "type": "tree", + "sha": "cce91e802d9d07232bb94a55b1209107c2168746", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/cce91e802d9d07232bb94a55b1209107c2168746" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A", + "mode": "040000", + "type": "tree", + "sha": "b29ef7d4565e3b95ca2250d3dea8d4b4282f287b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b29ef7d4565e3b95ca2250d3dea8d4b4282f287b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers", + "mode": "040000", + "type": "tree", + "sha": "2dda8fa35f1300847de986d568945aa76a259327", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2dda8fa35f1300847de986d568945aa76a259327" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "775e0c381a9601471e9fb4f07e1932792f1b2985", + "size": 4295, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/775e0c381a9601471e9fb4f07e1932792f1b2985" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2a55da517387989d699110338a849af1b0b40d0f", + "size": 8884160, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a55da517387989d699110338a849af1b0b40d0f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources", + "mode": "040000", + "type": "tree", + "sha": "de6848c35a59d57c43c209b4ed36be680bf6eb6c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/de6848c35a59d57c43c209b4ed36be680bf6eb6c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "33144952bd71edefbaba7d156087e7af482711d0", + "size": 1366, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/33144952bd71edefbaba7d156087e7af482711d0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/Resources/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "83c5b7d1bc58cad30575f61f6d2c0d0b9abd22da", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/83c5b7d1bc58cad30575f61f6d2c0d0b9abd22da" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/A/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "d8a60f1df8491a6f2dfd13437ef071fab44a2eb4", + "size": 22138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d8a60f1df8491a6f2dfd13437ef071fab44a2eb4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-maccatalyst/OpenSSL.framework/Versions/Current", + "mode": "120000", + "type": "blob", + "sha": "8c7e5a667f1b771847fe88c01c3de34413a1b220", + "size": 1, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c7e5a667f1b771847fe88c01c3de34413a1b220" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "93c50431e5fee03548f4d9a75e4ec1079e8667b3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/93c50431e5fee03548f4d9a75e4ec1079e8667b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "46b09ec00024704d8333c91d0ff2867264f55ac6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/46b09ec00024704d8333c91d0ff2867264f55ac6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "5edf9e50bb0ef661f8de7cedfa4005ffb8832594", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5edf9e50bb0ef661f8de7cedfa4005ffb8832594" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "1dacd74f2f9c29c6891dca71905016a4bf19c290", + "size": 4290, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1dacd74f2f9c29c6891dca71905016a4bf19c290" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "dbb80d1d24bcad0bfa2f0732a878b98200d0d1bf", + "size": 750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dbb80d1d24bcad0bfa2f0732a878b98200d0d1bf" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "4446a443b15793f5ac200265db9d005457084adb", + "size": 8901168, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4446a443b15793f5ac200265db9d005457084adb" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "1a7cffab82202397bb15d415e7b445ea7843088b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1a7cffab82202397bb15d415e7b445ea7843088b" + }, + { + "path": "OpenSSL.xcframework/ios-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "13269e6b204a69d328312aac210e3d6278edf848", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13269e6b204a69d328312aac210e3d6278edf848" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64", + "mode": "040000", + "type": "tree", + "sha": "905b5f1cd4cdbd4c3dad6b0148bf83a79bac0d5a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/905b5f1cd4cdbd4c3dad6b0148bf83a79bac0d5a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "bb9e44e9a54986f89e1a4210213d9af239fe5aae", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/bb9e44e9a54986f89e1a4210213d9af239fe5aae" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Headers", + "mode": "120000", + "type": "blob", + "sha": "a177d2a6b92600696030834c319f5e1434f9ee6a", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a177d2a6b92600696030834c319f5e1434f9ee6a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Modules", + "mode": "120000", + "type": "blob", + "sha": "5736f3186e797b8b787748c9979d0fed3b0536c3", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5736f3186e797b8b787748c9979d0fed3b0536c3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/OpenSSL", + "mode": "120000", + "type": "blob", + "sha": "79c9cbef65c7b39c087f85020a629ff38b093c19", + "size": 24, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79c9cbef65c7b39c087f85020a629ff38b093c19" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Resources", + "mode": "120000", + "type": "blob", + "sha": "953ee36f3bb709faf58a351e0b33c353e337c0a2", + "size": 26, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953ee36f3bb709faf58a351e0b33c353e337c0a2" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions", + "mode": "040000", + "type": "tree", + "sha": "c59a1b7eb3777a661610fdc2747348775a1e687f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c59a1b7eb3777a661610fdc2747348775a1e687f" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A", + "mode": "040000", + "type": "tree", + "sha": "482998a9a2b132df4dda85e5cc7823fb5f2bf2f4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/482998a9a2b132df4dda85e5cc7823fb5f2bf2f4" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers", + "mode": "040000", + "type": "tree", + "sha": "2dda8fa35f1300847de986d568945aa76a259327", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2dda8fa35f1300847de986d568945aa76a259327" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "775e0c381a9601471e9fb4f07e1932792f1b2985", + "size": 4295, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/775e0c381a9601471e9fb4f07e1932792f1b2985" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "d436fa5d1b4a28cc2116606e9fd023e0934eed48", + "size": 8901424, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d436fa5d1b4a28cc2116606e9fd023e0934eed48" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources", + "mode": "040000", + "type": "tree", + "sha": "8227cfa7535a3b2d81b321f7fa9bf8273649b82e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8227cfa7535a3b2d81b321f7fa9bf8273649b82e" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "88f5c2003ae34d424568994d59b6bbe8337a8ed7", + "size": 1297, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88f5c2003ae34d424568994d59b6bbe8337a8ed7" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/Resources/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "2b5dd7c646e07ed104e39886b033ed06d5be6594", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2b5dd7c646e07ed104e39886b033ed06d5be6594" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/A/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "f5dc838ccf1ddb64d99088daba5da662166cd16a", + "size": 22138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f5dc838ccf1ddb64d99088daba5da662166cd16a" + }, + { + "path": "OpenSSL.xcframework/macos-arm64_x86_64/OpenSSL.framework/Versions/Current", + "mode": "120000", + "type": "blob", + "sha": "8c7e5a667f1b771847fe88c01c3de34413a1b220", + "size": 1, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c7e5a667f1b771847fe88c01c3de34413a1b220" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64", + "mode": "040000", + "type": "tree", + "sha": "8a0dc36684ddc8c451d6fe31927444a0f5b28657", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8a0dc36684ddc8c451d6fe31927444a0f5b28657" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "8ff5c88a0d50e880ffb253d4ef38130b9cfef019", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8ff5c88a0d50e880ffb253d4ef38130b9cfef019" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "9220b679479b18f90bc2a2fdf4d009d05171fde3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9220b679479b18f90bc2a2fdf4d009d05171fde3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8", + "size": 4353, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "ca854c34c6c1fd7acc58282e0acac1fdb599a8ea", + "size": 720, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca854c34c6c1fd7acc58282e0acac1fdb599a8ea" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2fb882ef5dbb695afa7320ab09fd4670275d4efb", + "size": 4363056, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2fb882ef5dbb695afa7320ab09fd4670275d4efb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "0af5f392110c7d3ed3c3641b690ac730c0ba2b25", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0af5f392110c7d3ed3c3641b690ac730c0ba2b25" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "191d772f3b64e393a8498e867a163e11d741a0c0", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/191d772f3b64e393a8498e867a163e11d741a0c0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "9fb9e4796dcd45d01f7fe67dce93cc4ac15b16f7", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9fb9e4796dcd45d01f7fe67dce93cc4ac15b16f7" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "11d4dade270a9f5c329e14c88e9f447dab1486a2", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/11d4dade270a9f5c329e14c88e9f447dab1486a2" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "22021713f4f7cdd9a518226642f57a55d7eef088", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/22021713f4f7cdd9a518226642f57a55d7eef088" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8", + "size": 4353, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec23fdc0687fdd7457c10ce6d95e7ab9bc3419d8" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "577aca59a40cbb1addbcddc8347a0ec90c0d1d87", + "size": 747, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/577aca59a40cbb1addbcddc8347a0ec90c0d1d87" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "3e796dc9eb83a2f706fe7d5b4c678b46ef27363e", + "size": 8901184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e796dc9eb83a2f706fe7d5b4c678b46ef27363e" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "5c8372277d1259e41ae8b197ef6f28d7c1ead1ab", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5c8372277d1259e41ae8b197ef6f28d7c1ead1ab" + }, + { + "path": "OpenSSL.xcframework/tvos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "efd4aa387ec83dba75d932163b5db01e8832ae20", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/efd4aa387ec83dba75d932163b5db01e8832ae20" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k", + "mode": "040000", + "type": "tree", + "sha": "5793035294f6a228daf73085dd03a1813c1212a4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5793035294f6a228daf73085dd03a1813c1212a4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "6b4c5c0ad4c3e610ecfa29118fe99bd23470bd03", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6b4c5c0ad4c3e610ecfa29118fe99bd23470bd03" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "9d2c115fd6eb5f63abaaa3a5f97794fa4480b32f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9d2c115fd6eb5f63abaaa3a5f97794fa4480b32f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ccd77db9da4f4ac8995735e790dafb2157e3e2de", + "size": 4359, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ccd77db9da4f4ac8995735e790dafb2157e3e2de" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "342e3a4f1c2d27595f672f93bd864363e8279b8f", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/342e3a4f1c2d27595f672f93bd864363e8279b8f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "2803c46a67ce4cada7ece29df876a673cfd9f476", + "size": 713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2803c46a67ce4cada7ece29df876a673cfd9f476" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "2a0be17bc1b7740f2adb93d50efa36c232f525af", + "size": 12051280, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a0be17bc1b7740f2adb93d50efa36c232f525af" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "0054fa2d16d52c1a69b2e2ccd9b204b751a7e90f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0054fa2d16d52c1a69b2e2ccd9b204b751a7e90f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_arm64_32_armv7k/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "71db764dc686de3b259c615f9d01e31b8b5adf50", + "size": 42976, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/71db764dc686de3b259c615f9d01e31b8b5adf50" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "db3ff7fe2ff019431931d98f915ea256be20ae9a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/db3ff7fe2ff019431931d98f915ea256be20ae9a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "d91038d5186ec990b1051e12e831516b96e8c038", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d91038d5186ec990b1051e12e831516b96e8c038" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "699364e889eba46eb05af355aa9cfc35d7288e41", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/699364e889eba46eb05af355aa9cfc35d7288e41" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "ccd77db9da4f4ac8995735e790dafb2157e3e2de", + "size": 4359, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ccd77db9da4f4ac8995735e790dafb2157e3e2de" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "0274ad4bf0a970ad5c027fa04536ced180ffba39", + "size": 736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0274ad4bf0a970ad5c027fa04536ced180ffba39" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "0b605fe2dced681b0ddc410bfbb25d669e26d3e6", + "size": 8867536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b605fe2dced681b0ddc410bfbb25d669e26d3e6" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "9a8120e00cf9b236a3883abdca8199329023dbd5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9a8120e00cf9b236a3883abdca8199329023dbd5" + }, + { + "path": "OpenSSL.xcframework/watchos-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "69fa880d9313618951044bddfe735cd9bf8656fd", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/69fa880d9313618951044bddfe735cd9bf8656fd" + }, + { + "path": "OpenSSL.xcframework/xros-arm64", + "mode": "040000", + "type": "tree", + "sha": "d5a8160145e629d3d29a8396af37009b5acbb751", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d5a8160145e629d3d29a8396af37009b5acbb751" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "8606eb90dd0b331ab70d932bf4f7a0806a26ed17", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8606eb90dd0b331ab70d932bf4f7a0806a26ed17" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "7df571c060ba71fbbcd8649d71ec9be7fe50cb25", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7df571c060ba71fbbcd8649d71ec9be7fe50cb25" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "cc8c2a011e0e46ea0c9a353491f93dfbffa004d4", + "size": 4292, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cc8c2a011e0e46ea0c9a353491f93dfbffa004d4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "2b34e35c8adc213c3a16a5e731cd5437de7c71d6", + "size": 1128, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2b34e35c8adc213c3a16a5e731cd5437de7c71d6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "654db420cbd9fef146d971c16749ef31c1ae1c79", + "size": 702, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/654db420cbd9fef146d971c16749ef31c1ae1c79" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "c3c9452bc2ce77d4cab81f9923261769d6b9976a", + "size": 4362304, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c3c9452bc2ce77d4cab81f9923261769d6b9976a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "2ffa74812f9edc099209418b2a1791e357eec2a4", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2ffa74812f9edc099209418b2a1791e357eec2a4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "aa76877fe172bede85208439e561b5bb06cd0975", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/aa76877fe172bede85208439e561b5bb06cd0975" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator", + "mode": "040000", + "type": "tree", + "sha": "dc8652c5b7c5b496dd236dba4e90a724588b1c18", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dc8652c5b7c5b496dd236dba4e90a724588b1c18" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework", + "mode": "040000", + "type": "tree", + "sha": "37abff84a20abab34f4c64307cd28e9d66fa3613", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/37abff84a20abab34f4c64307cd28e9d66fa3613" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers", + "mode": "040000", + "type": "tree", + "sha": "ba01613b9b23dfecb1de66ee5fa50f1f169c4b56", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/ba01613b9b23dfecb1de66ee5fa50f1f169c4b56" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/OpenSSL.h", + "mode": "100644", + "type": "blob", + "sha": "1e5785b9c0f39eeaa74624d5160da3b0dba2fdba", + "size": 4026, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1e5785b9c0f39eeaa74624d5160da3b0dba2fdba" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4830ab9a2d719300b06bdf037486678ce697e75f", + "size": 3750, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4830ab9a2d719300b06bdf037486678ce697e75f" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1.h", + "mode": "100644", + "type": "blob", + "sha": "ed442559448a3597e6cbb4010df4772d619cfc4e", + "size": 61100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed442559448a3597e6cbb4010df4772d619cfc4e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1err.h", + "mode": "100644", + "type": "blob", + "sha": "23dab986d81dcba10dbb141085ccd57be32775fb", + "size": 7852, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/23dab986d81dcba10dbb141085ccd57be32775fb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asn1t.h", + "mode": "100644", + "type": "blob", + "sha": "3fbfbd709947cd53f930918d800b3bf972e75645", + "size": 35934, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3fbfbd709947cd53f930918d800b3bf972e75645" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/async.h", + "mode": "100644", + "type": "blob", + "sha": "50877f4fbc1fc3df6a16d4a8290ae162a45b05f3", + "size": 3502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50877f4fbc1fc3df6a16d4a8290ae162a45b05f3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/asyncerr.h", + "mode": "100644", + "type": "blob", + "sha": "3d57fd1cdb198c6461192be5edfb777ed907711b", + "size": 839, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d57fd1cdb198c6461192be5edfb777ed907711b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bio.h", + "mode": "100644", + "type": "blob", + "sha": "eb91d61cfa645a9a6f77d02e692d3f75ca51cc83", + "size": 45600, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/eb91d61cfa645a9a6f77d02e692d3f75ca51cc83" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bioerr.h", + "mode": "100644", + "type": "blob", + "sha": "a0e88da6b0cae7f713fad6d20819471ebb5cdb2c", + "size": 3512, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a0e88da6b0cae7f713fad6d20819471ebb5cdb2c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d", + "size": 2690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff61ecc448c29bd97e099b4fc427fe1c4ac80c8d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bn.h", + "mode": "100644", + "type": "blob", + "sha": "0db1f2acd614929d0cfeb5bed4f357d3a81b96a3", + "size": 24177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0db1f2acd614929d0cfeb5bed4f357d3a81b96a3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/bnerr.h", + "mode": "100644", + "type": "blob", + "sha": "5caedbcfb03e8cbeca04f1f904c973edeaa36608", + "size": 1946, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caedbcfb03e8cbeca04f1f904c973edeaa36608" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "c4f2c96dcd05f4f405f0f76c5641e54c9d246526", + "size": 1653, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c4f2c96dcd05f4f405f0f76c5641e54c9d246526" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/buffererr.h", + "mode": "100644", + "type": "blob", + "sha": "ca66ab1a601c7bfe3e49e9271e2aa7a31b818577", + "size": 591, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca66ab1a601c7bfe3e49e9271e2aa7a31b818577" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "73404405fb0717445a4682f8b1158e2ef4783ddf", + "size": 5067, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73404405fb0717445a4682f8b1158e2ef4783ddf" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cast.h", + "mode": "100644", + "type": "blob", + "sha": "9f7fa572b04a5f4508a3dc11ea30dea991d1a763", + "size": 2064, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f7fa572b04a5f4508a3dc11ea30dea991d1a763" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmac.h", + "mode": "100644", + "type": "blob", + "sha": "dd0aa9886f11f9201d2297b0f804d7ef3b6671b1", + "size": 1605, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd0aa9886f11f9201d2297b0f804d7ef3b6671b1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp.h", + "mode": "100644", + "type": "blob", + "sha": "829d334d5fd34a6b3ea790806a76556603ea0d0b", + "size": 43922, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d334d5fd34a6b3ea790806a76556603ea0d0b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmp_util.h", + "mode": "100644", + "type": "blob", + "sha": "ac6a6a9a61c038d558d53bc78c1e996d7761746b", + "size": 1737, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac6a6a9a61c038d558d53bc78c1e996d7761746b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmperr.h", + "mode": "100644", + "type": "blob", + "sha": "4ba527d2f236a2dc182389223a367a8ab662b936", + "size": 6729, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ba527d2f236a2dc182389223a367a8ab662b936" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cms.h", + "mode": "100644", + "type": "blob", + "sha": "a69da9af6cc3b303eba8157902ab9a72b4fe9dd1", + "size": 35062, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a69da9af6cc3b303eba8157902ab9a72b4fe9dd1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cmserr.h", + "mode": "100644", + "type": "blob", + "sha": "4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac", + "size": 6728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b651ac39fcf75ab3e27cb39a76f6a1e89c0bcac" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/comp.h", + "mode": "100644", + "type": "blob", + "sha": "a79df30e3b85ba98df45bda8f92c3b7dfef940ab", + "size": 1670, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a79df30e3b85ba98df45bda8f92c3b7dfef940ab" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/comperr.h", + "mode": "100644", + "type": "blob", + "sha": "d1f42d409b305d03290eb6f0a812c2bdbdacc217", + "size": 1251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d1f42d409b305d03290eb6f0a812c2bdbdacc217" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf.h", + "mode": "100644", + "type": "blob", + "sha": "d99085b6a54412fe1c10abc3bab8c516da7dd2ce", + "size": 10664, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d99085b6a54412fe1c10abc3bab8c516da7dd2ce" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conf_api.h", + "mode": "100644", + "type": "blob", + "sha": "7ef71a7100661df594bc75ebb1a36c5f4a42850a", + "size": 1417, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ef71a7100661df594bc75ebb1a36c5f4a42850a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conferr.h", + "mode": "100644", + "type": "blob", + "sha": "e636437b06043bfb17d67182c52869b84b335768", + "size": 2262, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e636437b06043bfb17d67182c52869b84b335768" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/configuration.h", + "mode": "100644", + "type": "blob", + "sha": "cc8c2a011e0e46ea0c9a353491f93dfbffa004d4", + "size": 4292, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cc8c2a011e0e46ea0c9a353491f93dfbffa004d4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/conftypes.h", + "mode": "100644", + "type": "blob", + "sha": "dc12df092935cb52be845533788cb36a85c043b3", + "size": 1189, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc12df092935cb52be845533788cb36a85c043b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core.h", + "mode": "100644", + "type": "blob", + "sha": "ca784d253ee78184517b8ea54005957ae50a0d23", + "size": 8176, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca784d253ee78184517b8ea54005957ae50a0d23" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_dispatch.h", + "mode": "100644", + "type": "blob", + "sha": "274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e", + "size": 50340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/274a7fcbe9a86a04b0cd4aa98be74eb19f0e978e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_names.h", + "mode": "100644", + "type": "blob", + "sha": "a61580568f78560001ae76d4905d1e6a56afec7c", + "size": 23211, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a61580568f78560001ae76d4905d1e6a56afec7c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/core_object.h", + "mode": "100644", + "type": "blob", + "sha": "62ccf39d3259c57559d46a66ff5bd824009e7753", + "size": 1126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62ccf39d3259c57559d46a66ff5bd824009e7753" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmf.h", + "mode": "100644", + "type": "blob", + "sha": "046c5a613a24dd9a9c5280ff180247cceb101ae1", + "size": 14719, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/046c5a613a24dd9a9c5280ff180247cceb101ae1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crmferr.h", + "mode": "100644", + "type": "blob", + "sha": "82c89f554ab591487ab1c4df367d881573072950", + "size": 2008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/82c89f554ab591487ab1c4df367d881573072950" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/crypto.h", + "mode": "100644", + "type": "blob", + "sha": "103801de60af21db5a33654fc76010f64f18e32a", + "size": 24162, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/103801de60af21db5a33654fc76010f64f18e32a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr.h", + "mode": "100644", + "type": "blob", + "sha": "872dc63c3b834d46867cd1a435eceb333e1717d9", + "size": 2464, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/872dc63c3b834d46867cd1a435eceb333e1717d9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cryptoerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "13ff0837e777d7813a69b1d598143cd81fdbe0c1", + "size": 80394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ff0837e777d7813a69b1d598143cd81fdbe0c1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ct.h", + "mode": "100644", + "type": "blob", + "sha": "256b394ddae6e1f70c939c7369fa3d3cb6cec9d7", + "size": 22704, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/256b394ddae6e1f70c939c7369fa3d3cb6cec9d7" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/cterr.h", + "mode": "100644", + "type": "blob", + "sha": "32bdf727db3e8c8cd73f03e71833b4c063a41573", + "size": 1685, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32bdf727db3e8c8cd73f03e71833b4c063a41573" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/decoder.h", + "mode": "100644", + "type": "blob", + "sha": "2769ff255995a02578034092979b312050697e2c", + "size": 5756, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2769ff255995a02578034092979b312050697e2c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/decodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8e8de43250449d76bfb83d86cc948b3590bb47e5", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8e8de43250449d76bfb83d86cc948b3590bb47e5" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/des.h", + "mode": "100644", + "type": "blob", + "sha": "a9784d1c429c908256ff8346c28f8fee975ae668", + "size": 8521, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a9784d1c429c908256ff8346c28f8fee975ae668" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dh.h", + "mode": "100644", + "type": "blob", + "sha": "c20ecb75414bdefce87ff2630dfef30e0a772afe", + "size": 15461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c20ecb75414bdefce87ff2630dfef30e0a772afe" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dherr.h", + "mode": "100644", + "type": "blob", + "sha": "faeefcf02cd2b2c500d095ddc28e63a44e6e519a", + "size": 2567, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/faeefcf02cd2b2c500d095ddc28e63a44e6e519a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsa.h", + "mode": "100644", + "type": "blob", + "sha": "1f5dc3ce70de5da9b244c64ef0f5e37d53e82680", + "size": 12514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f5dc3ce70de5da9b244c64ef0f5e37d53e82680" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "0f79bdde351a5ec3a4cba2867963709f6a3b1008", + "size": 1626, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0f79bdde351a5ec3a4cba2867963709f6a3b1008" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/dtls1.h", + "mode": "100644", + "type": "blob", + "sha": "d9446fc13d56fe915555f9a67f1852fd41c8e522", + "size": 1463, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d9446fc13d56fe915555f9a67f1852fd41c8e522" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_os2.h", + "mode": "100644", + "type": "blob", + "sha": "9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef", + "size": 8821, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9cd31ccecf066cb3ce6d17cbd45fcf62020fa0ef" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/e_ostime.h", + "mode": "100644", + "type": "blob", + "sha": "980a150cf0b976cb4e228882f0385bf3108a7d70", + "size": 1185, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/980a150cf0b976cb4e228882f0385bf3108a7d70" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ebcdic.h", + "mode": "100644", + "type": "blob", + "sha": "6e1a1de09ff771d3de6d574fd242b59ac1708eef", + "size": 1041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6e1a1de09ff771d3de6d574fd242b59ac1708eef" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ec.h", + "mode": "100644", + "type": "blob", + "sha": "30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a", + "size": 68426, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30cfbdbcda93a8e85d80647b6bd7f50a919e6b5a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdh.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecdsa.h", + "mode": "100644", + "type": "blob", + "sha": "014f1218b3398dd2191046f54fb24b57a53caac1", + "size": 361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/014f1218b3398dd2191046f54fb24b57a53caac1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ecerr.h", + "mode": "100644", + "type": "blob", + "sha": "97871e712e19140604afabd4e4db66a65c7b6997", + "size": 5402, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97871e712e19140604afabd4e4db66a65c7b6997" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/encoder.h", + "mode": "100644", + "type": "blob", + "sha": "2f0021261f2c4621213a192e430590e9a4eae239", + "size": 5446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2f0021261f2c4621213a192e430590e9a4eae239" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/encodererr.h", + "mode": "100644", + "type": "blob", + "sha": "8abb40b526b493c2e43781cbb4c8d266f3146ae9", + "size": 788, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8abb40b526b493c2e43781cbb4c8d266f3146ae9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/engine.h", + "mode": "100644", + "type": "blob", + "sha": "6fe5c9ca537b6888ea180618ae5cdacc312656cb", + "size": 38789, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6fe5c9ca537b6888ea180618ae5cdacc312656cb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/engineerr.h", + "mode": "100644", + "type": "blob", + "sha": "85241b175265f38633cc601c325cbfb9d1ecceb4", + "size": 2835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85241b175265f38633cc601c325cbfb9d1ecceb4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/err.h", + "mode": "100644", + "type": "blob", + "sha": "6b4f41657707200afe868956ef9d3578846d6ca6", + "size": 22392, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4f41657707200afe868956ef9d3578846d6ca6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ess.h", + "mode": "100644", + "type": "blob", + "sha": "32df2082f164b892928bcd6da5b66ae8a2d00088", + "size": 8964, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/32df2082f164b892928bcd6da5b66ae8a2d00088" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/esserr.h", + "mode": "100644", + "type": "blob", + "sha": "baa034e3408b79f717f4ebe9d842740118626d9a", + "size": 1141, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/baa034e3408b79f717f4ebe9d842740118626d9a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/evp.h", + "mode": "100644", + "type": "blob", + "sha": "1716f700e6918cb82396c4a95e49220330ebe624", + "size": 104380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1716f700e6918cb82396c4a95e49220330ebe624" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/evperr.h", + "mode": "100644", + "type": "blob", + "sha": "f36141af363478173f25e6b29b1ffa48271cfb85", + "size": 7534, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36141af363478173f25e6b29b1ffa48271cfb85" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/fips_names.h", + "mode": "100644", + "type": "blob", + "sha": "5c77f6d69122340fcd5d139aa08b84ab314db3c0", + "size": 2255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c77f6d69122340fcd5d139aa08b84ab314db3c0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/fipskey.h", + "mode": "100644", + "type": "blob", + "sha": "42ba014b313ba87d592cb5a712e15a779af7961e", + "size": 1010, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ba014b313ba87d592cb5a712e15a779af7961e" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "452cf4aa870b3540f6c5b7b7983daa8d99562038", + "size": 2138, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/452cf4aa870b3540f6c5b7b7983daa8d99562038" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/hpke.h", + "mode": "100644", + "type": "blob", + "sha": "adefc552a9c6cd57357df7e9100cccd5c4d2f499", + "size": 6982, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adefc552a9c6cd57357df7e9100cccd5c4d2f499" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/http.h", + "mode": "100644", + "type": "blob", + "sha": "d3d786f0325caa3950a15a1a420742f21ae6c1a4", + "size": 5539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d3d786f0325caa3950a15a1a420742f21ae6c1a4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/httperr.h", + "mode": "100644", + "type": "blob", + "sha": "d0aa82fb30dcd83e484b482cf620f8224c3b2f08", + "size": 2510, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d0aa82fb30dcd83e484b482cf620f8224c3b2f08" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/idea.h", + "mode": "100644", + "type": "blob", + "sha": "5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40", + "size": 3008, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5668f398dc21aa40e2ef5fd5a6ac4e82c76ffc40" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdf.h", + "mode": "100644", + "type": "blob", + "sha": "37c1332881417030e6fd6ef16a419186ad16012a", + "size": 5616, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/37c1332881417030e6fd6ef16a419186ad16012a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/kdferr.h", + "mode": "100644", + "type": "blob", + "sha": "435977ac07b3f7aecef096993cf414709c78718c", + "size": 482, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/435977ac07b3f7aecef096993cf414709c78718c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/lhash.h", + "mode": "100644", + "type": "blob", + "sha": "612121fd01ad48bf1ba071b640d1e2b72ac234f4", + "size": 18438, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/612121fd01ad48bf1ba071b640d1e2b72ac234f4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/macros.h", + "mode": "100644", + "type": "blob", + "sha": "fd950888589334d70d0bded0497acde86e548579", + "size": 10738, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd950888589334d70d0bded0497acde86e548579" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md2.h", + "mode": "100644", + "type": "blob", + "sha": "65eee51377618af489a7e5bbec53b8ead750ad0a", + "size": 1459, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65eee51377618af489a7e5bbec53b8ead750ad0a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md4.h", + "mode": "100644", + "type": "blob", + "sha": "409bd4c3322ad72a434a0dda5cc5d721a90e9be4", + "size": 1695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/409bd4c3322ad72a434a0dda5cc5d721a90e9be4" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/md5.h", + "mode": "100644", + "type": "blob", + "sha": "4a8dceb33ea879f2bf3286e479c191d1d9193702", + "size": 1692, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4a8dceb33ea879f2bf3286e479c191d1d9193702" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/mdc2.h", + "mode": "100644", + "type": "blob", + "sha": "72c154397649524a55d19faa3cb1ebcc5ccf4740", + "size": 1437, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/72c154397649524a55d19faa3cb1ebcc5ccf4740" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/modes.h", + "mode": "100644", + "type": "blob", + "sha": "df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3", + "size": 10784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/df041ec6b187bc3aafdd58cabd9581aeb7f2cfc3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/obj_mac.h", + "mode": "100644", + "type": "blob", + "sha": "1b7d9240a9968ec553af3c4c05720477fdd745c6", + "size": 243695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7d9240a9968ec553af3c4c05720477fdd745c6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/objects.h", + "mode": "100644", + "type": "blob", + "sha": "c24dcb176b21036f87582e2c0e252cf12b871619", + "size": 6843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c24dcb176b21036f87582e2c0e252cf12b871619" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/objectserr.h", + "mode": "100644", + "type": "blob", + "sha": "d5645f1866803c11835b6cdd6e0b1f650f63fe8d", + "size": 779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d5645f1866803c11835b6cdd6e0b1f650f63fe8d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsp.h", + "mode": "100644", + "type": "blob", + "sha": "d81d6752fe98630b6568cbc545419c35e8895f65", + "size": 29340, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d81d6752fe98630b6568cbc545419c35e8895f65" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ocsperr.h", + "mode": "100644", + "type": "blob", + "sha": "566f16cbdbec0c6caca83bb664fb85db2b5894e3", + "size": 2197, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/566f16cbdbec0c6caca83bb664fb85db2b5894e3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslconf.h", + "mode": "100644", + "type": "blob", + "sha": "383f669e3a67563fe2ab2c7acfafb022cb5b2967", + "size": 1641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/383f669e3a67563fe2ab2c7acfafb022cb5b2967" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/opensslv.h", + "mode": "100644", + "type": "blob", + "sha": "e91b5ebafae01c77a425f2729b0b8ca6ff135af2", + "size": 3183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e91b5ebafae01c77a425f2729b0b8ca6ff135af2" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ossl_typ.h", + "mode": "100644", + "type": "blob", + "sha": "1736027a7a06082f2035cd1797a9a07eb384738b", + "size": 561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1736027a7a06082f2035cd1797a9a07eb384738b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/param_build.h", + "mode": "100644", + "type": "blob", + "sha": "27aef21f5b1e08839bd528564887e6a166d86b8b", + "size": 2807, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/27aef21f5b1e08839bd528564887e6a166d86b8b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/params.h", + "mode": "100644", + "type": "blob", + "sha": "5d3d0e428b4d8f537bab0b3020f3a66dc0112636", + "size": 7326, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d3d0e428b4d8f537bab0b3020f3a66dc0112636" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem.h", + "mode": "100644", + "type": "blob", + "sha": "8eeb00fa6f7a5015d71bcfe4a717356d86a4303b", + "size": 25862, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8eeb00fa6f7a5015d71bcfe4a717356d86a4303b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pem2.h", + "mode": "100644", + "type": "blob", + "sha": "801e6ccaf9c7f66f8869ea499987460cce66eafe", + "size": 529, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/801e6ccaf9c7f66f8869ea499987460cce66eafe" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pemerr.h", + "mode": "100644", + "type": "blob", + "sha": "b2459ed1c1609e94c669d6a070ff6f4e568e8a6c", + "size": 2631, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2459ed1c1609e94c669d6a070ff6f4e568e8a6c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12.h", + "mode": "100644", + "type": "blob", + "sha": "2e50b74b96b72c0b598d51e34b2ec55a83cff7be", + "size": 20167, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e50b74b96b72c0b598d51e34b2ec55a83cff7be" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs12err.h", + "mode": "100644", + "type": "blob", + "sha": "0b316e4a9391afdf258096d5009b16de2d494862", + "size": 1896, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b316e4a9391afdf258096d5009b16de2d494862" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7.h", + "mode": "100644", + "type": "blob", + "sha": "f75bddbe3186fc6415de36e79397ee07386a4090", + "size": 22652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f75bddbe3186fc6415de36e79397ee07386a4090" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/pkcs7err.h", + "mode": "100644", + "type": "blob", + "sha": "08d04bee8a21b2d8c11cd99e6ab35abecaa4202b", + "size": 2949, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/08d04bee8a21b2d8c11cd99e6ab35abecaa4202b" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/prov_ssl.h", + "mode": "100644", + "type": "blob", + "sha": "76d01e1eb89c4970eea2362fbc83f4f30b3bc40c", + "size": 1139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/76d01e1eb89c4970eea2362fbc83f4f30b3bc40c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/proverr.h", + "mode": "100644", + "type": "blob", + "sha": "094b212ce93b67d5bdf1617f9a02910535be61ca", + "size": 8524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/094b212ce93b67d5bdf1617f9a02910535be61ca" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/provider.h", + "mode": "100644", + "type": "blob", + "sha": "174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073", + "size": 2732, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/174aaaffbdbdde5a1c2eb7b4b521c11fc66f8073" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/quic.h", + "mode": "100644", + "type": "blob", + "sha": "79200a8c662452ae0a0278be90fe748d003952a3", + "size": 2203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/79200a8c662452ae0a0278be90fe748d003952a3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rand.h", + "mode": "100644", + "type": "blob", + "sha": "fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5", + "size": 3978, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbc3a5cfca1409e04cd32aeea8d5d16a8234e1d5" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/randerr.h", + "mode": "100644", + "type": "blob", + "sha": "e983ce0013653e778f42de589fbe52c5ac6ffc6d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e983ce0013653e778f42de589fbe52c5ac6ffc6d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc2.h", + "mode": "100644", + "type": "blob", + "sha": "b86857a6a44445e4599bb697783e4c4dcf78d2cb", + "size": 2380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b86857a6a44445e4599bb697783e4c4dcf78d2cb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "04b7b6cc3077005f6b629f3f9db856fa463f2df1", + "size": 1192, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04b7b6cc3077005f6b629f3f9db856fa463f2df1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rc5.h", + "mode": "100644", + "type": "blob", + "sha": "4d8c5ed8072c4d63da436a8ee573190d99660498", + "size": 2859, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4d8c5ed8072c4d63da436a8ee573190d99660498" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "de45dd1d4098dd4f85edf946b26cc936e051fa59", + "size": 1713, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de45dd1d4098dd4f85edf946b26cc936e051fa59" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsa.h", + "mode": "100644", + "type": "blob", + "sha": "d4534fdeff7c36b8b38a9e78525448c764b5caeb", + "size": 28468, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d4534fdeff7c36b8b38a9e78525448c764b5caeb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/rsaerr.h", + "mode": "100644", + "type": "blob", + "sha": "e182ae3d6f6bc72099f6730c86f804cba29564b3", + "size": 5678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e182ae3d6f6bc72099f6730c86f804cba29564b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/safestack.h", + "mode": "100644", + "type": "blob", + "sha": "f101d04ae35ece27d889f493ce333676e04d7a8a", + "size": 18436, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f101d04ae35ece27d889f493ce333676e04d7a8a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/seed.h", + "mode": "100644", + "type": "blob", + "sha": "88e9b4e94150f4eea9c03a13e9d4a50f2227fd30", + "size": 3958, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/88e9b4e94150f4eea9c03a13e9d4a50f2227fd30" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/self_test.h", + "mode": "100644", + "type": "blob", + "sha": "46a024d9a13404ccaaa1717174f24474861a2697", + "size": 4253, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/46a024d9a13404ccaaa1717174f24474861a2697" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sha.h", + "mode": "100644", + "type": "blob", + "sha": "967279a7cda6feeb159629c30879d78bb2d11970", + "size": 4693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/967279a7cda6feeb159629c30879d78bb2d11970" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/shim.h", + "mode": "100644", + "type": "blob", + "sha": "9c383b6d2a88745feb9c890b93c707eed4993590", + "size": 1020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9c383b6d2a88745feb9c890b93c707eed4993590" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/srp.h", + "mode": "100644", + "type": "blob", + "sha": "9e4d28d0b63580c6cfea80ca3fb86164ebd71471", + "size": 15483, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e4d28d0b63580c6cfea80ca3fb86164ebd71471" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/srtp.h", + "mode": "100644", + "type": "blob", + "sha": "41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6", + "size": 2178, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/41e2b8d55441f18f9e203fe37a4d7c3ed3a670e6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl.h", + "mode": "100644", + "type": "blob", + "sha": "006d063e284125dfd8675910f107cc2d2901cde1", + "size": 138431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/006d063e284125dfd8675910f107cc2d2901cde1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl2.h", + "mode": "100644", + "type": "blob", + "sha": "9dca8f1731f64317059d59bc5cdbceca21e59bdd", + "size": 657, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dca8f1731f64317059d59bc5cdbceca21e59bdd" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ssl3.h", + "mode": "100644", + "type": "blob", + "sha": "271c6d87b3670767613a46e22eb7f173a607cc8a", + "size": 15154, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/271c6d87b3670767613a46e22eb7f173a607cc8a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr.h", + "mode": "100644", + "type": "blob", + "sha": "5b3a4da53225d2735e51fce87e0f0e3d39dae08a", + "size": 22446, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5b3a4da53225d2735e51fce87e0f0e3d39dae08a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/sslerr_legacy.h", + "mode": "100644", + "type": "blob", + "sha": "096d318fefe39de34c408bc6c3107e6fc6461d47", + "size": 26942, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/096d318fefe39de34c408bc6c3107e6fc6461d47" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/stack.h", + "mode": "100644", + "type": "blob", + "sha": "b0047ef4b8a1023a5708cbe4b050e4a3380930e0", + "size": 3283, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0047ef4b8a1023a5708cbe4b050e4a3380930e0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/store.h", + "mode": "100644", + "type": "blob", + "sha": "ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1", + "size": 15457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed0b6254e360b2a3103c0dfed40ccd2edf67e5f1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/storeerr.h", + "mode": "100644", + "type": "blob", + "sha": "35f06bb3438fb655530d3c32727a47b011e1ae6a", + "size": 2089, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35f06bb3438fb655530d3c32727a47b011e1ae6a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/symhacks.h", + "mode": "100644", + "type": "blob", + "sha": "e56408d1a50cea0662fe98718fa2768e77a92598", + "size": 1288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e56408d1a50cea0662fe98718fa2768e77a92598" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/thread.h", + "mode": "100644", + "type": "blob", + "sha": "b300722fcc6fdbd41d2a684ca372159f310ed4e1", + "size": 870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b300722fcc6fdbd41d2a684ca372159f310ed4e1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/tls1.h", + "mode": "100644", + "type": "blob", + "sha": "b6e3aa1986626046a7914a195309a761186a3af0", + "size": 72690, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6e3aa1986626046a7914a195309a761186a3af0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/trace.h", + "mode": "100644", + "type": "blob", + "sha": "5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9", + "size": 10736, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5d0fd9e6a20e4323a9be8e95d100dcc6c33f70d9" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ts.h", + "mode": "100644", + "type": "blob", + "sha": "a7302824b7fcd695edbf73e0098cb17039ab2cfb", + "size": 19745, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a7302824b7fcd695edbf73e0098cb17039ab2cfb" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/tserr.h", + "mode": "100644", + "type": "blob", + "sha": "c9246269d19d341b00a4d9bcbee17d53281507b3", + "size": 3071, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9246269d19d341b00a4d9bcbee17d53281507b3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/txt_db.h", + "mode": "100644", + "type": "blob", + "sha": "ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181", + "size": 1779, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ac80d20d3c512a09a9a48c0c8fe5ae4f05e35181" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/types.h", + "mode": "100644", + "type": "blob", + "sha": "413c20c5dbc21dad44dfe148ab7e50eda88cae0a", + "size": 7313, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/413c20c5dbc21dad44dfe148ab7e50eda88cae0a" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/ui.h", + "mode": "100644", + "type": "blob", + "sha": "6656a92041f49c3baed77aa62be90e784e6db4d2", + "size": 19243, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6656a92041f49c3baed77aa62be90e784e6db4d2" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/uierr.h", + "mode": "100644", + "type": "blob", + "sha": "d717d0439cdb5ec327978d232dc386496ea0ffe6", + "size": 1388, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d717d0439cdb5ec327978d232dc386496ea0ffe6" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/whrlpool.h", + "mode": "100644", + "type": "blob", + "sha": "05c950ef795d49693a464c2713fc21b64b8a828c", + "size": 1849, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/05c950ef795d49693a464c2713fc21b64b8a828c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509.h", + "mode": "100644", + "type": "blob", + "sha": "9dbb2b9706e482a650022b4b8db4d1dccbc0d037", + "size": 72005, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dbb2b9706e482a650022b4b8db4d1dccbc0d037" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509_vfy.h", + "mode": "100644", + "type": "blob", + "sha": "776920e2c57e0bf4bc1328ae520d34a580d4a5a0", + "size": 52507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/776920e2c57e0bf4bc1328ae520d34a580d4a5a0" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509err.h", + "mode": "100644", + "type": "blob", + "sha": "8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d", + "size": 3316, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8f6b670c6b5f5de2eb0223a9db34e8e5dd78617d" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3.h", + "mode": "100644", + "type": "blob", + "sha": "897f02f1d55b036131839ce957bcb64d3d9cec91", + "size": 94061, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/897f02f1d55b036131839ce957bcb64d3d9cec91" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Headers/x509v3err.h", + "mode": "100644", + "type": "blob", + "sha": "b2cdc12d54ead30da8312088a31a1beae3b50c3c", + "size": 5002, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b2cdc12d54ead30da8312088a31a1beae3b50c3c" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Info.plist", + "mode": "100644", + "type": "blob", + "sha": "e3a3301fba1b9bc728af31c4e904a99e20534208", + "size": 723, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e3a3301fba1b9bc728af31c4e904a99e20534208" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Modules", + "mode": "040000", + "type": "tree", + "sha": "02ca5dd4feaf3c934254001e8ff6b82ae5896e8f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/02ca5dd4feaf3c934254001e8ff6b82ae5896e8f" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/Modules/module.modulemap", + "mode": "100644", + "type": "blob", + "sha": "bf0f22fd023568a60364592ba9e793e18e33f216", + "size": 95, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0f22fd023568a60364592ba9e793e18e33f216" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/OpenSSL", + "mode": "100755", + "type": "blob", + "sha": "b3a57b4cdc5afd11112734413f48a57fdba065d3", + "size": 8867536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b3a57b4cdc5afd11112734413f48a57fdba065d3" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/PrivacyInfo.xcprivacy", + "mode": "100644", + "type": "blob", + "sha": "d37d6275f5c74044a3c7e2592f1a1e0322f481a1", + "size": 373, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d37d6275f5c74044a3c7e2592f1a1e0322f481a1" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature", + "mode": "040000", + "type": "tree", + "sha": "6ce75d38d376314bdefd1aecc2aefb6985a7c599", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6ce75d38d376314bdefd1aecc2aefb6985a7c599" + }, + { + "path": "OpenSSL.xcframework/xros-arm64_x86_64-simulator/OpenSSL.framework/_CodeSignature/CodeResources", + "mode": "100644", + "type": "blob", + "sha": "c1ce16059d1be6905dc5e99a050cf241ada1c8e0", + "size": 32752, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c1ce16059d1be6905dc5e99a050cf241ada1c8e0" + }, + { + "path": "Packages", + "mode": "040000", + "type": "tree", + "sha": "b9ca7c2e8ff6c9c58d65aedb12d3278963ee519d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b9ca7c2e8ff6c9c58d65aedb12d3278963ee519d" + }, + { + "path": "Packages/RealityKitContent", + "mode": "040000", + "type": "tree", + "sha": "5aa865b71b26a6bc2fbdbaad0cb3e884d2ce0e08", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5aa865b71b26a6bc2fbdbaad0cb3e884d2ce0e08" + }, + { + "path": "Packages/RealityKitContent/.build", + "mode": "040000", + "type": "tree", + "sha": "97e6218d268668851110328d6ec1eec80d343e86", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/97e6218d268668851110328d6ec1eec80d343e86" + }, + { + "path": "Packages/RealityKitContent/.build/workspace-state.json", + "mode": "100644", + "type": "blob", + "sha": "7c0cb06983a96afc60d69f6a48955b7669c8cba3", + "size": 125, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7c0cb06983a96afc60d69f6a48955b7669c8cba3" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro", + "mode": "040000", + "type": "tree", + "sha": "1784e3ede675ccb15d7e4ab5f075cc4faa1eb272", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1784e3ede675ccb15d7e4ab5f075cc4faa1eb272" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro/ProjectData", + "mode": "040000", + "type": "tree", + "sha": "0e4508626957149fea9635a87534a3b511e24c81", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/0e4508626957149fea9635a87534a3b511e24c81" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json", + "mode": "100644", + "type": "blob", + "sha": "7f3283045946e11751d2ee80f626a9e38898cb18", + "size": 1287, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7f3283045946e11751d2ee80f626a9e38898cb18" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData", + "mode": "040000", + "type": "tree", + "sha": "715470431695d3b1c0de5f415a61306c4108585f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/715470431695d3b1c0de5f415a61306c4108585f" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json", + "mode": "100644", + "type": "blob", + "sha": "2bd96c804e37109cfc1a3e9501a2a5771ece38e2", + "size": 4335, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2bd96c804e37109cfc1a3e9501a2a5771ece38e2" + }, + { + "path": "Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata", + "mode": "100644", + "type": "blob", + "sha": "6dea95c8d32f0c02877f7629dabb00d5bf04d880", + "size": 256, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6dea95c8d32f0c02877f7629dabb00d5bf04d880" + }, + { + "path": "Packages/RealityKitContent/Package.swift", + "mode": "100644", + "type": "blob", + "sha": "d762a0ae234e75a6e894f0368a0c242c1d551b5a", + "size": 1129, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d762a0ae234e75a6e894f0368a0c242c1d551b5a" + }, + { + "path": "Packages/RealityKitContent/README.md", + "mode": "100644", + "type": "blob", + "sha": "486b5755e50bf6b9ed4c49856f7dd5899dac6470", + "size": 51, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/486b5755e50bf6b9ed4c49856f7dd5899dac6470" + }, + { + "path": "Packages/RealityKitContent/Sources", + "mode": "040000", + "type": "tree", + "sha": "a92aa00cca187ba04892384752d811a15c0caaab", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a92aa00cca187ba04892384752d811a15c0caaab" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent", + "mode": "040000", + "type": "tree", + "sha": "2d8e57171d19c8694df9d5b5b408d1280c9de469", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2d8e57171d19c8694df9d5b5b408d1280c9de469" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets", + "mode": "040000", + "type": "tree", + "sha": "06e41bc02660d7b0fc476fc76fe1139e3dd48e06", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/06e41bc02660d7b0fc476fc76fe1139e3dd48e06" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Immersive.usda", + "mode": "100644", + "type": "blob", + "sha": "cf1c78efb7abeb39e975a4ec566c4937bbcf96b6", + "size": 1461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cf1c78efb7abeb39e975a4ec566c4937bbcf96b6" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda", + "mode": "100644", + "type": "blob", + "sha": "b0be32cdfa4b45eeac7432706e4c2171625a8858", + "size": 1570, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b0be32cdfa4b45eeac7432706e4c2171625a8858" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/_PlainMaterial.usda", + "mode": "100644", + "type": "blob", + "sha": "64a1974810a3feaede34219ecd5c873627bb39bf", + "size": 1096, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64a1974810a3feaede34219ecd5c873627bb39bf" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift", + "mode": "100644", + "type": "blob", + "sha": "5caba4e3d2bdb9f3970f5cd446e0d53b80c2dbc1", + "size": 115, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5caba4e3d2bdb9f3970f5cd446e0d53b80c2dbc1" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets", + "mode": "040000", + "type": "tree", + "sha": "6edb5c76a1ec6ec6579400ac0edb9470e925dd8c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6edb5c76a1ec6ec6579400ac0edb9470e925dd8c" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/AAA_MainScene.usda", + "mode": "100644", + "type": "blob", + "sha": "b6b86a2bfc934efcc0c9142e084190d2a87f5d2f", + "size": 3695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6b86a2bfc934efcc0c9142e084190d2a87f5d2f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/ibl", + "mode": "040000", + "type": "tree", + "sha": "b88c72fe12e3042bfb6cdad249ca5ddd22a28ebe", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b88c72fe12e3042bfb6cdad249ca5ddd22a28ebe" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/ibl/Studio_IBL_LatLong_Dark.exr", + "mode": "100644", + "type": "blob", + "sha": "6bfb5ff87380d3c51c49dd5de9e59ae758f23b1f", + "size": 7054487, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6bfb5ff87380d3c51c49dd5de9e59ae758f23b1f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/ibl/Studio_IBL_LatLong_Light.exr", + "mode": "100644", + "type": "blob", + "sha": "3788e5c06fc91be94dce6427c678fba641d6bf1b", + "size": 6877347, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3788e5c06fc91be94dce6427c678fba641d6bf1b" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/meshes", + "mode": "040000", + "type": "tree", + "sha": "d12cbc60579450b66d9df0d72439e26d9f40eecf", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d12cbc60579450b66d9df0d72439e26d9f40eecf" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/meshes/Studio.usdc", + "mode": "100644", + "type": "blob", + "sha": "86edc3033af2cfbf7bc66455eef3644e8b82d316", + "size": 13505123, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/86edc3033af2cfbf7bc66455eef3644e8b82d316" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/meshes/Studio_floor_2_2_Lightspill.usdc", + "mode": "100644", + "type": "blob", + "sha": "d965e4a2627cfde08509fd7c561b2850410498b8", + "size": 5230, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d965e4a2627cfde08509fd7c561b2850410498b8" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/meshes/Studio_floor_2_Lightspill.usdc", + "mode": "100644", + "type": "blob", + "sha": "053bab51b22a0e7c8185729918879ec7a80e511f", + "size": 48027, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/053bab51b22a0e7c8185729918879ec7a80e511f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/meshes/dome.usdc", + "mode": "100644", + "type": "blob", + "sha": "dd8d44decc04015d4021a78d7a9afef62190ed3a", + "size": 86835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd8d44decc04015d4021a78d7a9afef62190ed3a" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/scenes", + "mode": "040000", + "type": "tree", + "sha": "54daffee5973af931baf2eef4f04961f528ea9e5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/54daffee5973af931baf2eef4f04961f528ea9e5" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/scenes/Common.usda", + "mode": "100644", + "type": "blob", + "sha": "4c9e170b021bfa36787c4c10629205341975623f", + "size": 3930, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4c9e170b021bfa36787c4c10629205341975623f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/scenes/Floor.usda", + "mode": "100644", + "type": "blob", + "sha": "97da4a34d7ba1e5bad1c27347db8c6ac021bc54b", + "size": 20615, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97da4a34d7ba1e5bad1c27347db8c6ac021bc54b" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/scenes/StudioDark.usda", + "mode": "100644", + "type": "blob", + "sha": "0623457ab88de6a9d7feeab3d532573dd174ece1", + "size": 16644, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0623457ab88de6a9d7feeab3d532573dd174ece1" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/scenes/StudioLight.usda", + "mode": "100644", + "type": "blob", + "sha": "adeb260d75f2ed61854a7d5a565829eac86a1f13", + "size": 16954, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adeb260d75f2ed61854a7d5a565829eac86a1f13" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures", + "mode": "040000", + "type": "tree", + "sha": "2aa66364dbf7c80717652930fe0b3ab69a2e67eb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2aa66364dbf7c80717652930fe0b3ab69a2e67eb" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/common", + "mode": "040000", + "type": "tree", + "sha": "1d35392c4ab44b86e0de170390a6098c7cb3bbbe", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1d35392c4ab44b86e0de170390a6098c7cb3bbbe" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/common/DefaultAttenuationMap.exr", + "mode": "100644", + "type": "blob", + "sha": "1aa010948894f232b5bffcdfa498f4918d1b425f", + "size": 179530, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1aa010948894f232b5bffcdfa498f4918d1b425f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark", + "mode": "040000", + "type": "tree", + "sha": "4463b404fe89bebe77426af6c5e6ec3f0e234233", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4463b404fe89bebe77426af6c5e6ec3f0e234233" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup1_1_d.png", + "mode": "100644", + "type": "blob", + "sha": "ca1b419d550eae6a8255033ff9b5254f5c829842", + "size": 11745361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca1b419d550eae6a8255033ff9b5254f5c829842" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup1_d.png", + "mode": "100644", + "type": "blob", + "sha": "829d5367c139d8cdc36da0fd025f5844a03b08f2", + "size": 12673287, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d5367c139d8cdc36da0fd025f5844a03b08f2" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup2_2_d.png", + "mode": "100644", + "type": "blob", + "sha": "d2f378325ac3a81280b22fbc4b92b7e1231428e3", + "size": 16974658, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d2f378325ac3a81280b22fbc4b92b7e1231428e3" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup2_d.png", + "mode": "100644", + "type": "blob", + "sha": "30053f9185622e354e4d1bdfab8774187ff87bb7", + "size": 17081041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30053f9185622e354e4d1bdfab8774187ff87bb7" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup3_d.png", + "mode": "100644", + "type": "blob", + "sha": "6d363552c1bf7ded1c53b0910809eaecc77ff5e6", + "size": 11597860, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6d363552c1bf7ded1c53b0910809eaecc77ff5e6" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup4_d.png", + "mode": "100644", + "type": "blob", + "sha": "f04dfda35d56f85d3406f26db634605d3127cd80", + "size": 13780117, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f04dfda35d56f85d3406f26db634605d3127cd80" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup5_d.png", + "mode": "100644", + "type": "blob", + "sha": "31e1730e704d4c6189a1f865bf64146367754c76", + "size": 15859536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/31e1730e704d4c6189a1f865bf64146367754c76" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup6_d.png", + "mode": "100644", + "type": "blob", + "sha": "e34a1829de98da8572fd36d5e5b67b977c3c4719", + "size": 12739522, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e34a1829de98da8572fd36d5e5b67b977c3c4719" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/dark/BakingGroup7_d.png", + "mode": "100644", + "type": "blob", + "sha": "69cb55ae64bda8b7f516dae77336f4cb6fc391f3", + "size": 16821193, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/69cb55ae64bda8b7f516dae77336f4cb6fc391f3" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light", + "mode": "040000", + "type": "tree", + "sha": "c6494f532d8976e9456f160efd2ab173c6054b5d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c6494f532d8976e9456f160efd2ab173c6054b5d" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup1.png", + "mode": "100644", + "type": "blob", + "sha": "953f65324758431c3e7396120b0113edec73b02c", + "size": 13664120, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953f65324758431c3e7396120b0113edec73b02c" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup1_1.png", + "mode": "100644", + "type": "blob", + "sha": "a1bfd362c60909741d46fff195daa2fefb8911ae", + "size": 12846858, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a1bfd362c60909741d46fff195daa2fefb8911ae" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup2.png", + "mode": "100644", + "type": "blob", + "sha": "61feaea19f5ce103338e96f1cf08e66fcd5cbf2d", + "size": 20453810, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/61feaea19f5ce103338e96f1cf08e66fcd5cbf2d" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup2_2.png", + "mode": "100644", + "type": "blob", + "sha": "53c4cd575de87b073ecf1324d2549aa8d3639a2b", + "size": 22996215, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/53c4cd575de87b073ecf1324d2549aa8d3639a2b" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup3.png", + "mode": "100644", + "type": "blob", + "sha": "0ede52ee66b0261dab6761c40f94fb3be5068abb", + "size": 12102682, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0ede52ee66b0261dab6761c40f94fb3be5068abb" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup4.png", + "mode": "100644", + "type": "blob", + "sha": "3e9d565f78cfda543f68ef1cb8c0fb35a90cfd38", + "size": 13196447, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e9d565f78cfda543f68ef1cb8c0fb35a90cfd38" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup5.png", + "mode": "100644", + "type": "blob", + "sha": "e5ef2c8ff354fac87765c3e25422dbc813e93c66", + "size": 19666590, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e5ef2c8ff354fac87765c3e25422dbc813e93c66" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup6.png", + "mode": "100644", + "type": "blob", + "sha": "b3c20be1c4b169763328dbfd21a7a9e72afcb78d", + "size": 12906672, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b3c20be1c4b169763328dbfd21a7a9e72afcb78d" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/light/BakingGroup7.png", + "mode": "100644", + "type": "blob", + "sha": "0d0eae96a9bb60480e2bde8dee04946d844ad1eb", + "size": 5089244, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0d0eae96a9bb60480e2bde8dee04946d844ad1eb" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/skies", + "mode": "040000", + "type": "tree", + "sha": "85dcfaff3c0e4ae84254fd33e82cbe563147ef2c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/85dcfaff3c0e4ae84254fd33e82cbe563147ef2c" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/skies/Studio_sky_LatLong_Dark.exr", + "mode": "100644", + "type": "blob", + "sha": "1b83ea4d27b16a5883859833fc8394e719273fd9", + "size": 9639501, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b83ea4d27b16a5883859833fc8394e719273fd9" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/Studio.rkassets/textures/skies/Studio_sky_LatLong_Light.exr", + "mode": "100644", + "type": "blob", + "sha": "bf2eae8456136f3c33259c7d51dfa858f455654f", + "size": 7737708, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf2eae8456136f3c33259c7d51dfa858f455654f" + }, + { + "path": "Packages/RealityKitContent/Sources/RealityKitContent/StudioBundle.swift", + "mode": "100644", + "type": "blob", + "sha": "cdad6bf0226e32f9fe593d311bff687cb74faa79", + "size": 236, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cdad6bf0226e32f9fe593d311bff687cb74faa79" + }, + { + "path": "Packages/Studio", + "mode": "040000", + "type": "tree", + "sha": "addca5b2340ef26c454b3c6e0301dcc84581a36e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/addca5b2340ef26c454b3c6e0301dcc84581a36e" + }, + { + "path": "Packages/Studio/.swiftpm", + "mode": "040000", + "type": "tree", + "sha": "ede04e50de369a3ffcd1eee3d9947d476dc973aa", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/ede04e50de369a3ffcd1eee3d9947d476dc973aa" + }, + { + "path": "Packages/Studio/.swiftpm/xcode", + "mode": "040000", + "type": "tree", + "sha": "dff2eb42957596d0c9e4f514d95946fee1d230fc", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dff2eb42957596d0c9e4f514d95946fee1d230fc" + }, + { + "path": "Packages/Studio/.swiftpm/xcode/package.xcworkspace", + "mode": "040000", + "type": "tree", + "sha": "5ca4cb709ff981eb3ee04b506279e2aac82ed3cb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5ca4cb709ff981eb3ee04b506279e2aac82ed3cb" + }, + { + "path": "Packages/Studio/.swiftpm/xcode/package.xcworkspace/.xcodesamplecode.plist", + "mode": "100644", + "type": "blob", + "sha": "5dd5da85fdbd81ad600c193382e3305209b9e392", + "size": 182, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5dd5da85fdbd81ad600c193382e3305209b9e392" + }, + { + "path": "Packages/Studio/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata", + "mode": "100644", + "type": "blob", + "sha": "919434a6254f0e9651f402737811be6634a03e9c", + "size": 135, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/919434a6254f0e9651f402737811be6634a03e9c" + }, + { + "path": "Packages/Studio/.swiftpm/xcode/package.xcworkspace/xcshareddata", + "mode": "040000", + "type": "tree", + "sha": "b44883c1508b68e978cf48105a7a8390f4be5627", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b44883c1508b68e978cf48105a7a8390f4be5627" + }, + { + "path": "Packages/Studio/.swiftpm/xcode/package.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings", + "mode": "100644", + "type": "blob", + "sha": "3ddf867a10ac316e9889ef77ebc4bd5217048d02", + "size": 241, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3ddf867a10ac316e9889ef77ebc4bd5217048d02" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro", + "mode": "040000", + "type": "tree", + "sha": "5a443a4285077dfe1a7e79b3ec7996bd68a25078", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5a443a4285077dfe1a7e79b3ec7996bd68a25078" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro/ProjectData", + "mode": "040000", + "type": "tree", + "sha": "b88ec9de878e2e9e0259203fff2f0fec7d9a4527", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b88ec9de878e2e9e0259203fff2f0fec7d9a4527" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro/ProjectData/main.json", + "mode": "100644", + "type": "blob", + "sha": "63892b669a8875d535941d11c08e70044b6d3521", + "size": 1242, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/63892b669a8875d535941d11c08e70044b6d3521" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro/WorkspaceData", + "mode": "040000", + "type": "tree", + "sha": "2999d036491bc47fc8ea184933c4b716c6f81174", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2999d036491bc47fc8ea184933c4b716c6f81174" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json", + "mode": "100644", + "type": "blob", + "sha": "c57fb9040db2630dd22b9927a411ad9152a54e90", + "size": 12275, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c57fb9040db2630dd22b9927a411ad9152a54e90" + }, + { + "path": "Packages/Studio/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata", + "mode": "100644", + "type": "blob", + "sha": "de0eaf2fd8448a283fe9638611455b6fea0b90a4", + "size": 255, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de0eaf2fd8448a283fe9638611455b6fea0b90a4" + }, + { + "path": "Packages/Studio/Package.swift", + "mode": "100644", + "type": "blob", + "sha": "048390bd1374db85f4460c584ef4ff98aa7411d0", + "size": 629, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/048390bd1374db85f4460c584ef4ff98aa7411d0" + }, + { + "path": "Packages/Studio/Sources", + "mode": "040000", + "type": "tree", + "sha": "a0d1b7b68ee024f6ae7de8a6c1f6af2bfb1b506b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a0d1b7b68ee024f6ae7de8a6c1f6af2bfb1b506b" + }, + { + "path": "Packages/Studio/Sources/Studio", + "mode": "040000", + "type": "tree", + "sha": "1f2b5318a9d20c1694ac046c042219ac805b4d1a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1f2b5318a9d20c1694ac046c042219ac805b4d1a" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets", + "mode": "040000", + "type": "tree", + "sha": "6edb5c76a1ec6ec6579400ac0edb9470e925dd8c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/6edb5c76a1ec6ec6579400ac0edb9470e925dd8c" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/AAA_MainScene.usda", + "mode": "100644", + "type": "blob", + "sha": "b6b86a2bfc934efcc0c9142e084190d2a87f5d2f", + "size": 3695, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6b86a2bfc934efcc0c9142e084190d2a87f5d2f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/ibl", + "mode": "040000", + "type": "tree", + "sha": "b88c72fe12e3042bfb6cdad249ca5ddd22a28ebe", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/b88c72fe12e3042bfb6cdad249ca5ddd22a28ebe" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/ibl/Studio_IBL_LatLong_Dark.exr", + "mode": "100644", + "type": "blob", + "sha": "6bfb5ff87380d3c51c49dd5de9e59ae758f23b1f", + "size": 7054487, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6bfb5ff87380d3c51c49dd5de9e59ae758f23b1f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/ibl/Studio_IBL_LatLong_Light.exr", + "mode": "100644", + "type": "blob", + "sha": "3788e5c06fc91be94dce6427c678fba641d6bf1b", + "size": 6877347, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3788e5c06fc91be94dce6427c678fba641d6bf1b" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/meshes", + "mode": "040000", + "type": "tree", + "sha": "d12cbc60579450b66d9df0d72439e26d9f40eecf", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/d12cbc60579450b66d9df0d72439e26d9f40eecf" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/meshes/Studio.usdc", + "mode": "100644", + "type": "blob", + "sha": "86edc3033af2cfbf7bc66455eef3644e8b82d316", + "size": 13505123, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/86edc3033af2cfbf7bc66455eef3644e8b82d316" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/meshes/Studio_floor_2_2_Lightspill.usdc", + "mode": "100644", + "type": "blob", + "sha": "d965e4a2627cfde08509fd7c561b2850410498b8", + "size": 5230, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d965e4a2627cfde08509fd7c561b2850410498b8" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/meshes/Studio_floor_2_Lightspill.usdc", + "mode": "100644", + "type": "blob", + "sha": "053bab51b22a0e7c8185729918879ec7a80e511f", + "size": 48027, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/053bab51b22a0e7c8185729918879ec7a80e511f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/meshes/dome.usdc", + "mode": "100644", + "type": "blob", + "sha": "dd8d44decc04015d4021a78d7a9afef62190ed3a", + "size": 86835, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd8d44decc04015d4021a78d7a9afef62190ed3a" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/scenes", + "mode": "040000", + "type": "tree", + "sha": "54daffee5973af931baf2eef4f04961f528ea9e5", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/54daffee5973af931baf2eef4f04961f528ea9e5" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/scenes/Common.usda", + "mode": "100644", + "type": "blob", + "sha": "4c9e170b021bfa36787c4c10629205341975623f", + "size": 3930, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4c9e170b021bfa36787c4c10629205341975623f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/scenes/Floor.usda", + "mode": "100644", + "type": "blob", + "sha": "97da4a34d7ba1e5bad1c27347db8c6ac021bc54b", + "size": 20615, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/97da4a34d7ba1e5bad1c27347db8c6ac021bc54b" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/scenes/StudioDark.usda", + "mode": "100644", + "type": "blob", + "sha": "0623457ab88de6a9d7feeab3d532573dd174ece1", + "size": 16644, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0623457ab88de6a9d7feeab3d532573dd174ece1" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/scenes/StudioLight.usda", + "mode": "100644", + "type": "blob", + "sha": "adeb260d75f2ed61854a7d5a565829eac86a1f13", + "size": 16954, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/adeb260d75f2ed61854a7d5a565829eac86a1f13" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures", + "mode": "040000", + "type": "tree", + "sha": "2aa66364dbf7c80717652930fe0b3ab69a2e67eb", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2aa66364dbf7c80717652930fe0b3ab69a2e67eb" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/common", + "mode": "040000", + "type": "tree", + "sha": "1d35392c4ab44b86e0de170390a6098c7cb3bbbe", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1d35392c4ab44b86e0de170390a6098c7cb3bbbe" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/common/DefaultAttenuationMap.exr", + "mode": "100644", + "type": "blob", + "sha": "1aa010948894f232b5bffcdfa498f4918d1b425f", + "size": 179530, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1aa010948894f232b5bffcdfa498f4918d1b425f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark", + "mode": "040000", + "type": "tree", + "sha": "4463b404fe89bebe77426af6c5e6ec3f0e234233", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4463b404fe89bebe77426af6c5e6ec3f0e234233" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup1_1_d.png", + "mode": "100644", + "type": "blob", + "sha": "ca1b419d550eae6a8255033ff9b5254f5c829842", + "size": 11745361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca1b419d550eae6a8255033ff9b5254f5c829842" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup1_d.png", + "mode": "100644", + "type": "blob", + "sha": "829d5367c139d8cdc36da0fd025f5844a03b08f2", + "size": 12673287, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/829d5367c139d8cdc36da0fd025f5844a03b08f2" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup2_2_d.png", + "mode": "100644", + "type": "blob", + "sha": "d2f378325ac3a81280b22fbc4b92b7e1231428e3", + "size": 16974658, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d2f378325ac3a81280b22fbc4b92b7e1231428e3" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup2_d.png", + "mode": "100644", + "type": "blob", + "sha": "30053f9185622e354e4d1bdfab8774187ff87bb7", + "size": 17081041, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/30053f9185622e354e4d1bdfab8774187ff87bb7" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup3_d.png", + "mode": "100644", + "type": "blob", + "sha": "6d363552c1bf7ded1c53b0910809eaecc77ff5e6", + "size": 11597860, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6d363552c1bf7ded1c53b0910809eaecc77ff5e6" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup4_d.png", + "mode": "100644", + "type": "blob", + "sha": "f04dfda35d56f85d3406f26db634605d3127cd80", + "size": 13780117, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f04dfda35d56f85d3406f26db634605d3127cd80" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup5_d.png", + "mode": "100644", + "type": "blob", + "sha": "31e1730e704d4c6189a1f865bf64146367754c76", + "size": 15859536, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/31e1730e704d4c6189a1f865bf64146367754c76" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup6_d.png", + "mode": "100644", + "type": "blob", + "sha": "e34a1829de98da8572fd36d5e5b67b977c3c4719", + "size": 12739522, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e34a1829de98da8572fd36d5e5b67b977c3c4719" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/dark/BakingGroup7_d.png", + "mode": "100644", + "type": "blob", + "sha": "69cb55ae64bda8b7f516dae77336f4cb6fc391f3", + "size": 16821193, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/69cb55ae64bda8b7f516dae77336f4cb6fc391f3" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light", + "mode": "040000", + "type": "tree", + "sha": "c6494f532d8976e9456f160efd2ab173c6054b5d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c6494f532d8976e9456f160efd2ab173c6054b5d" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup1.png", + "mode": "100644", + "type": "blob", + "sha": "953f65324758431c3e7396120b0113edec73b02c", + "size": 13664120, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/953f65324758431c3e7396120b0113edec73b02c" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup1_1.png", + "mode": "100644", + "type": "blob", + "sha": "a1bfd362c60909741d46fff195daa2fefb8911ae", + "size": 12846858, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a1bfd362c60909741d46fff195daa2fefb8911ae" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup2.png", + "mode": "100644", + "type": "blob", + "sha": "61feaea19f5ce103338e96f1cf08e66fcd5cbf2d", + "size": 20453810, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/61feaea19f5ce103338e96f1cf08e66fcd5cbf2d" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup2_2.png", + "mode": "100644", + "type": "blob", + "sha": "53c4cd575de87b073ecf1324d2549aa8d3639a2b", + "size": 22996215, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/53c4cd575de87b073ecf1324d2549aa8d3639a2b" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup3.png", + "mode": "100644", + "type": "blob", + "sha": "0ede52ee66b0261dab6761c40f94fb3be5068abb", + "size": 12102682, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0ede52ee66b0261dab6761c40f94fb3be5068abb" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup4.png", + "mode": "100644", + "type": "blob", + "sha": "3e9d565f78cfda543f68ef1cb8c0fb35a90cfd38", + "size": 13196447, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3e9d565f78cfda543f68ef1cb8c0fb35a90cfd38" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup5.png", + "mode": "100644", + "type": "blob", + "sha": "e5ef2c8ff354fac87765c3e25422dbc813e93c66", + "size": 19666590, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e5ef2c8ff354fac87765c3e25422dbc813e93c66" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup6.png", + "mode": "100644", + "type": "blob", + "sha": "b3c20be1c4b169763328dbfd21a7a9e72afcb78d", + "size": 12906672, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b3c20be1c4b169763328dbfd21a7a9e72afcb78d" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/light/BakingGroup7.png", + "mode": "100644", + "type": "blob", + "sha": "0d0eae96a9bb60480e2bde8dee04946d844ad1eb", + "size": 5089244, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0d0eae96a9bb60480e2bde8dee04946d844ad1eb" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/skies", + "mode": "040000", + "type": "tree", + "sha": "85dcfaff3c0e4ae84254fd33e82cbe563147ef2c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/85dcfaff3c0e4ae84254fd33e82cbe563147ef2c" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/skies/Studio_sky_LatLong_Dark.exr", + "mode": "100644", + "type": "blob", + "sha": "1b83ea4d27b16a5883859833fc8394e719273fd9", + "size": 9639501, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b83ea4d27b16a5883859833fc8394e719273fd9" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.rkassets/textures/skies/Studio_sky_LatLong_Light.exr", + "mode": "100644", + "type": "blob", + "sha": "bf2eae8456136f3c33259c7d51dfa858f455654f", + "size": 7737708, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf2eae8456136f3c33259c7d51dfa858f455654f" + }, + { + "path": "Packages/Studio/Sources/Studio/Studio.swift", + "mode": "100644", + "type": "blob", + "sha": "fbdb2ddf0137e4bacfbe4ad7a43a42d654b834bc", + "size": 203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fbdb2ddf0137e4bacfbe4ad7a43a42d654b834bc" + }, + { + "path": "README.md", + "mode": "100644", + "type": "blob", + "sha": "5e597c5998372288440a1392e5fbb817a621a828", + "size": 10123, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5e597c5998372288440a1392e5fbb817a621a828" + }, + { + "path": "Screenshots", + "mode": "040000", + "type": "tree", + "sha": "9fa2a46057888286fef3ceadbf546c7503730282", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9fa2a46057888286fef3ceadbf546c7503730282" + }, + { + "path": "Screenshots/Simulator Screen Shot - Apple TV 4K - 2019-09-22 at 21.14.05.png", + "mode": "100644", + "type": "blob", + "sha": "f0f36e98fcccf5531c08dac88f8775a8b4de62e0", + "size": 5722963, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f0f36e98fcccf5531c08dac88f8775a8b4de62e0" + }, + { + "path": "Screenshots/Simulator Screen Shot - Apple TV 4K - 2019-09-22 at 21.14.56.png", + "mode": "100644", + "type": "blob", + "sha": "a78bdcbdc93dd89b21f369cdf66e4545e8073d0e", + "size": 7322259, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a78bdcbdc93dd89b21f369cdf66e4545e8073d0e" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPad Pro (12.9-inch) (2nd generation) - 2018-06-17 at 20.04.36.png", + "mode": "100644", + "type": "blob", + "sha": "cc495bbddbb3679cc2958040675da73e69962a5b", + "size": 4199799, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cc495bbddbb3679cc2958040675da73e69962a5b" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPad Pro (12.9-inch) (2nd generation) - 2019-09-21 at 11.26.39.png", + "mode": "100644", + "type": "blob", + "sha": "fd7e9c3fe29cae6b204e30c6526b180627dfcdcf", + "size": 149406, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd7e9c3fe29cae6b204e30c6526b180627dfcdcf" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPad Pro (12.9-inch) (2nd generation) - 2019-09-21 at 11.26.49.png", + "mode": "100644", + "type": "blob", + "sha": "9f3a5af391fba00a309e5a4c8d57cfe8a9d077ed", + "size": 244975, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9f3a5af391fba00a309e5a4c8d57cfe8a9d077ed" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPad Pro (12.9-inch) (3rd generation) - 2019-09-21 at 11.19.51.png", + "mode": "100644", + "type": "blob", + "sha": "7b52ca7c66e64aed325215b0542d85e7c012343b", + "size": 150203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7b52ca7c66e64aed325215b0542d85e7c012343b" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPad Pro (12.9-inch) (3rd generation) - 2019-09-21 at 11.22.30.png", + "mode": "100644", + "type": "blob", + "sha": "938af499f04d2e2ec486f2960b926ce683c834b5", + "size": 245887, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/938af499f04d2e2ec486f2960b926ce683c834b5" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPhone 11 Pro Max - 2019-09-21 at 11.12.27.png", + "mode": "100644", + "type": "blob", + "sha": "a41ad224a8192180869122e7a727af4f413fa454", + "size": 112461, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a41ad224a8192180869122e7a727af4f413fa454" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPhone 11 Pro Max - 2019-09-21 at 11.12.37.png", + "mode": "100644", + "type": "blob", + "sha": "0e1d0453ad915c87bb61e6c6356dc87939cc11cb", + "size": 225502, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0e1d0453ad915c87bb61e6c6356dc87939cc11cb" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPhone 8 Plus - 2019-09-21 at 11.16.58.png", + "mode": "100644", + "type": "blob", + "sha": "65d497b6e78e7b54bc23f9471fad7542912e2f88", + "size": 101368, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/65d497b6e78e7b54bc23f9471fad7542912e2f88" + }, + { + "path": "Screenshots/Simulator Screen Shot - iPhone 8 Plus - 2019-09-21 at 11.17.02.png", + "mode": "100644", + "type": "blob", + "sha": "f8e0be1bacf08d1eb6fab5e236dca37c658af161", + "size": 212824, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f8e0be1bacf08d1eb6fab5e236dca37c658af161" + }, + { + "path": "X1Kit", + "mode": "160000", + "type": "commit", + "sha": "6e842ae9d5a21916d7c9693c7385d1ac672bc4fa" + }, + { + "path": "appveyor.yml", + "mode": "100644", + "type": "blob", + "sha": "ab99c2a53e4ad70df6bed87f0176d53db0f264b4", + "size": 728, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ab99c2a53e4ad70df6bed87f0176d53db0f264b4" + }, + { + "path": "libs", + "mode": "040000", + "type": "tree", + "sha": "9f1a7bfa79b0f77a02d854d1642861ea06b0e846", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/9f1a7bfa79b0f77a02d854d1642861ea06b0e846" + }, + { + "path": "libs/Build-OpenSSL.txt", + "mode": "100644", + "type": "blob", + "sha": "d63393ed2371e43a95d45816bd0485fd8c2124ab", + "size": 384, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d63393ed2371e43a95d45816bd0485fd8c2124ab" + }, + { + "path": "libs/Build.txt", + "mode": "100644", + "type": "blob", + "sha": "651ca76b2f9331f5a5b36083c5c316adcbc32470", + "size": 100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/651ca76b2f9331f5a5b36083c5c316adcbc32470" + }, + { + "path": "libs/FFmpeg", + "mode": "040000", + "type": "tree", + "sha": "318f02cbfe469635af9e2ccf7b338f8c169f594c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/318f02cbfe469635af9e2ccf7b338f8c169f594c" + }, + { + "path": "libs/FFmpeg/include", + "mode": "040000", + "type": "tree", + "sha": "2a8e9f9aa94ca6f3e6e2581d7c7c934cf8856460", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2a8e9f9aa94ca6f3e6e2581d7c7c934cf8856460" + }, + { + "path": "libs/FFmpeg/include/libavcodec", + "mode": "040000", + "type": "tree", + "sha": "8bbc157483d7803e174e5fc0aeb42fb13c62d640", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/8bbc157483d7803e174e5fc0aeb42fb13c62d640" + }, + { + "path": "libs/FFmpeg/include/libavcodec/ac3_parser.h", + "mode": "100644", + "type": "blob", + "sha": "ff8cc4cf093116dd677a010aa1407ce6af81a25d", + "size": 1207, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff8cc4cf093116dd677a010aa1407ce6af81a25d" + }, + { + "path": "libs/FFmpeg/include/libavcodec/adts_parser.h", + "mode": "100644", + "type": "blob", + "sha": "f85becd13138e4e80032097286bd3c5a294f8a6a", + "size": 1354, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f85becd13138e4e80032097286bd3c5a294f8a6a" + }, + { + "path": "libs/FFmpeg/include/libavcodec/av1.h", + "mode": "100644", + "type": "blob", + "sha": "8704bc41c122f135aaaacde5a870caba7e7e5c2b", + "size": 5336, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8704bc41c122f135aaaacde5a870caba7e7e5c2b" + }, + { + "path": "libs/FFmpeg/include/libavcodec/avcodec.h", + "mode": "100644", + "type": "blob", + "sha": "7fb44e28f4581446e465e5a9203cb05bfe475765", + "size": 114251, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7fb44e28f4581446e465e5a9203cb05bfe475765" + }, + { + "path": "libs/FFmpeg/include/libavcodec/avdct.h", + "mode": "100644", + "type": "blob", + "sha": "6411fab6f637fee80978029fbee26203911a9edf", + "size": 2726, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6411fab6f637fee80978029fbee26203911a9edf" + }, + { + "path": "libs/FFmpeg/include/libavcodec/avfft.h", + "mode": "100644", + "type": "blob", + "sha": "e3a0da1eb911281d351895633fb3eca3e1fe6486", + "size": 4081, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e3a0da1eb911281d351895633fb3eca3e1fe6486" + }, + { + "path": "libs/FFmpeg/include/libavcodec/bsf.h", + "mode": "100644", + "type": "blob", + "sha": "a09c69f24286dc26159e1c2f4648c868f98f5d01", + "size": 11540, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a09c69f24286dc26159e1c2f4648c868f98f5d01" + }, + { + "path": "libs/FFmpeg/include/libavcodec/cbs.h", + "mode": "100644", + "type": "blob", + "sha": "d479b1ac2da9b13e78a4e582cc5cdf8d2cbaae92", + "size": 17308, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d479b1ac2da9b13e78a4e582cc5cdf8d2cbaae92" + }, + { + "path": "libs/FFmpeg/include/libavcodec/cbs_av1.h", + "mode": "100644", + "type": "blob", + "sha": "a5402f069d33d65c31231638b81062ebc3c59ea0", + "size": 14183, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a5402f069d33d65c31231638b81062ebc3c59ea0" + }, + { + "path": "libs/FFmpeg/include/libavcodec/codec.h", + "mode": "100644", + "type": "blob", + "sha": "8034f1a53c98d80408391c5db483718d1ff95fd5", + "size": 13460, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8034f1a53c98d80408391c5db483718d1ff95fd5" + }, + { + "path": "libs/FFmpeg/include/libavcodec/codec_desc.h", + "mode": "100644", + "type": "blob", + "sha": "96afd20208b3dd4c3eb44710d45c61e116a9dbce", + "size": 3974, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/96afd20208b3dd4c3eb44710d45c61e116a9dbce" + }, + { + "path": "libs/FFmpeg/include/libavcodec/codec_id.h", + "mode": "100644", + "type": "blob", + "sha": "29b410b8d3fb42b2a1967f87d4a81bc5b163e393", + "size": 18020, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/29b410b8d3fb42b2a1967f87d4a81bc5b163e393" + }, + { + "path": "libs/FFmpeg/include/libavcodec/codec_par.h", + "mode": "100644", + "type": "blob", + "sha": "64882a97264e598e3971b4edcd40e6ff27cd7e51", + "size": 8065, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/64882a97264e598e3971b4edcd40e6ff27cd7e51" + }, + { + "path": "libs/FFmpeg/include/libavcodec/d3d11va.h", + "mode": "100644", + "type": "blob", + "sha": "6816b6c1e68494bc6d6f0b14cbd232bbcc714a05", + "size": 2853, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6816b6c1e68494bc6d6f0b14cbd232bbcc714a05" + }, + { + "path": "libs/FFmpeg/include/libavcodec/defs.h", + "mode": "100644", + "type": "blob", + "sha": "00d840ec19b6f1ccba0bb39f29a90d670f84150d", + "size": 12358, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/00d840ec19b6f1ccba0bb39f29a90d670f84150d" + }, + { + "path": "libs/FFmpeg/include/libavcodec/dirac.h", + "mode": "100644", + "type": "blob", + "sha": "8c348cdc02758bee5785dead0e598ac8b86144c2", + "size": 4126, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8c348cdc02758bee5785dead0e598ac8b86144c2" + }, + { + "path": "libs/FFmpeg/include/libavcodec/dv_profile.h", + "mode": "100644", + "type": "blob", + "sha": "4365f1b4b1492b6e7ea9218697aa0f7b8f39722c", + "size": 3694, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4365f1b4b1492b6e7ea9218697aa0f7b8f39722c" + }, + { + "path": "libs/FFmpeg/include/libavcodec/dxva2.h", + "mode": "100644", + "type": "blob", + "sha": "22c93992f22284c7e2ac92c5bf23faa3df6e6272", + "size": 2361, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/22c93992f22284c7e2ac92c5bf23faa3df6e6272" + }, + { + "path": "libs/FFmpeg/include/libavcodec/jni.h", + "mode": "100644", + "type": "blob", + "sha": "dd99e92611322b5ac590daea689d920b358b272c", + "size": 1650, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd99e92611322b5ac590daea689d920b358b272c" + }, + { + "path": "libs/FFmpeg/include/libavcodec/mediacodec.h", + "mode": "100644", + "type": "blob", + "sha": "4e9b56a618454d5439e955598ee870a2c1f75b9b", + "size": 3570, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4e9b56a618454d5439e955598ee870a2c1f75b9b" + }, + { + "path": "libs/FFmpeg/include/libavcodec/packet.h", + "mode": "100644", + "type": "blob", + "sha": "b19409b7192b005ed193e47eff65522ab106abad", + "size": 28678, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b19409b7192b005ed193e47eff65522ab106abad" + }, + { + "path": "libs/FFmpeg/include/libavcodec/qsv.h", + "mode": "100644", + "type": "blob", + "sha": "c156b08d0737d98581044fbefff8fc6a2084e377", + "size": 3844, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c156b08d0737d98581044fbefff8fc6a2084e377" + }, + { + "path": "libs/FFmpeg/include/libavcodec/vdpau.h", + "mode": "100644", + "type": "blob", + "sha": "35c4b1096bafe82c87ca943b931859dc885c096d", + "size": 5104, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35c4b1096bafe82c87ca943b931859dc885c096d" + }, + { + "path": "libs/FFmpeg/include/libavcodec/version.h", + "mode": "100644", + "type": "blob", + "sha": "d6f1440d5402ab25ad59e4b7d9afea15984e31d8", + "size": 1619, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d6f1440d5402ab25ad59e4b7d9afea15984e31d8" + }, + { + "path": "libs/FFmpeg/include/libavcodec/version_major.h", + "mode": "100644", + "type": "blob", + "sha": "b9164fe5c628d60449f42c13fd2eaf7abb13b503", + "size": 2494, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b9164fe5c628d60449f42c13fd2eaf7abb13b503" + }, + { + "path": "libs/FFmpeg/include/libavcodec/videotoolbox.h", + "mode": "100644", + "type": "blob", + "sha": "ba5eddbf460295d57baa6529112039b7f21622be", + "size": 4677, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ba5eddbf460295d57baa6529112039b7f21622be" + }, + { + "path": "libs/FFmpeg/include/libavcodec/vorbis_parser.h", + "mode": "100644", + "type": "blob", + "sha": "789932ac4922de0d0754226604802b0d1a8045c1", + "size": 2285, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/789932ac4922de0d0754226604802b0d1a8045c1" + }, + { + "path": "libs/FFmpeg/include/libavcodec/xvmc.h", + "mode": "100644", + "type": "blob", + "sha": "52e70c0d77e336ad48e88d4b14eaef2804eb2a6d", + "size": 6136, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/52e70c0d77e336ad48e88d4b14eaef2804eb2a6d" + }, + { + "path": "libs/FFmpeg/include/libavformat", + "mode": "040000", + "type": "tree", + "sha": "dd23368ab54d29324dd77d5ebc4177671b991351", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dd23368ab54d29324dd77d5ebc4177671b991351" + }, + { + "path": "libs/FFmpeg/include/libavformat/avformat.h", + "mode": "100644", + "type": "blob", + "sha": "9e7eca007eef34ef9e15df8e25e8b9e97f268d5a", + "size": 110803, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e7eca007eef34ef9e15df8e25e8b9e97f268d5a" + }, + { + "path": "libs/FFmpeg/include/libavformat/avio.h", + "mode": "100644", + "type": "blob", + "sha": "887a397c3788cce0dab511a42c555a179a5ad37e", + "size": 31681, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/887a397c3788cce0dab511a42c555a179a5ad37e" + }, + { + "path": "libs/FFmpeg/include/libavformat/version.h", + "mode": "100644", + "type": "blob", + "sha": "2a28a3bf400cf2ba0219772d3addb6c7d1175ea1", + "size": 1652, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a28a3bf400cf2ba0219772d3addb6c7d1175ea1" + }, + { + "path": "libs/FFmpeg/include/libavformat/version_major.h", + "mode": "100644", + "type": "blob", + "sha": "224fdacf2350fa50a662484a12f530f1ec76b04f", + "size": 2240, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/224fdacf2350fa50a662484a12f530f1ec76b04f" + }, + { + "path": "libs/FFmpeg/include/libavutil", + "mode": "040000", + "type": "tree", + "sha": "04a731f5fa605b5845754e6541bdbf9fedd6075e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/04a731f5fa605b5845754e6541bdbf9fedd6075e" + }, + { + "path": "libs/FFmpeg/include/libavutil/adler32.h", + "mode": "100644", + "type": "blob", + "sha": "232d07f5fe8220cd8ed80d9df3fa3a69b5ad7f90", + "size": 1696, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/232d07f5fe8220cd8ed80d9df3fa3a69b5ad7f90" + }, + { + "path": "libs/FFmpeg/include/libavutil/aes.h", + "mode": "100644", + "type": "blob", + "sha": "4e73473688fdb8e2ca832bbc737068d9005f3fa1", + "size": 1912, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4e73473688fdb8e2ca832bbc737068d9005f3fa1" + }, + { + "path": "libs/FFmpeg/include/libavutil/aes_ctr.h", + "mode": "100644", + "type": "blob", + "sha": "d98c071227694d8f458f543d7d6364024ceca7d4", + "size": 2443, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d98c071227694d8f458f543d7d6364024ceca7d4" + }, + { + "path": "libs/FFmpeg/include/libavutil/ambient_viewing_environment.h", + "mode": "100644", + "type": "blob", + "sha": "e5e4ac2173282364e7eebc002c36ef81bbd1ea03", + "size": 2585, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e5e4ac2173282364e7eebc002c36ef81bbd1ea03" + }, + { + "path": "libs/FFmpeg/include/libavutil/attributes.h", + "mode": "100644", + "type": "blob", + "sha": "04c615c952c467f6061588606c695a548cd2e130", + "size": 4850, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/04c615c952c467f6061588606c695a548cd2e130" + }, + { + "path": "libs/FFmpeg/include/libavutil/audio_fifo.h", + "mode": "100644", + "type": "blob", + "sha": "fa5f59a2bef2bd3900e81454e3a99c64055b03b8", + "size": 5966, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fa5f59a2bef2bd3900e81454e3a99c64055b03b8" + }, + { + "path": "libs/FFmpeg/include/libavutil/avassert.h", + "mode": "100644", + "type": "blob", + "sha": "1895fb75513bfad4e1842b248f384f1c725e1507", + "size": 2408, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1895fb75513bfad4e1842b248f384f1c725e1507" + }, + { + "path": "libs/FFmpeg/include/libavutil/avconfig.h", + "mode": "100644", + "type": "blob", + "sha": "c289fbb551c1f89b72e8090b81139d8fb745af08", + "size": 180, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c289fbb551c1f89b72e8090b81139d8fb745af08" + }, + { + "path": "libs/FFmpeg/include/libavutil/avstring.h", + "mode": "100644", + "type": "blob", + "sha": "fc095349d26529e06d496e569c5550158a46d1a2", + "size": 14940, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fc095349d26529e06d496e569c5550158a46d1a2" + }, + { + "path": "libs/FFmpeg/include/libavutil/avutil.h", + "mode": "100644", + "type": "blob", + "sha": "a362c8baa831aeef83efc97ce0ab2f9a9221d3f1", + "size": 9968, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a362c8baa831aeef83efc97ce0ab2f9a9221d3f1" + }, + { + "path": "libs/FFmpeg/include/libavutil/base64.h", + "mode": "100644", + "type": "blob", + "sha": "2954c12d4271c7411e117c120e24f13f2cf8744b", + "size": 2285, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2954c12d4271c7411e117c120e24f13f2cf8744b" + }, + { + "path": "libs/FFmpeg/include/libavutil/blowfish.h", + "mode": "100644", + "type": "blob", + "sha": "9e289a40dabe535dc151a2345f49a753f3f640e2", + "size": 2394, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9e289a40dabe535dc151a2345f49a753f3f640e2" + }, + { + "path": "libs/FFmpeg/include/libavutil/bprint.h", + "mode": "100644", + "type": "blob", + "sha": "85597454788d6303936e696a49a808aec5bce77f", + "size": 8812, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/85597454788d6303936e696a49a808aec5bce77f" + }, + { + "path": "libs/FFmpeg/include/libavutil/bswap.h", + "mode": "100644", + "type": "blob", + "sha": "4840ab433f20bc3719143505d2f1ba4ddfa62094", + "size": 2903, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4840ab433f20bc3719143505d2f1ba4ddfa62094" + }, + { + "path": "libs/FFmpeg/include/libavutil/buffer.h", + "mode": "100644", + "type": "blob", + "sha": "e1ef5b7f07fc52f535c6c6f5db6ad2ab8dbb0729", + "size": 11998, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e1ef5b7f07fc52f535c6c6f5db6ad2ab8dbb0729" + }, + { + "path": "libs/FFmpeg/include/libavutil/camellia.h", + "mode": "100644", + "type": "blob", + "sha": "96787102e2acfd54a40d4a2362b9a54ac7f90a6c", + "size": 2139, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/96787102e2acfd54a40d4a2362b9a54ac7f90a6c" + }, + { + "path": "libs/FFmpeg/include/libavutil/cast5.h", + "mode": "100644", + "type": "blob", + "sha": "ad5b347e685ed06d1170b75cad968b21b71ba4c0", + "size": 2561, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ad5b347e685ed06d1170b75cad968b21b71ba4c0" + }, + { + "path": "libs/FFmpeg/include/libavutil/channel_layout.h", + "mode": "100644", + "type": "blob", + "sha": "c9c404ef185712dfafb3e4da301c578e0494daf3", + "size": 33727, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c9c404ef185712dfafb3e4da301c578e0494daf3" + }, + { + "path": "libs/FFmpeg/include/libavutil/common.h", + "mode": "100644", + "type": "blob", + "sha": "de2140a678670176da9b14c31500dbfb02192783", + "size": 17166, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/de2140a678670176da9b14c31500dbfb02192783" + }, + { + "path": "libs/FFmpeg/include/libavutil/cpu.h", + "mode": "100644", + "type": "blob", + "sha": "8dff3418864c7ba900992ca16c9be8acdd062758", + "size": 6320, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8dff3418864c7ba900992ca16c9be8acdd062758" + }, + { + "path": "libs/FFmpeg/include/libavutil/crc.h", + "mode": "100644", + "type": "blob", + "sha": "7f59812a18c9e89990aa9aac82fb166b07dd2fa8", + "size": 3259, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7f59812a18c9e89990aa9aac82fb166b07dd2fa8" + }, + { + "path": "libs/FFmpeg/include/libavutil/csp.h", + "mode": "100644", + "type": "blob", + "sha": "73bce52bc0c8cad46f74a957dfd2913fe790df78", + "size": 4927, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/73bce52bc0c8cad46f74a957dfd2913fe790df78" + }, + { + "path": "libs/FFmpeg/include/libavutil/des.h", + "mode": "100644", + "type": "blob", + "sha": "3a3e6fa47cef6ef6111a221d8d0b6f991b446dc2", + "size": 2514, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3a3e6fa47cef6ef6111a221d8d0b6f991b446dc2" + }, + { + "path": "libs/FFmpeg/include/libavutil/detection_bbox.h", + "mode": "100644", + "type": "blob", + "sha": "011988052c23f34cd27df4cdda445705c57ed102", + "size": 3524, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/011988052c23f34cd27df4cdda445705c57ed102" + }, + { + "path": "libs/FFmpeg/include/libavutil/dict.h", + "mode": "100644", + "type": "blob", + "sha": "713c9e361af83391089601972f2d6e9c2e9c1407", + "size": 9374, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/713c9e361af83391089601972f2d6e9c2e9c1407" + }, + { + "path": "libs/FFmpeg/include/libavutil/display.h", + "mode": "100644", + "type": "blob", + "sha": "50f2b44caf574e48a382394203f19e7e955e0ed1", + "size": 3472, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50f2b44caf574e48a382394203f19e7e955e0ed1" + }, + { + "path": "libs/FFmpeg/include/libavutil/dovi_meta.h", + "mode": "100644", + "type": "blob", + "sha": "3d11e02bffc8781a6eaacb2e13abeb861e17ad07", + "size": 7641, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3d11e02bffc8781a6eaacb2e13abeb861e17ad07" + }, + { + "path": "libs/FFmpeg/include/libavutil/downmix_info.h", + "mode": "100644", + "type": "blob", + "sha": "221cf5bf9bafb86a64c253b5097b7dc2625e8fa2", + "size": 3235, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/221cf5bf9bafb86a64c253b5097b7dc2625e8fa2" + }, + { + "path": "libs/FFmpeg/include/libavutil/encryption_info.h", + "mode": "100644", + "type": "blob", + "sha": "8fe7ebfe43203f63e88c07c115e5c00c097fef1c", + "size": 7056, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8fe7ebfe43203f63e88c07c115e5c00c097fef1c" + }, + { + "path": "libs/FFmpeg/include/libavutil/error.h", + "mode": "100644", + "type": "blob", + "sha": "0d3269aa6da136e849faa7f810ae36748659a2e0", + "size": 5489, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0d3269aa6da136e849faa7f810ae36748659a2e0" + }, + { + "path": "libs/FFmpeg/include/libavutil/eval.h", + "mode": "100644", + "type": "blob", + "sha": "ee8cffb057accc0ee5221f9e3f3789dbfb19d247", + "size": 6599, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ee8cffb057accc0ee5221f9e3f3789dbfb19d247" + }, + { + "path": "libs/FFmpeg/include/libavutil/executor.h", + "mode": "100644", + "type": "blob", + "sha": "c602bcb613bd32c076eb1291aef1405a3cfc2af8", + "size": 1885, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c602bcb613bd32c076eb1291aef1405a3cfc2af8" + }, + { + "path": "libs/FFmpeg/include/libavutil/ffversion.h", + "mode": "100644", + "type": "blob", + "sha": "0ce0c688b9460e364fdf21628c26d246c21a7c0d", + "size": 199, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0ce0c688b9460e364fdf21628c26d246c21a7c0d" + }, + { + "path": "libs/FFmpeg/include/libavutil/fifo.h", + "mode": "100644", + "type": "blob", + "sha": "ce3a2aed7cec50ab429e785f7dc752d41d04e366", + "size": 15452, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ce3a2aed7cec50ab429e785f7dc752d41d04e366" + }, + { + "path": "libs/FFmpeg/include/libavutil/file.h", + "mode": "100644", + "type": "blob", + "sha": "fc87a9cd6a601f8440e4af6ab4779eabba7423d5", + "size": 3039, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fc87a9cd6a601f8440e4af6ab4779eabba7423d5" + }, + { + "path": "libs/FFmpeg/include/libavutil/film_grain_params.h", + "mode": "100644", + "type": "blob", + "sha": "f3bd0a4a6a3453d937bb2751c1072b526be420d0", + "size": 8499, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f3bd0a4a6a3453d937bb2751c1072b526be420d0" + }, + { + "path": "libs/FFmpeg/include/libavutil/frame.h", + "mode": "100644", + "type": "blob", + "sha": "c0c1b23db7ced8a55165f293b379360eb914c042", + "size": 35894, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c0c1b23db7ced8a55165f293b379360eb914c042" + }, + { + "path": "libs/FFmpeg/include/libavutil/hash.h", + "mode": "100644", + "type": "blob", + "sha": "94151ded7cbcaff9f5ea981988f7337b2740022e", + "size": 8457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/94151ded7cbcaff9f5ea981988f7337b2740022e" + }, + { + "path": "libs/FFmpeg/include/libavutil/hdr_dynamic_metadata.h", + "mode": "100644", + "type": "blob", + "sha": "09e9d8bbccf4b8c963994214126f96e34a5cbe0e", + "size": 14385, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/09e9d8bbccf4b8c963994214126f96e34a5cbe0e" + }, + { + "path": "libs/FFmpeg/include/libavutil/hdr_dynamic_vivid_metadata.h", + "mode": "100644", + "type": "blob", + "sha": "4524a815578a5dcfe8c212c6990df9a29427d65f", + "size": 10004, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4524a815578a5dcfe8c212c6990df9a29427d65f" + }, + { + "path": "libs/FFmpeg/include/libavutil/hmac.h", + "mode": "100644", + "type": "blob", + "sha": "ca4da6a689d9a32f6fa86b3875f4d12f9c5f0501", + "size": 2865, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca4da6a689d9a32f6fa86b3875f4d12f9c5f0501" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext.h", + "mode": "100644", + "type": "blob", + "sha": "7ff08c86085f3e4112448a04f51353bea804a8cd", + "size": 24341, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ff08c86085f3e4112448a04f51353bea804a8cd" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_cuda.h", + "mode": "100644", + "type": "blob", + "sha": "cbad434fead0d40c419dedb0b4caa569ed3ef992", + "size": 1843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cbad434fead0d40c419dedb0b4caa569ed3ef992" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_d3d11va.h", + "mode": "100644", + "type": "blob", + "sha": "77d2d72f1b911f2c31c9528005ae9b8939591140", + "size": 6669, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/77d2d72f1b911f2c31c9528005ae9b8939591140" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_drm.h", + "mode": "100644", + "type": "blob", + "sha": "42709f215ef9adc7d5eee2ea2574c198d8171534", + "size": 4673, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42709f215ef9adc7d5eee2ea2574c198d8171534" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_dxva2.h", + "mode": "100644", + "type": "blob", + "sha": "e1b79bc0dee8c25657d63da619c9265b958a5520", + "size": 2411, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e1b79bc0dee8c25657d63da619c9265b958a5520" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_mediacodec.h", + "mode": "100644", + "type": "blob", + "sha": "fc0263cabce8fafe8fdbff1c1b4c37f5659c3972", + "size": 1988, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fc0263cabce8fafe8fdbff1c1b4c37f5659c3972" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_opencl.h", + "mode": "100644", + "type": "blob", + "sha": "ef54486c95f004aeccdd09404c6c3b4507924ff4", + "size": 3097, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ef54486c95f004aeccdd09404c6c3b4507924ff4" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_qsv.h", + "mode": "100644", + "type": "blob", + "sha": "e2dba8ad8383365749a1fb4e6ffce007cbec0fde", + "size": 1960, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e2dba8ad8383365749a1fb4e6ffce007cbec0fde" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_vaapi.h", + "mode": "100644", + "type": "blob", + "sha": "0b2e071cb33533cc8e5db32c540591291392430c", + "size": 3787, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0b2e071cb33533cc8e5db32c540591291392430c" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_vdpau.h", + "mode": "100644", + "type": "blob", + "sha": "1b7ea1e443bdc4938416e1cd10c4263007e0c52d", + "size": 1360, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b7ea1e443bdc4938416e1cd10c4263007e0c52d" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_videotoolbox.h", + "mode": "100644", + "type": "blob", + "sha": "25dde85df58bbe6e6ec5b1a2a3a97d7c7fc6ea72", + "size": 3431, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/25dde85df58bbe6e6ec5b1a2a3a97d7c7fc6ea72" + }, + { + "path": "libs/FFmpeg/include/libavutil/hwcontext_vulkan.h", + "mode": "100644", + "type": "blob", + "sha": "895794c8679144fad94add3f9e0bcb2df070c231", + "size": 11412, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/895794c8679144fad94add3f9e0bcb2df070c231" + }, + { + "path": "libs/FFmpeg/include/libavutil/imgutils.h", + "mode": "100644", + "type": "blob", + "sha": "fa3bb101b139186f8372fa00e83381dc45db2f8e", + "size": 14819, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fa3bb101b139186f8372fa00e83381dc45db2f8e" + }, + { + "path": "libs/FFmpeg/include/libavutil/intfloat.h", + "mode": "100644", + "type": "blob", + "sha": "fe3d7ec4a5b6f5f616c103aef5a5cf7ec01f8242", + "size": 1726, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fe3d7ec4a5b6f5f616c103aef5a5cf7ec01f8242" + }, + { + "path": "libs/FFmpeg/include/libavutil/intreadwrite.h", + "mode": "100644", + "type": "blob", + "sha": "21df7887f36e47fbbcec55ea3f9b12e584c0b85d", + "size": 18735, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/21df7887f36e47fbbcec55ea3f9b12e584c0b85d" + }, + { + "path": "libs/FFmpeg/include/libavutil/lfg.h", + "mode": "100644", + "type": "blob", + "sha": "e75a986f12d3d51c70878acd823aafa94eff4e7d", + "size": 2541, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e75a986f12d3d51c70878acd823aafa94eff4e7d" + }, + { + "path": "libs/FFmpeg/include/libavutil/log.h", + "mode": "100644", + "type": "blob", + "sha": "ab7ceabe2234a7b23e0768e4adcdcbaf52bb8e36", + "size": 12766, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ab7ceabe2234a7b23e0768e4adcdcbaf52bb8e36" + }, + { + "path": "libs/FFmpeg/include/libavutil/lzo.h", + "mode": "100644", + "type": "blob", + "sha": "c03403992d5f68e7fa8e0e1240522366bb99eee4", + "size": 2048, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c03403992d5f68e7fa8e0e1240522366bb99eee4" + }, + { + "path": "libs/FFmpeg/include/libavutil/macros.h", + "mode": "100644", + "type": "blob", + "sha": "2a7567c3ea8fb3884437362e0643ed8135e6eec5", + "size": 2304, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2a7567c3ea8fb3884437362e0643ed8135e6eec5" + }, + { + "path": "libs/FFmpeg/include/libavutil/mastering_display_metadata.h", + "mode": "100644", + "type": "blob", + "sha": "c23b07c3cd80d9239138eb5589b7203c2e11ccb0", + "size": 3944, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c23b07c3cd80d9239138eb5589b7203c2e11ccb0" + }, + { + "path": "libs/FFmpeg/include/libavutil/mathematics.h", + "mode": "100644", + "type": "blob", + "sha": "e213bab68c9c9ec341d239034d5ac86762e1f0e4", + "size": 9563, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e213bab68c9c9ec341d239034d5ac86762e1f0e4" + }, + { + "path": "libs/FFmpeg/include/libavutil/md5.h", + "mode": "100644", + "type": "blob", + "sha": "fc2eabdb162ffd499d3ad2b6478acc03c35112c9", + "size": 2092, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fc2eabdb162ffd499d3ad2b6478acc03c35112c9" + }, + { + "path": "libs/FFmpeg/include/libavutil/mem.h", + "mode": "100644", + "type": "blob", + "sha": "ab7648ac5705f8534d014a79d2ac0beb44f34bde", + "size": 20457, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ab7648ac5705f8534d014a79d2ac0beb44f34bde" + }, + { + "path": "libs/FFmpeg/include/libavutil/motion_vector.h", + "mode": "100644", + "type": "blob", + "sha": "ec295563889a0a79ab9a8de8c147292fab1bb7ee", + "size": 1770, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ec295563889a0a79ab9a8de8c147292fab1bb7ee" + }, + { + "path": "libs/FFmpeg/include/libavutil/murmur3.h", + "mode": "100644", + "type": "blob", + "sha": "d90bc2fcd131c56569aa6b38f2fd7acef46eb739", + "size": 3507, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d90bc2fcd131c56569aa6b38f2fd7acef46eb739" + }, + { + "path": "libs/FFmpeg/include/libavutil/opt.h", + "mode": "100644", + "type": "blob", + "sha": "461b5d3b6bb2ac93e7fc7286f9d3fce2acba6379", + "size": 37201, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/461b5d3b6bb2ac93e7fc7286f9d3fce2acba6379" + }, + { + "path": "libs/FFmpeg/include/libavutil/parseutils.h", + "mode": "100644", + "type": "blob", + "sha": "dad5c2775b26a101b139dfb0f49ca408a0826720", + "size": 7888, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dad5c2775b26a101b139dfb0f49ca408a0826720" + }, + { + "path": "libs/FFmpeg/include/libavutil/pixdesc.h", + "mode": "100644", + "type": "blob", + "sha": "ba2f6328141b388374c223d1f4ab1a140197efc0", + "size": 16165, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ba2f6328141b388374c223d1f4ab1a140197efc0" + }, + { + "path": "libs/FFmpeg/include/libavutil/pixelutils.h", + "mode": "100644", + "type": "blob", + "sha": "7a997cde1c8afd3afbd6141a14f2066c396a4edc", + "size": 2051, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7a997cde1c8afd3afbd6141a14f2066c396a4edc" + }, + { + "path": "libs/FFmpeg/include/libavutil/pixfmt.h", + "mode": "100644", + "type": "blob", + "sha": "a26c72d56be52bec97377d6a6ebcc988b4937cca", + "size": 41556, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a26c72d56be52bec97377d6a6ebcc988b4937cca" + }, + { + "path": "libs/FFmpeg/include/libavutil/random_seed.h", + "mode": "100644", + "type": "blob", + "sha": "8a47be967968bb31cc7fe7e8b8e5340a292dd802", + "size": 1889, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8a47be967968bb31cc7fe7e8b8e5340a292dd802" + }, + { + "path": "libs/FFmpeg/include/libavutil/rational.h", + "mode": "100644", + "type": "blob", + "sha": "8cbfc8e0669836eeb8fffd5dc535482fef2d56b2", + "size": 6100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8cbfc8e0669836eeb8fffd5dc535482fef2d56b2" + }, + { + "path": "libs/FFmpeg/include/libavutil/rc4.h", + "mode": "100644", + "type": "blob", + "sha": "bf0ca6e94246609d5e236b31e4834f09c80e2241", + "size": 2003, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf0ca6e94246609d5e236b31e4834f09c80e2241" + }, + { + "path": "libs/FFmpeg/include/libavutil/replaygain.h", + "mode": "100644", + "type": "blob", + "sha": "b49bf1a3d968620618665d237e88b48aa90d7a4d", + "size": 1607, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b49bf1a3d968620618665d237e88b48aa90d7a4d" + }, + { + "path": "libs/FFmpeg/include/libavutil/ripemd.h", + "mode": "100644", + "type": "blob", + "sha": "9df9f905f3de63d696d5f846f8b5eeb7c170f098", + "size": 2158, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9df9f905f3de63d696d5f846f8b5eeb7c170f098" + }, + { + "path": "libs/FFmpeg/include/libavutil/samplefmt.h", + "mode": "100644", + "type": "blob", + "sha": "43a57a422cdbf639654be0bcb6c33f32ca77c2ee", + "size": 10301, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/43a57a422cdbf639654be0bcb6c33f32ca77c2ee" + }, + { + "path": "libs/FFmpeg/include/libavutil/sha.h", + "mode": "100644", + "type": "blob", + "sha": "2e1220abd1215d7e6f3a25c3444715e324bbd268", + "size": 2368, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2e1220abd1215d7e6f3a25c3444715e324bbd268" + }, + { + "path": "libs/FFmpeg/include/libavutil/sha512.h", + "mode": "100644", + "type": "blob", + "sha": "a4a3f23db30e2923834a73a4286bc04f8bd6b0b4", + "size": 2413, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a4a3f23db30e2923834a73a4286bc04f8bd6b0b4" + }, + { + "path": "libs/FFmpeg/include/libavutil/spherical.h", + "mode": "100644", + "type": "blob", + "sha": "828ac836da5fb972fa2d3ff9d4cddefafa4f8a53", + "size": 7997, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/828ac836da5fb972fa2d3ff9d4cddefafa4f8a53" + }, + { + "path": "libs/FFmpeg/include/libavutil/stereo3d.h", + "mode": "100644", + "type": "blob", + "sha": "3aab959b7993cff4bc233032e970bb9535df8437", + "size": 5224, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/3aab959b7993cff4bc233032e970bb9535df8437" + }, + { + "path": "libs/FFmpeg/include/libavutil/tea.h", + "mode": "100644", + "type": "blob", + "sha": "dd929bdafdc42b00102ac4db2c38ca5afd607f55", + "size": 2035, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dd929bdafdc42b00102ac4db2c38ca5afd607f55" + }, + { + "path": "libs/FFmpeg/include/libavutil/threadmessage.h", + "mode": "100644", + "type": "blob", + "sha": "42ce655f365ac4527b0b4bf223b82db902efdc41", + "size": 3910, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/42ce655f365ac4527b0b4bf223b82db902efdc41" + }, + { + "path": "libs/FFmpeg/include/libavutil/time.h", + "mode": "100644", + "type": "blob", + "sha": "dc169b064a0d7d4659809da42e0a6942449fba39", + "size": 1800, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/dc169b064a0d7d4659809da42e0a6942449fba39" + }, + { + "path": "libs/FFmpeg/include/libavutil/timecode.h", + "mode": "100644", + "type": "blob", + "sha": "060574a17203851aee45126f7ab1e0345e2f01fb", + "size": 7843, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/060574a17203851aee45126f7ab1e0345e2f01fb" + }, + { + "path": "libs/FFmpeg/include/libavutil/timestamp.h", + "mode": "100644", + "type": "blob", + "sha": "9ae64da8a1c0e0ccc14e7b4cc8e89ad2fb93e428", + "size": 2617, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9ae64da8a1c0e0ccc14e7b4cc8e89ad2fb93e428" + }, + { + "path": "libs/FFmpeg/include/libavutil/tree.h", + "mode": "100644", + "type": "blob", + "sha": "bbb8fbb1262ed532669bceb1cc371287f776155f", + "size": 5408, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bbb8fbb1262ed532669bceb1cc371287f776155f" + }, + { + "path": "libs/FFmpeg/include/libavutil/twofish.h", + "mode": "100644", + "type": "blob", + "sha": "67f359e88c2e06bea61736f48965b3b138720667", + "size": 2245, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/67f359e88c2e06bea61736f48965b3b138720667" + }, + { + "path": "libs/FFmpeg/include/libavutil/tx.h", + "mode": "100644", + "type": "blob", + "sha": "4696988caea40bdf230c35044201c1c3a10562d9", + "size": 7140, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4696988caea40bdf230c35044201c1c3a10562d9" + }, + { + "path": "libs/FFmpeg/include/libavutil/uuid.h", + "mode": "100644", + "type": "blob", + "sha": "748b7ed3c944b53254b0317e07f940082d34d676", + "size": 4895, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/748b7ed3c944b53254b0317e07f940082d34d676" + }, + { + "path": "libs/FFmpeg/include/libavutil/version.h", + "mode": "100644", + "type": "blob", + "sha": "589a42b0fa4a0f5fd99314e8ed164b403342f31a", + "size": 4832, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/589a42b0fa4a0f5fd99314e8ed164b403342f31a" + }, + { + "path": "libs/FFmpeg/include/libavutil/video_enc_params.h", + "mode": "100644", + "type": "blob", + "sha": "62265a5c0642d85433794a9f7e2b15e5d8f26c57", + "size": 5991, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/62265a5c0642d85433794a9f7e2b15e5d8f26c57" + }, + { + "path": "libs/FFmpeg/include/libavutil/video_hint.h", + "mode": "100644", + "type": "blob", + "sha": "1b2196093b6bae9f57e1c6b4d837d3a502907914", + "size": 3586, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1b2196093b6bae9f57e1c6b4d837d3a502907914" + }, + { + "path": "libs/FFmpeg/include/libavutil/xtea.h", + "mode": "100644", + "type": "blob", + "sha": "735427c109a15229f7750073b4591763d6ab60ca", + "size": 2834, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/735427c109a15229f7750073b4591763d6ab60ca" + }, + { + "path": "libs/FFmpeg/lib", + "mode": "040000", + "type": "tree", + "sha": "c59792895150bf7a6276431df8980b4e5261e9b6", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/c59792895150bf7a6276431df8980b4e5261e9b6" + }, + { + "path": "libs/FFmpeg/lib/iOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "cd87bdfbf307a135704aed761d87cc4ea06421f1", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/cd87bdfbf307a135704aed761d87cc4ea06421f1" + }, + { + "path": "libs/FFmpeg/lib/iOS-Sim/libavcodec.a", + "mode": "100644", + "type": "blob", + "sha": "e7ff329a7459582da8a8187b13ae2929de05681a", + "size": 5293840, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e7ff329a7459582da8a8187b13ae2929de05681a" + }, + { + "path": "libs/FFmpeg/lib/iOS-Sim/libavformat.a", + "mode": "100644", + "type": "blob", + "sha": "f02e2daf7b2fcc9688e954f8bbb3e61d886a2167", + "size": 3768576, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f02e2daf7b2fcc9688e954f8bbb3e61d886a2167" + }, + { + "path": "libs/FFmpeg/lib/iOS-Sim/libavutil.a", + "mode": "100644", + "type": "blob", + "sha": "55fc923a34ad46601a17ea831e2bb6f5841c3555", + "size": 5807984, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/55fc923a34ad46601a17ea831e2bb6f5841c3555" + }, + { + "path": "libs/FFmpeg/lib/iOS", + "mode": "040000", + "type": "tree", + "sha": "529a5cbd2cf7e97b62367dd704abf1e3a3db7d1f", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/529a5cbd2cf7e97b62367dd704abf1e3a3db7d1f" + }, + { + "path": "libs/FFmpeg/lib/iOS/libavcodec.a", + "mode": "100644", + "type": "blob", + "sha": "c400cf355fb35c01274d30411c2f6e098ce0b1c6", + "size": 2643784, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c400cf355fb35c01274d30411c2f6e098ce0b1c6" + }, + { + "path": "libs/FFmpeg/lib/iOS/libavformat.a", + "mode": "100644", + "type": "blob", + "sha": "985ed77ab09939fd6f56d98823ed8bc42e6ab00b", + "size": 1887504, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/985ed77ab09939fd6f56d98823ed8bc42e6ab00b" + }, + { + "path": "libs/FFmpeg/lib/iOS/libavutil.a", + "mode": "100644", + "type": "blob", + "sha": "381f688c5834ca325c75ff96f34c7d615a4dd5d3", + "size": 2907184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/381f688c5834ca325c75ff96f34c7d615a4dd5d3" + }, + { + "path": "libs/FFmpeg/lib/tvOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "44239723add5df7920fe4fe2f4c8c38e82163a1c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/44239723add5df7920fe4fe2f4c8c38e82163a1c" + }, + { + "path": "libs/FFmpeg/lib/tvOS-Sim/libavcodec.a", + "mode": "100644", + "type": "blob", + "sha": "675a38fea5847476935f7383d6f3b1125a0ca772", + "size": 5294640, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/675a38fea5847476935f7383d6f3b1125a0ca772" + }, + { + "path": "libs/FFmpeg/lib/tvOS-Sim/libavformat.a", + "mode": "100644", + "type": "blob", + "sha": "16f798c4e5488724c4f58eeb69caf49c915af26d", + "size": 3769136, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/16f798c4e5488724c4f58eeb69caf49c915af26d" + }, + { + "path": "libs/FFmpeg/lib/tvOS-Sim/libavutil.a", + "mode": "100644", + "type": "blob", + "sha": "35d7968f671bbf1409874ffb48f2761ed713f589", + "size": 5809472, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/35d7968f671bbf1409874ffb48f2761ed713f589" + }, + { + "path": "libs/FFmpeg/lib/tvOS", + "mode": "040000", + "type": "tree", + "sha": "7eb22c49c29e41998916babb162ffbc9bac0365b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7eb22c49c29e41998916babb162ffbc9bac0365b" + }, + { + "path": "libs/FFmpeg/lib/tvOS/libavcodec.a", + "mode": "100644", + "type": "blob", + "sha": "50272f8eefeb774da27fd25465e773455e2223cb", + "size": 2644240, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/50272f8eefeb774da27fd25465e773455e2223cb" + }, + { + "path": "libs/FFmpeg/lib/tvOS/libavformat.a", + "mode": "100644", + "type": "blob", + "sha": "e258421a4bac6e0511bd30971b899073cdc42e3d", + "size": 1887768, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e258421a4bac6e0511bd30971b899073cdc42e3d" + }, + { + "path": "libs/FFmpeg/lib/tvOS/libavutil.a", + "mode": "100644", + "type": "blob", + "sha": "6b4558dd97ad80923d04aa504e8d5a9d8e29e0ea", + "size": 2907904, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6b4558dd97ad80923d04aa504e8d5a9d8e29e0ea" + }, + { + "path": "libs/SDL2", + "mode": "040000", + "type": "tree", + "sha": "550cc6fe3cce75fef2b2b30897fa9c83ff6dd78e", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/550cc6fe3cce75fef2b2b30897fa9c83ff6dd78e" + }, + { + "path": "libs/SDL2/include", + "mode": "040000", + "type": "tree", + "sha": "1d4b50bec8f047ce8a392d2b8575eff5e9faf391", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/1d4b50bec8f047ce8a392d2b8575eff5e9faf391" + }, + { + "path": "libs/SDL2/include/SDL.h", + "mode": "100644", + "type": "blob", + "sha": "9ba8f68c6e7966906d5832985a0f4ebc400a8878", + "size": 8084, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9ba8f68c6e7966906d5832985a0f4ebc400a8878" + }, + { + "path": "libs/SDL2/include/SDL_assert.h", + "mode": "100644", + "type": "blob", + "sha": "7ce823ec5433f2d168889d7ac9239cd9f6ac6171", + "size": 12597, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7ce823ec5433f2d168889d7ac9239cd9f6ac6171" + }, + { + "path": "libs/SDL2/include/SDL_atomic.h", + "mode": "100644", + "type": "blob", + "sha": "1dd816a3826e307f8b7cb436ce95edd28cee7a5c", + "size": 14702, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1dd816a3826e307f8b7cb436ce95edd28cee7a5c" + }, + { + "path": "libs/SDL2/include/SDL_audio.h", + "mode": "100644", + "type": "blob", + "sha": "ccd35982df124d75a8007791bce88da405c76a75", + "size": 59722, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ccd35982df124d75a8007791bce88da405c76a75" + }, + { + "path": "libs/SDL2/include/SDL_bits.h", + "mode": "100644", + "type": "blob", + "sha": "81161ae5f30633f2d708e9b7806ba005bdd9c21a", + "size": 3205, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/81161ae5f30633f2d708e9b7806ba005bdd9c21a" + }, + { + "path": "libs/SDL2/include/SDL_blendmode.h", + "mode": "100644", + "type": "blob", + "sha": "4ecbe50785e9d37fcd57325a5301df6d25237997", + "size": 9018, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4ecbe50785e9d37fcd57325a5301df6d25237997" + }, + { + "path": "libs/SDL2/include/SDL_clipboard.h", + "mode": "100644", + "type": "blob", + "sha": "7c351fbb9c98aacbbf9136b3373b04ad321fe456", + "size": 4307, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7c351fbb9c98aacbbf9136b3373b04ad321fe456" + }, + { + "path": "libs/SDL2/include/SDL_config.h", + "mode": "100644", + "type": "blob", + "sha": "fd2fe887623dc3bf1daaf70a3783311d9d9a9e10", + "size": 1979, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/fd2fe887623dc3bf1daaf70a3783311d9d9a9e10" + }, + { + "path": "libs/SDL2/include/SDL_config_android.h", + "mode": "100644", + "type": "blob", + "sha": "d88c026be4329cb9a0a6259b8cf139db0d0bfa10", + "size": 4930, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d88c026be4329cb9a0a6259b8cf139db0d0bfa10" + }, + { + "path": "libs/SDL2/include/SDL_config_emscripten.h", + "mode": "100644", + "type": "blob", + "sha": "68660a14a7e829843c9e6dbad85156aed9179834", + "size": 5414, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/68660a14a7e829843c9e6dbad85156aed9179834" + }, + { + "path": "libs/SDL2/include/SDL_config_iphoneos.h", + "mode": "100644", + "type": "blob", + "sha": "02011c4c89cf879d8b14954e4cdd682016425d5a", + "size": 5743, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/02011c4c89cf879d8b14954e4cdd682016425d5a" + }, + { + "path": "libs/SDL2/include/SDL_config_macosx.h", + "mode": "100644", + "type": "blob", + "sha": "d7ad6cc712f7a5a2568dc6715b503a78be24406d", + "size": 7198, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d7ad6cc712f7a5a2568dc6715b503a78be24406d" + }, + { + "path": "libs/SDL2/include/SDL_config_minimal.h", + "mode": "100644", + "type": "blob", + "sha": "d6dee64d66b7b9d34223d92a812f59c748083d02", + "size": 2932, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d6dee64d66b7b9d34223d92a812f59c748083d02" + }, + { + "path": "libs/SDL2/include/SDL_config_ngage.h", + "mode": "100644", + "type": "blob", + "sha": "25453b3a244b8b33201c1fc985ac444f1c238697", + "size": 2857, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/25453b3a244b8b33201c1fc985ac444f1c238697" + }, + { + "path": "libs/SDL2/include/SDL_config_os2.h", + "mode": "100644", + "type": "blob", + "sha": "2effe1a880a7283cda7f5dcc4b7289ce31f8173c", + "size": 5125, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2effe1a880a7283cda7f5dcc4b7289ce31f8173c" + }, + { + "path": "libs/SDL2/include/SDL_config_pandora.h", + "mode": "100644", + "type": "blob", + "sha": "c74fa0c2fd990be590c9b7c3a2dd3e04998ea7a9", + "size": 3527, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c74fa0c2fd990be590c9b7c3a2dd3e04998ea7a9" + }, + { + "path": "libs/SDL2/include/SDL_config_windows.h", + "mode": "100644", + "type": "blob", + "sha": "01322c1829401fecea1b72889dfe4d313c5f0175", + "size": 8894, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/01322c1829401fecea1b72889dfe4d313c5f0175" + }, + { + "path": "libs/SDL2/include/SDL_config_wingdk.h", + "mode": "100644", + "type": "blob", + "sha": "f9d3ff46d3c141fb55ada151d8d26f69e77f3e70", + "size": 6636, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f9d3ff46d3c141fb55ada151d8d26f69e77f3e70" + }, + { + "path": "libs/SDL2/include/SDL_config_winrt.h", + "mode": "100644", + "type": "blob", + "sha": "8efde9099123697d513621ab932e7342ad7c231a", + "size": 5544, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8efde9099123697d513621ab932e7342ad7c231a" + }, + { + "path": "libs/SDL2/include/SDL_config_xbox.h", + "mode": "100644", + "type": "blob", + "sha": "8baf78ed7a56d4e111daebf00ec6fb31f3a03f35", + "size": 6416, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8baf78ed7a56d4e111daebf00ec6fb31f3a03f35" + }, + { + "path": "libs/SDL2/include/SDL_copying.h", + "mode": "100644", + "type": "blob", + "sha": "b6028bab2e3d2e33eec97ebe678f98343f155736", + "size": 939, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b6028bab2e3d2e33eec97ebe678f98343f155736" + }, + { + "path": "libs/SDL2/include/SDL_cpuinfo.h", + "mode": "100644", + "type": "blob", + "sha": "ed5e97915e314132f76df1747f76a5633dbd2b44", + "size": 17458, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed5e97915e314132f76df1747f76a5633dbd2b44" + }, + { + "path": "libs/SDL2/include/SDL_egl.h", + "mode": "100644", + "type": "blob", + "sha": "6f51c0831afb94f82f03f92fdec39c622b0b3858", + "size": 108871, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6f51c0831afb94f82f03f92fdec39c622b0b3858" + }, + { + "path": "libs/SDL2/include/SDL_endian.h", + "mode": "100644", + "type": "blob", + "sha": "71bc06729b6425ad9a4a96ca12e430409fb50514", + "size": 9865, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/71bc06729b6425ad9a4a96ca12e430409fb50514" + }, + { + "path": "libs/SDL2/include/SDL_error.h", + "mode": "100644", + "type": "blob", + "sha": "31c22616ccb0f276d3cab3caef4a769c5381b0ae", + "size": 5177, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/31c22616ccb0f276d3cab3caef4a769c5381b0ae" + }, + { + "path": "libs/SDL2/include/SDL_events.h", + "mode": "100644", + "type": "blob", + "sha": "9d097031805f33ff18e0a9bf381e22fb0f662dd0", + "size": 47284, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9d097031805f33ff18e0a9bf381e22fb0f662dd0" + }, + { + "path": "libs/SDL2/include/SDL_filesystem.h", + "mode": "100644", + "type": "blob", + "sha": "4cad657ec86e7b245a4a3046effd2ed783085932", + "size": 5533, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4cad657ec86e7b245a4a3046effd2ed783085932" + }, + { + "path": "libs/SDL2/include/SDL_gamecontroller.h", + "mode": "100644", + "type": "blob", + "sha": "140054d36ee625c57be7cc976087691b8746f7f4", + "size": 40161, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/140054d36ee625c57be7cc976087691b8746f7f4" + }, + { + "path": "libs/SDL2/include/SDL_gesture.h", + "mode": "100644", + "type": "blob", + "sha": "db70b4dd843d983dea8988a60b12f92a739faa0a", + "size": 3418, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/db70b4dd843d983dea8988a60b12f92a739faa0a" + }, + { + "path": "libs/SDL2/include/SDL_guid.h", + "mode": "100644", + "type": "blob", + "sha": "d964223c62ca79b46bdb6aa69ba9ed4e256d1f9b", + "size": 3146, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d964223c62ca79b46bdb6aa69ba9ed4e256d1f9b" + }, + { + "path": "libs/SDL2/include/SDL_haptic.h", + "mode": "100644", + "type": "blob", + "sha": "2462a1e47b3731a20f68af4a2d0d9cdfa5c76e59", + "size": 43268, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2462a1e47b3731a20f68af4a2d0d9cdfa5c76e59" + }, + { + "path": "libs/SDL2/include/SDL_hidapi.h", + "mode": "100644", + "type": "blob", + "sha": "0575100357798a4b34365b5f37d0ef57d1cf831c", + "size": 17842, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0575100357798a4b34365b5f37d0ef57d1cf831c" + }, + { + "path": "libs/SDL2/include/SDL_hints.h", + "mode": "100644", + "type": "blob", + "sha": "00beef51e29ed9e610182c7db3d88da70a98230f", + "size": 112701, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/00beef51e29ed9e610182c7db3d88da70a98230f" + }, + { + "path": "libs/SDL2/include/SDL_joystick.h", + "mode": "100644", + "type": "blob", + "sha": "b9b4f622800d7a59285523c1407578ee130c0e32", + "size": 39114, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b9b4f622800d7a59285523c1407578ee130c0e32" + }, + { + "path": "libs/SDL2/include/SDL_keyboard.h", + "mode": "100644", + "type": "blob", + "sha": "86a37ad1a241688e3ee3e658a824e5a78cba2918", + "size": 11044, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/86a37ad1a241688e3ee3e658a824e5a78cba2918" + }, + { + "path": "libs/SDL2/include/SDL_keycode.h", + "mode": "100644", + "type": "blob", + "sha": "7106223027e75886652f3a2efd179d82561e350c", + "size": 15618, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7106223027e75886652f3a2efd179d82561e350c" + }, + { + "path": "libs/SDL2/include/SDL_loadso.h", + "mode": "100644", + "type": "blob", + "sha": "ca59b681cb45d9684223aaa6ab7287e809ced5f2", + "size": 3908, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ca59b681cb45d9684223aaa6ab7287e809ced5f2" + }, + { + "path": "libs/SDL2/include/SDL_locale.h", + "mode": "100644", + "type": "blob", + "sha": "482dbefe765fce9fe2e4248cc5e57e56e71b39b1", + "size": 3812, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/482dbefe765fce9fe2e4248cc5e57e56e71b39b1" + }, + { + "path": "libs/SDL2/include/SDL_log.h", + "mode": "100644", + "type": "blob", + "sha": "da733c4023d9c9f8ed62668e22ddb00c9f5c1fd4", + "size": 11684, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/da733c4023d9c9f8ed62668e22ddb00c9f5c1fd4" + }, + { + "path": "libs/SDL2/include/SDL_main.h", + "mode": "100644", + "type": "blob", + "sha": "5cc8e5913a4e705548739f0718d4878392c8a90e", + "size": 8997, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5cc8e5913a4e705548739f0718d4878392c8a90e" + }, + { + "path": "libs/SDL2/include/SDL_messagebox.h", + "mode": "100644", + "type": "blob", + "sha": "7896fd1291f9211584447abcb4ab3edf320bc389", + "size": 6693, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7896fd1291f9211584447abcb4ab3edf320bc389" + }, + { + "path": "libs/SDL2/include/SDL_metal.h", + "mode": "100644", + "type": "blob", + "sha": "f36e34878cef20b686f7800fe112a5bd99f6a3b3", + "size": 3380, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f36e34878cef20b686f7800fe112a5bd99f6a3b3" + }, + { + "path": "libs/SDL2/include/SDL_misc.h", + "mode": "100644", + "type": "blob", + "sha": "13ed9c771835f15abdd16c53b5cf39d999159c65", + "size": 2845, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/13ed9c771835f15abdd16c53b5cf39d999159c65" + }, + { + "path": "libs/SDL2/include/SDL_mouse.h", + "mode": "100644", + "type": "blob", + "sha": "aa07575738a5640c65e5f5dbc4a55661fe0a093e", + "size": 16988, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/aa07575738a5640c65e5f5dbc4a55661fe0a093e" + }, + { + "path": "libs/SDL2/include/SDL_mutex.h", + "mode": "100644", + "type": "blob", + "sha": "e679d380890ea02d7a05021152aa183646fa178c", + "size": 16739, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e679d380890ea02d7a05021152aa183646fa178c" + }, + { + "path": "libs/SDL2/include/SDL_name.h", + "mode": "100644", + "type": "blob", + "sha": "5c3e07ab7d3e4a04fa436767527aa3e570a25d25", + "size": 1155, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5c3e07ab7d3e4a04fa436767527aa3e570a25d25" + }, + { + "path": "libs/SDL2/include/SDL_opengl.h", + "mode": "100644", + "type": "blob", + "sha": "0ba89127ace681fa97744e94bad4728c59be9b53", + "size": 81091, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0ba89127ace681fa97744e94bad4728c59be9b53" + }, + { + "path": "libs/SDL2/include/SDL_opengl_glext.h", + "mode": "100644", + "type": "blob", + "sha": "ff6ad12cef0436aa89bec4a6c7cc169071dc5575", + "size": 864070, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ff6ad12cef0436aa89bec4a6c7cc169071dc5575" + }, + { + "path": "libs/SDL2/include/SDL_opengles.h", + "mode": "100644", + "type": "blob", + "sha": "f4465eaa9da8ba3009fa4f3ee51eeecd0689283b", + "size": 1254, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f4465eaa9da8ba3009fa4f3ee51eeecd0689283b" + }, + { + "path": "libs/SDL2/include/SDL_opengles2.h", + "mode": "100644", + "type": "blob", + "sha": "5e3b717def6cafa080adb200245e9528f0bf7cbc", + "size": 1606, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5e3b717def6cafa080adb200245e9528f0bf7cbc" + }, + { + "path": "libs/SDL2/include/SDL_opengles2_gl2.h", + "mode": "100644", + "type": "blob", + "sha": "d13622aae912aa244792cf26e8d05e4bd38e00fe", + "size": 42938, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d13622aae912aa244792cf26e8d05e4bd38e00fe" + }, + { + "path": "libs/SDL2/include/SDL_opengles2_gl2ext.h", + "mode": "100644", + "type": "blob", + "sha": "9448ce09fc705784b8da023633daeaf99ef2fa1b", + "size": 241221, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9448ce09fc705784b8da023633daeaf99ef2fa1b" + }, + { + "path": "libs/SDL2/include/SDL_opengles2_gl2platform.h", + "mode": "100644", + "type": "blob", + "sha": "426796ef2a7eaf278d3f8580490c23c9640b69c8", + "size": 646, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/426796ef2a7eaf278d3f8580490c23c9640b69c8" + }, + { + "path": "libs/SDL2/include/SDL_opengles2_khrplatform.h", + "mode": "100644", + "type": "blob", + "sha": "01646449caedc958effc3b450360aefd260671ab", + "size": 11131, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/01646449caedc958effc3b450360aefd260671ab" + }, + { + "path": "libs/SDL2/include/SDL_pixels.h", + "mode": "100644", + "type": "blob", + "sha": "9abd57b42014a89b2761608bea2ae802ef9e8515", + "size": 24522, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9abd57b42014a89b2761608bea2ae802ef9e8515" + }, + { + "path": "libs/SDL2/include/SDL_platform.h", + "mode": "100644", + "type": "blob", + "sha": "d2a7e052d7b19051d020bb240856fbe6080e1af8", + "size": 6744, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d2a7e052d7b19051d020bb240856fbe6080e1af8" + }, + { + "path": "libs/SDL2/include/SDL_power.h", + "mode": "100644", + "type": "blob", + "sha": "1d75704c421c42b244f68b93edda5694f73d5c31", + "size": 3226, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1d75704c421c42b244f68b93edda5694f73d5c31" + }, + { + "path": "libs/SDL2/include/SDL_quit.h", + "mode": "100644", + "type": "blob", + "sha": "d8ceb894369194b5a0da17b8b4117ebf2edf0a88", + "size": 2106, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d8ceb894369194b5a0da17b8b4117ebf2edf0a88" + }, + { + "path": "libs/SDL2/include/SDL_rect.h", + "mode": "100644", + "type": "blob", + "sha": "9611a311ce83bc165a1ea968a51d4f968f9557d3", + "size": 12860, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9611a311ce83bc165a1ea968a51d4f968f9557d3" + }, + { + "path": "libs/SDL2/include/SDL_render.h", + "mode": "100644", + "type": "blob", + "sha": "2d3f07366209ba01531b878102b28599b256725f", + "size": 74035, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/2d3f07366209ba01531b878102b28599b256725f" + }, + { + "path": "libs/SDL2/include/SDL_revision.h", + "mode": "100644", + "type": "blob", + "sha": "36691f5531375cdfaf78fe8b8fee3721e39bb2c7", + "size": 127, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/36691f5531375cdfaf78fe8b8fee3721e39bb2c7" + }, + { + "path": "libs/SDL2/include/SDL_rwops.h", + "mode": "100644", + "type": "blob", + "sha": "8615cb542959def634d4a634cd24f24d3a5104a6", + "size": 28101, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/8615cb542959def634d4a634cd24f24d3a5104a6" + }, + { + "path": "libs/SDL2/include/SDL_scancode.h", + "mode": "100644", + "type": "blob", + "sha": "a960a7991c61accff7874c9c75d92099b350b858", + "size": 16929, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a960a7991c61accff7874c9c75d92099b350b858" + }, + { + "path": "libs/SDL2/include/SDL_sensor.h", + "mode": "100644", + "type": "blob", + "sha": "9ecce44b17be8469a1572afe95b2ff8a323045bf", + "size": 10294, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9ecce44b17be8469a1572afe95b2ff8a323045bf" + }, + { + "path": "libs/SDL2/include/SDL_shape.h", + "mode": "100644", + "type": "blob", + "sha": "f66babc011339d5729fee081235f8f57815275c2", + "size": 5904, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f66babc011339d5729fee081235f8f57815275c2" + }, + { + "path": "libs/SDL2/include/SDL_stdinc.h", + "mode": "100644", + "type": "blob", + "sha": "182ed86ee371194ec6f45229626fa395472d0f8d", + "size": 29796, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/182ed86ee371194ec6f45229626fa395472d0f8d" + }, + { + "path": "libs/SDL2/include/SDL_surface.h", + "mode": "100644", + "type": "blob", + "sha": "d6ee615c59f0a48bc284fde0b75b0dbb3ee9bee2", + "size": 36798, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/d6ee615c59f0a48bc284fde0b75b0dbb3ee9bee2" + }, + { + "path": "libs/SDL2/include/SDL_system.h", + "mode": "100644", + "type": "blob", + "sha": "4b7eaddcc0ed9b2033de7ccf7cc00de8a5f58a9d", + "size": 20772, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4b7eaddcc0ed9b2033de7ccf7cc00de8a5f58a9d" + }, + { + "path": "libs/SDL2/include/SDL_syswm.h", + "mode": "100644", + "type": "blob", + "sha": "b35734deb334508c6fbfcc0b635417a9d2841052", + "size": 11506, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b35734deb334508c6fbfcc0b635417a9d2841052" + }, + { + "path": "libs/SDL2/include/SDL_test.h", + "mode": "100644", + "type": "blob", + "sha": "80daaafbd9b5dc1e4dfa8f48f5fa97e19caab062", + "size": 2000, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/80daaafbd9b5dc1e4dfa8f48f5fa97e19caab062" + }, + { + "path": "libs/SDL2/include/SDL_test_assert.h", + "mode": "100644", + "type": "blob", + "sha": "341e490facee39061766d2fa4b85c154870611dd", + "size": 3235, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/341e490facee39061766d2fa4b85c154870611dd" + }, + { + "path": "libs/SDL2/include/SDL_test_common.h", + "mode": "100644", + "type": "blob", + "sha": "6de63cad6f8b08a5f4f28b9b2e5de0dc65da6b71", + "size": 6872, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/6de63cad6f8b08a5f4f28b9b2e5de0dc65da6b71" + }, + { + "path": "libs/SDL2/include/SDL_test_compare.h", + "mode": "100644", + "type": "blob", + "sha": "5fce25ca1856cef2790a13d1895dbdd95cb8a4ad", + "size": 2163, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5fce25ca1856cef2790a13d1895dbdd95cb8a4ad" + }, + { + "path": "libs/SDL2/include/SDL_test_crc32.h", + "mode": "100644", + "type": "blob", + "sha": "bf34782103a218ef811e65a356ab6f900201aa54", + "size": 3385, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bf34782103a218ef811e65a356ab6f900201aa54" + }, + { + "path": "libs/SDL2/include/SDL_test_font.h", + "mode": "100644", + "type": "blob", + "sha": "18a82ffc80f16a989cf37da79ed06a3e5279ff37", + "size": 5432, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/18a82ffc80f16a989cf37da79ed06a3e5279ff37" + }, + { + "path": "libs/SDL2/include/SDL_test_fuzzer.h", + "mode": "100644", + "type": "blob", + "sha": "cfe6a14f2a0288bd57cd00d642b4dd9c609a8c21", + "size": 13203, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/cfe6a14f2a0288bd57cd00d642b4dd9c609a8c21" + }, + { + "path": "libs/SDL2/include/SDL_test_harness.h", + "mode": "100644", + "type": "blob", + "sha": "26231dcd6bce9e72d54ddbef532a278762634948", + "size": 4634, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/26231dcd6bce9e72d54ddbef532a278762634948" + }, + { + "path": "libs/SDL2/include/SDL_test_images.h", + "mode": "100644", + "type": "blob", + "sha": "1211371755fdfd7bed0953fe1322fdcb639637a3", + "size": 2215, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1211371755fdfd7bed0953fe1322fdcb639637a3" + }, + { + "path": "libs/SDL2/include/SDL_test_log.h", + "mode": "100644", + "type": "blob", + "sha": "a27ffc209a95ca3dd105b08dbe8ca4509245fe4c", + "size": 1954, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/a27ffc209a95ca3dd105b08dbe8ca4509245fe4c" + }, + { + "path": "libs/SDL2/include/SDL_test_md5.h", + "mode": "100644", + "type": "blob", + "sha": "538c7ae3e09caa78990f738337bfbf2db9a86459", + "size": 4630, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/538c7ae3e09caa78990f738337bfbf2db9a86459" + }, + { + "path": "libs/SDL2/include/SDL_test_memory.h", + "mode": "100644", + "type": "blob", + "sha": "f959177d2336b5cf649d4d12a41cf76bf7a52578", + "size": 1787, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f959177d2336b5cf649d4d12a41cf76bf7a52578" + }, + { + "path": "libs/SDL2/include/SDL_test_random.h", + "mode": "100644", + "type": "blob", + "sha": "0035a8030ad2cc4751a87d5aea3c032cd3c4944f", + "size": 3156, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0035a8030ad2cc4751a87d5aea3c032cd3c4944f" + }, + { + "path": "libs/SDL2/include/SDL_thread.h", + "mode": "100644", + "type": "blob", + "sha": "b829bbad5dc08bc47f02c64efc24ac97556ac603", + "size": 17323, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b829bbad5dc08bc47f02c64efc24ac97556ac603" + }, + { + "path": "libs/SDL2/include/SDL_timer.h", + "mode": "100644", + "type": "blob", + "sha": "98f9ad16c647e8ecca4829b0629ae15e767f895e", + "size": 7290, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/98f9ad16c647e8ecca4829b0629ae15e767f895e" + }, + { + "path": "libs/SDL2/include/SDL_touch.h", + "mode": "100644", + "type": "blob", + "sha": "c12d4a1c8174997225ba25fe087bfb794e094f48", + "size": 4506, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c12d4a1c8174997225ba25fe087bfb794e094f48" + }, + { + "path": "libs/SDL2/include/SDL_types.h", + "mode": "100644", + "type": "blob", + "sha": "b5d7192ff2e95a994229a90e668ab003e16e5cab", + "size": 1031, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b5d7192ff2e95a994229a90e668ab003e16e5cab" + }, + { + "path": "libs/SDL2/include/SDL_version.h", + "mode": "100644", + "type": "blob", + "sha": "7585eece563127330f3e236174f55615d9f03ddf", + "size": 6870, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7585eece563127330f3e236174f55615d9f03ddf" + }, + { + "path": "libs/SDL2/include/SDL_video.h", + "mode": "100644", + "type": "blob", + "sha": "c8b2d7a0d871e1f84cf4bf52f3583f8f5aaaf727", + "size": 80803, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/c8b2d7a0d871e1f84cf4bf52f3583f8f5aaaf727" + }, + { + "path": "libs/SDL2/include/SDL_vulkan.h", + "mode": "100644", + "type": "blob", + "sha": "ab86a0b8656a1a183b40d194b9f5bf41260f586f", + "size": 8540, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ab86a0b8656a1a183b40d194b9f5bf41260f586f" + }, + { + "path": "libs/SDL2/include/begin_code.h", + "mode": "100644", + "type": "blob", + "sha": "4142ffeba928866354f51bedf3d1b1a9b8a4c3d9", + "size": 5533, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4142ffeba928866354f51bedf3d1b1a9b8a4c3d9" + }, + { + "path": "libs/SDL2/include/close_code.h", + "mode": "100644", + "type": "blob", + "sha": "b5ff3e2049b666eeeb923d234b7179722fd8d6c3", + "size": 1486, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/b5ff3e2049b666eeeb923d234b7179722fd8d6c3" + }, + { + "path": "libs/SDL2/lib", + "mode": "040000", + "type": "tree", + "sha": "dca50f0eaf294a51b56e02ae9fd7d8088ed0b49c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dca50f0eaf294a51b56e02ae9fd7d8088ed0b49c" + }, + { + "path": "libs/SDL2/lib/iOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "dc316eaadf79a6078878b4ff09593cc00de98bbd", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dc316eaadf79a6078878b4ff09593cc00de98bbd" + }, + { + "path": "libs/SDL2/lib/iOS-Sim/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "934786ba9543d1b950e33fdbf4ad2c889eac675e", + "size": 4104832, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/934786ba9543d1b950e33fdbf4ad2c889eac675e" + }, + { + "path": "libs/SDL2/lib/iOS", + "mode": "040000", + "type": "tree", + "sha": "4dbdfe44b5d888ab166252b1196a7ac86b39260a", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/4dbdfe44b5d888ab166252b1196a7ac86b39260a" + }, + { + "path": "libs/SDL2/lib/iOS/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "4238c74bcf123091d47de9ac91f8f364d8b59642", + "size": 2317184, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/4238c74bcf123091d47de9ac91f8f364d8b59642" + }, + { + "path": "libs/SDL2/lib/tvOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "e8989a13cf7863ca66cef2ead08944d5782e6b1d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e8989a13cf7863ca66cef2ead08944d5782e6b1d" + }, + { + "path": "libs/SDL2/lib/tvOS-Sim/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "1f59667f504fd3da3fa1f6b179d427e6786c3a50", + "size": 4039240, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/1f59667f504fd3da3fa1f6b179d427e6786c3a50" + }, + { + "path": "libs/SDL2/lib/tvOS", + "mode": "040000", + "type": "tree", + "sha": "7228e344708b6085b8d5923c68db0dbe01fcbea3", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/7228e344708b6085b8d5923c68db0dbe01fcbea3" + }, + { + "path": "libs/SDL2/lib/tvOS/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "112073d5065e30ff6c4948dd00d1d392756fb877", + "size": 1879288, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/112073d5065e30ff6c4948dd00d1d392756fb877" + }, + { + "path": "libs/SDL2/lib/visionOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "dc316eaadf79a6078878b4ff09593cc00de98bbd", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/dc316eaadf79a6078878b4ff09593cc00de98bbd" + }, + { + "path": "libs/SDL2/lib/visionOS-Sim/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "934786ba9543d1b950e33fdbf4ad2c889eac675e", + "size": 4104832, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/934786ba9543d1b950e33fdbf4ad2c889eac675e" + }, + { + "path": "libs/SDL2/lib/visionOS", + "mode": "040000", + "type": "tree", + "sha": "e4ee957147d7c5b23249df8d8099e52c726f9982", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e4ee957147d7c5b23249df8d8099e52c726f9982" + }, + { + "path": "libs/SDL2/lib/visionOS/libSDL2.a", + "mode": "100644", + "type": "blob", + "sha": "9000e0404113f103c6833defdad9705df64557cf", + "size": 1913072, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9000e0404113f103c6833defdad9705df64557cf" + }, + { + "path": "libs/opus", + "mode": "040000", + "type": "tree", + "sha": "87bcf866d7df8822ddce2342960c217db67b3650", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/87bcf866d7df8822ddce2342960c217db67b3650" + }, + { + "path": "libs/opus/include", + "mode": "040000", + "type": "tree", + "sha": "3db35c2d6e16b8531cb081d752ec9b8095d3828d", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/3db35c2d6e16b8531cb081d752ec9b8095d3828d" + }, + { + "path": "libs/opus/include/opus", + "mode": "040000", + "type": "tree", + "sha": "85c091288a5919def5ebc413183ea0e850fea6da", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/85c091288a5919def5ebc413183ea0e850fea6da" + }, + { + "path": "libs/opus/include/opus/opus.h", + "mode": "100644", + "type": "blob", + "sha": "0c69c627d92fcccad62f8babc6dddf07352bb497", + "size": 48453, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0c69c627d92fcccad62f8babc6dddf07352bb497" + }, + { + "path": "libs/opus/include/opus/opus_defines.h", + "mode": "100644", + "type": "blob", + "sha": "94b9e0d9fcb1d5d3a04a4326631dde153eede92b", + "size": 35369, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/94b9e0d9fcb1d5d3a04a4326631dde153eede92b" + }, + { + "path": "libs/opus/include/opus/opus_multistream.h", + "mode": "100644", + "type": "blob", + "sha": "babcee6905bf9f70d922eb903d28a9151f053505", + "size": 33539, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/babcee6905bf9f70d922eb903d28a9151f053505" + }, + { + "path": "libs/opus/include/opus/opus_projection.h", + "mode": "100644", + "type": "blob", + "sha": "9dabf4e85cf0be698f3215325bec40c5643b5241", + "size": 28240, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/9dabf4e85cf0be698f3215325bec40c5643b5241" + }, + { + "path": "libs/opus/include/opus/opus_types.h", + "mode": "100644", + "type": "blob", + "sha": "7cf675580ffb0ad9ba7b040a5c03eb2828910486", + "size": 5157, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/7cf675580ffb0ad9ba7b040a5c03eb2828910486" + }, + { + "path": "libs/opus/lib", + "mode": "040000", + "type": "tree", + "sha": "a4037ef72b61a3b163a0f6162adef0267b31f016", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/a4037ef72b61a3b163a0f6162adef0267b31f016" + }, + { + "path": "libs/opus/lib/iOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "5f44434495e16e61964aaaea6c8a0a88eaf0835b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5f44434495e16e61964aaaea6c8a0a88eaf0835b" + }, + { + "path": "libs/opus/lib/iOS-Sim/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "0e16025b82ae564cb5a3ef47d303a275e5aa2ca3", + "size": 4405656, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0e16025b82ae564cb5a3ef47d303a275e5aa2ca3" + }, + { + "path": "libs/opus/lib/iOS", + "mode": "040000", + "type": "tree", + "sha": "588be05dbc732631aa29c7ba06c5f40a95244f08", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/588be05dbc732631aa29c7ba06c5f40a95244f08" + }, + { + "path": "libs/opus/lib/iOS/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "e67caa069d12907c804dfd9af4ff31f0c4f50dc3", + "size": 2086256, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e67caa069d12907c804dfd9af4ff31f0c4f50dc3" + }, + { + "path": "libs/opus/lib/tvOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "e6e3c1d148f76d7da66069709730ca35c4e148f0", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e6e3c1d148f76d7da66069709730ca35c4e148f0" + }, + { + "path": "libs/opus/lib/tvOS-Sim/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "ed292d61136c8926448f7a38f1d9a217fe410701", + "size": 4407312, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/ed292d61136c8926448f7a38f1d9a217fe410701" + }, + { + "path": "libs/opus/lib/tvOS", + "mode": "040000", + "type": "tree", + "sha": "e54aa7a8fa75bdefabea6fd4748bf9b56a23ac2c", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/e54aa7a8fa75bdefabea6fd4748bf9b56a23ac2c" + }, + { + "path": "libs/opus/lib/tvOS/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "5903140740321a83dac5f9fc78cfdc07f5a4d020", + "size": 2087144, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/5903140740321a83dac5f9fc78cfdc07f5a4d020" + }, + { + "path": "libs/opus/lib/visionOS-Sim", + "mode": "040000", + "type": "tree", + "sha": "5f44434495e16e61964aaaea6c8a0a88eaf0835b", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/5f44434495e16e61964aaaea6c8a0a88eaf0835b" + }, + { + "path": "libs/opus/lib/visionOS-Sim/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "0e16025b82ae564cb5a3ef47d303a275e5aa2ca3", + "size": 4405656, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/0e16025b82ae564cb5a3ef47d303a275e5aa2ca3" + }, + { + "path": "libs/opus/lib/visionOS", + "mode": "040000", + "type": "tree", + "sha": "588be05dbc732631aa29c7ba06c5f40a95244f08", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/588be05dbc732631aa29c7ba06c5f40a95244f08" + }, + { + "path": "libs/opus/lib/visionOS/libopus.a", + "mode": "100644", + "type": "blob", + "sha": "e67caa069d12907c804dfd9af4ff31f0c4f50dc3", + "size": 2086256, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/e67caa069d12907c804dfd9af4ff31f0c4f50dc3" + }, + { + "path": "moonlight-common", + "mode": "040000", + "type": "tree", + "sha": "2f36481e4a0d2a2f09a605392799abaa619c92ad", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/2f36481e4a0d2a2f09a605392799abaa619c92ad" + }, + { + "path": "moonlight-common/moonlight-common-c", + "mode": "160000", + "type": "commit", + "sha": "a517f7cbcaf37ae0003979382d4e6348f37b8b2d" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj", + "mode": "040000", + "type": "tree", + "sha": "680d2ff79c5bbb6293255c93d2bdf63dd5cdb571", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/680d2ff79c5bbb6293255c93d2bdf63dd5cdb571" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj/project.pbxproj", + "mode": "100644", + "type": "blob", + "sha": "db5caa0d3139d50e34a83b202c32d60ba81f9ab0", + "size": 43100, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/db5caa0d3139d50e34a83b202c32d60ba81f9ab0" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj/project.xcworkspace", + "mode": "040000", + "type": "tree", + "sha": "fa7e110f18c18dc1b4be9549bbd1cf4e7a376bd2", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/fa7e110f18c18dc1b4be9549bbd1cf4e7a376bd2" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj/project.xcworkspace/xcshareddata", + "mode": "040000", + "type": "tree", + "sha": "3652a519a33062f2db9c4ab8fed1c92f30e1e7a1", + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/trees/3652a519a33062f2db9c4ab8fed1c92f30e1e7a1" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj/project.xcworkspace/xcshareddata/limelight-common.xccheckout", + "mode": "100644", + "type": "blob", + "sha": "f13cb96d53afda714e06e0128d5016814ab39df0", + "size": 1543, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/f13cb96d53afda714e06e0128d5016814ab39df0" + }, + { + "path": "moonlight-common/moonlight-common.xcodeproj/project.xcworkspace/xcshareddata/moonlight-common.xcscmblueprint", + "mode": "100644", + "type": "blob", + "sha": "bed931f0b67c4fe96f3141d2cac06831afc2fac3", + "size": 2246, + "url": "https://api.github.com/repos/RikuKunMS2/moonlight-ios-vision/git/blobs/bed931f0b67c4fe96f3141d2cac06831afc2fac3" + } + ], + "truncated": false +}