//#region ../../packages/@play-xbox/url-paths/dist/getSafeInternalRedirectUri.js
/**
* Protocols that are explicitly blocked to prevent script injection or
* data-exfiltration attacks via redirect URIs.
*/
var DANGEROUS_PROTOCOLS = [
	"javascript:",
	"data:",
	"vbscript:",
	"blob:"
];
/**
* Validates that a URI is a safe internal path suitable for in-app navigation
* and returns it, or returns the fallback when the URI is unsafe.
*
* @remarks
* Rejects protocol-relative URLs (`//`), URIs that do not start with `/`,
* and any URI whose lowercase form contains a dangerous protocol
* (`javascript:`, `data:`, `vbscript:`, `blob:`).
*
* @param uri - The URI to validate (may be `undefined`).
* @param fallback - The value to return when the URI is missing or unsafe.
* @returns The original URI if it is a safe internal path; otherwise `fallback`.
*/
function getSafeInternalRedirectUri(uri, fallback) {
	if (!uri) return fallback;
	if (!uri.startsWith("/") || uri.startsWith("//")) return fallback;
	const lower = uri.toLowerCase();
	if (DANGEROUS_PROTOCOLS.some((protocol) => lower.includes(protocol))) return fallback;
	return uri;
}
//#endregion
//#region \0virtual:asset-manifest
var assets = [
	{
		"path": "offlinemanifest.json",
		"integrity": "sha256-ooGa4wPtQHCLrvtWpSrO/8fco/WRRPaZwBIYBUXh9xk="
	},
	{
		"path": "robots.txt",
		"integrity": "sha256-Lk5/1oJw+s2zfEC8q9m8fydUXeXsMoWrJYmZmwRzFYM="
	},
	{
		"path": "sitemap.xml",
		"integrity": "sha256-pQ8G9VSIArFGqUlVJ9ry/redsqv+FdbtVHPZW2YSvuQ="
	},
	{
		"path": "sitemap/catalog-sitemap.xml",
		"integrity": "sha256-VieZhLSHT2Jwc4LroylULdIIVZNAXBwbwF3sb3EMqU0="
	},
	{
		"path": "sitemap/gallery-sitemap.xml",
		"integrity": "sha256-LTNODp2SGgWdh/2e3bBgbQ0aYGF2kbcY39h01jwUukI="
	},
	{
		"path": "sitemap/static-sitemap.xml",
		"integrity": "sha256-dhpmklt8fHa4Q9qY8YTlJWt/85w4C3MWrw0oHT6T/E0="
	},
	{
		"path": "assets/AcceleratorCanvas-11vakef6.js",
		"integrity": "sha256-Y3Y76c9pmAZrCSOIt06MUKWRrEWnaxUVvSlqbv4arLE="
	},
	{
		"path": "assets/AccessibilityTab-jx5jng82.js",
		"integrity": "sha256-9M0Alwtqtgr3SdCri3MUSVQAhRfPLHU9ynVPDrIMtSk="
	},
	{
		"path": "assets/AccountTab-kwzg8qah.js",
		"integrity": "sha256-CDlTqvo3DFHufJm4yqm76l4D8ua5rVtN6B0uiDhlRDY="
	},
	{
		"path": "assets/AchievementFrame-f2fthccq.js",
		"integrity": "sha256-WODmRc5y6/c3vcn3eQU2UT+isqv9GUOvVPMnAZ5W9z4="
	},
	{
		"path": "assets/AchievementRareFrame-oocrqf5f.js",
		"integrity": "sha256-j92VuHfiboaE7wcXTtpwF4+OLbKQTqNTjkqliMWysrs="
	},
	{
		"path": "assets/AchievementsDetailPage-jyvoar8x.js",
		"integrity": "sha256-fNp6Y2ejQ33N7R4O2Ds2Xd2Iux4gIBqemXJ9Bi8+IL4="
	},
	{
		"path": "assets/AchievementsHeroDetailsLoading-jwv2rm1t.js",
		"integrity": "sha256-A0BSmmfe7hNvigILfDN4p1W17GMzoBDMBxTsM4yJOHY="
	},
	{
		"path": "assets/AchievementsPage-f7mh0hb9.js",
		"integrity": "sha256-hdlBrQgdlmgafd02ycPbgsLLAssTDjvPREuMDmvoC3Y="
	},
	{
		"path": "assets/ActionMetadataError-g7b5a4xs.js",
		"integrity": "sha256-6YtIWM9HZelYoEdcHfql4txJ/wWomduruvV5OQIzSwY="
	},
	{
		"path": "assets/ActivePartyPage-betjhk8d.js",
		"integrity": "sha256-TYayMgV6UU2hVV29Zvt6Vt6NXn5UfLwLcmkmEW9mwCs="
	},
	{
		"path": "assets/AddFriendRequest-dcdbm3ti.js",
		"integrity": "sha256-K2UvX3qZeP1CcdO+T5Yvxq02Lqb8pJwj4mY/3kTeezA="
	},
	{
		"path": "assets/Announcer-ns276d3u.js",
		"integrity": "sha256-N+UbyVHghn1gcucGSDivE0aKv/iK6VLIHs4ZuGTkNBA="
	},
	{
		"path": "assets/AppInsightsTelemetryAdapter-kv5agijr.js",
		"integrity": "sha256-SPtFU7XFq8lnkbaEiSVSryUwGzdouu2DEiInHibSgrM="
	},
	{
		"path": "assets/AppQuitDialog-j6shiu8x.js",
		"integrity": "sha256-O7K2IMI+kqOyYemBrEFh8YzJK/XCMYzB0Y9jXxxLEWw="
	},
	{
		"path": "assets/AppQuitPlayDialog-bysnzb6o.js",
		"integrity": "sha256-+/H0OqGY0VPlRwgxMbz9rIW+D36bOzy/SFX5kEDkMQ0="
	},
	{
		"path": "assets/AppearanceTab-btm1lnhr.js",
		"integrity": "sha256-puO+2mlHdhiGDaAgPpHEkKq+7zvsSxXPb+ofyT0U9Cw="
	},
	{
		"path": "assets/Apps_BattleNet-ndj7o7ry.png",
		"integrity": "sha256-Bd8veesfcqSZ9pjOhk+/RyMi8MDEfOWLFMQ7Jyct29I="
	},
	{
		"path": "assets/Apps_EA-mez26q80.png",
		"integrity": "sha256-e6FTG8Q7I616SDYOn65XgiV1Dz5SDxetqIWIkSEz1Xs="
	},
	{
		"path": "assets/Apps_Epic-oahfkb1h.png",
		"integrity": "sha256-3lnTpDWI/qMu7mtPFMuaT+2vZF91Ky9diJb4XRgWAIQ="
	},
	{
		"path": "assets/Apps_GOG-gshw2che.png",
		"integrity": "sha256-N7ss5nYrknfevmLOWXu86VN4Lta2H7+AZnDWZNX0VNk="
	},
	{
		"path": "assets/Apps_Riot-m596j3wt.png",
		"integrity": "sha256-+aE+IfqMemS5huqAPlmXz9n38xMs9ocQsXQFuhq+YVg="
	},
	{
		"path": "assets/Apps_Steam-g6awhuoy.png",
		"integrity": "sha256-LvjGxZHYGudyYRaq9uymTGC5LlqB9VGp4OK5svo1pHI="
	},
	{
		"path": "assets/Apps_UbisoftConnect-oexn5ery.png",
		"integrity": "sha256-AjksUVRO2ao7XNRCxwsai+suAp7etVIuv9O8b/2ZPuc="
	},
	{
		"path": "assets/AskAParent-o935xs9h.js",
		"integrity": "sha256-M9iJQv/zRTGbiFn02RB1EHNUJvDX9bXPl20eLCf4UTI="
	},
	{
		"path": "assets/AskAParentDialog-j9n8znth.js",
		"integrity": "sha256-XWbgFDdxsppK3K+6PzQ0uS4Q/JyxyA1kMz8FpDAGLyY="
	},
	{
		"path": "assets/AskAParentResult-hgfgzma7.js",
		"integrity": "sha256-mhY9c8RS0Ehrsvjo49SoVChgDLk78dp63OHWN3n82/Y="
	},
	{
		"path": "assets/AsyncPayment-elnwbkkr.js",
		"integrity": "sha256-gH+0InfL4dn4DlUGmWaOs4nHN7h7Lc6gI2xUwoCHJO0="
	},
	{
		"path": "assets/AsyncPayment-hep607fm.js",
		"integrity": "sha256-qtW6Mqs0Kz5sZQirRDElN7WWO558c/oVz26jAtkj/RU="
	},
	{
		"path": "assets/AudioAndVideoTab-kg2o5i8k.js",
		"integrity": "sha256-usZLFe/+DsOLIV8CLn16PeamWnMV4ph5m2SJK380v1s="
	},
	{
		"path": "assets/AuthActionHandlerRoute-l98c5s60.js",
		"integrity": "sha256-SrrXxlBdttIvzrFpRqn1Z1FTyZ0LLVM6HBsMTB4OOn0="
	},
	{
		"path": "assets/AuthClient-lgtmcpde.js",
		"integrity": "sha256-20mlMzYE31dVeozbzXIiu5WhjyIUhGRDFBmoXgJ3hSo="
	},
	{
		"path": "assets/AuthPlugin-jrjqbgbs.js",
		"integrity": "sha256-DcssbLtWoxiVJ+xhz+9sJc5X/bJUyvUxEydN0T8Ovn8="
	},
	{
		"path": "assets/AuthenticationService-lwipwuto.js",
		"integrity": "sha256-b152tqBzCAWgg43Ivd+YSO79gEaveSCwAuntOZlJjqU="
	},
	{
		"path": "assets/Back-ddqm128l.mp3",
		"integrity": "sha256-l6edwNF/O1jPJPlaW7EKaijMvkqQ23KIzRTd+vVQXcw="
	},
	{
		"path": "assets/BackgroundChildLayout-hdu0dvz5.js",
		"integrity": "sha256-AP5LBHZluPduSGP55/Xv+0VShe94jaU5Rn8n1e+DT54="
	},
	{
		"path": "assets/BackgroundImage-nvqqagv8.js",
		"integrity": "sha256-aJPVzU16cxJQqt13CJcWOOw19mPOZgiv1w4Ldh3mvPA="
	},
	{
		"path": "assets/BackgroundLayout-gdnpluhr.js",
		"integrity": "sha256-qV2ymsTmZ4OGtI/W30Pkco8UOzeyIj3wPcKnuLUMsIU="
	},
	{
		"path": "assets/BankChallenge-bhunjqoa.js",
		"integrity": "sha256-kCcr80BL9M4oK5wq9Wn8n46pYDxWsVHr0ZdO6MvbtEg="
	},
	{
		"path": "assets/BankChallenge-n20pd30m.js",
		"integrity": "sha256-35nqlHdSHel+H2UrA39+RVbwN/juzfuS8LIwxBAoac8="
	},
	{
		"path": "assets/BaseAchievementsList-jhwx0hqv.js",
		"integrity": "sha256-zFOpY2Wfdug6T8cD8/sUaXVwzIADeKQs+foUn9ii7nc="
	},
	{
		"path": "assets/BasePlugin-nelnyp3q.js",
		"integrity": "sha256-Zk9IqfwRcpiOPQBIi5grjIVCpM2ZFLWeSYzSZxw8hoA="
	},
	{
		"path": "assets/BatchFetchCacheAdaptor-jppkke5o.js",
		"integrity": "sha256-Qc7qRXa83jF25jIpIIzxc1qbpu+u/D9bhjXPhJGuUzY="
	},
	{
		"path": "assets/BenefitsHubGateLayout-nuqvzj2p.js",
		"integrity": "sha256-btwAcjjko1mVcU42w6F/WuKeI84N9D0fJziLgJfwdy4="
	},
	{
		"path": "assets/BenefitsHubRoute-cgdzibfn.js",
		"integrity": "sha256-r3DxSRa3SGNODQsIAK33s0rir0N88Mer7sv0+OIHm6Q="
	},
	{
		"path": "assets/BioDialog-cc45cthc.js",
		"integrity": "sha256-nXPL4w8iqLgAN+fYjEJzlkrGVLe/4uV1pppjMK2xXN4="
	},
	{
		"path": "assets/BluetoothScan-cj84oib7.js",
		"integrity": "sha256-njBozdH+XBunt1udEKmymIILpSTQeHeAQYDti4PMg0o="
	},
	{
		"path": "assets/BluetoothScanDevicesDialog-cc8bc1rl.js",
		"integrity": "sha256-/2vqI0uXc3uOvRyaQhzOs8d4Nlb9UCHMc/H+f8GvTrw="
	},
	{
		"path": "assets/BrowseListDialog-k8sk5z0p.js",
		"integrity": "sha256-IISdJymQ959Xdq/wPDFtn61P26UtHu4VoI+A/Z3ikNs="
	},
	{
		"path": "assets/BrowserPerfAdapter-g4v3bnbb.js",
		"integrity": "sha256-OU03rtmPH/9Jf/QxB9gkz54oNkoc9KjGTmOKT+lcRq0="
	},
	{
		"path": "assets/CaccsConfirmation-n3wrkhx3.js",
		"integrity": "sha256-486xU/atjI4kXtp0uM3q5YFHNdFgdlWF5Ml/30y+VmM="
	},
	{
		"path": "assets/CaccsConnected-dtapz98d.js",
		"integrity": "sha256-MHJtyhXmt4Dy+GHLBLLcqPRcuSjCHVS7cjsjVLC3xfo="
	},
	{
		"path": "assets/CaccsPairing-cewo07q4.js",
		"integrity": "sha256-4LFVd/ukIimXxKdk4T4aqEgyluTU5TQkxXW2W4VGcow="
	},
	{
		"path": "assets/CanSeeRealNameDialog-me8qcw7c.js",
		"integrity": "sha256-mrh7lHmSkdBdmLMBdShDLbgaGAx5wjMDJyybHs14U/A="
	},
	{
		"path": "assets/ChangeClassicGamertag-n9i5p40f.js",
		"integrity": "sha256-2yxYtwj8gk8slHTbGOZK5jekSjkNqsj4I7e/x8EKNEs="
	},
	{
		"path": "assets/ChangeGamertagDialog-nu6ds8dy.js",
		"integrity": "sha256-fnZ4vNLkrePqm3mJboomu4tvIVubM0VAEWw9JvFWRTY="
	},
	{
		"path": "assets/ChangeGamertagInput-nruk26ee.js",
		"integrity": "sha256-bK75xbadu1R+aG+ilv7y6B+UuvXEmY8WzHOOqWGS2Ik="
	},
	{
		"path": "assets/ChangeGamertagLoader-g0frxxf0.js",
		"integrity": "sha256-DL+OEjqyFeD1nOOPHU93dfIq8W3piqzYPDWu/KrODp0="
	},
	{
		"path": "assets/Chat-g1gjrasz.js",
		"integrity": "sha256-DHMVvi49hEHh8nOi4WH6cEXNnKGeRUAQUcgzPJjQ06M="
	},
	{
		"path": "assets/ChatLandingPage-h9ruqq2u.js",
		"integrity": "sha256-3cMpzVXzGvuFQqpjASTrBgWfb644k7560KXVJjRvRfo="
	},
	{
		"path": "assets/ChatRequestsPage-g0edzy7n.js",
		"integrity": "sha256-vq8N7gvOOmw5Smqx4xqpkILXc2KhvBnCpI2f2Ie8MaY="
	},
	{
		"path": "assets/ChooseGamerpicDialog-hjv7wrr1.js",
		"integrity": "sha256-0vFsn0GOoXfhDbH4+ErW+kXrtS2i3iTTStl0AKdmPCk="
	},
	{
		"path": "assets/ChooseYourGamertag-l5cmdm69.js",
		"integrity": "sha256-R/UJWmJteHwqVPtfUjoMNWMA4gAXyQo2HKMXtSzXevo="
	},
	{
		"path": "assets/ClientInitRoute-zezjwvzv.js",
		"integrity": "sha256-aoH+BO+O2dzJbTYmJ5sI6TMu+NbYXMzYqte4OMz006A="
	},
	{
		"path": "assets/CloudConsoleStreamRoute-kvvq1umd.js",
		"integrity": "sha256-jpnRu6l0YyGmbsBSo07iYfOnjzjt+sl35ygZx4pz9Gs="
	},
	{
		"path": "assets/CommercePerformanceOptimizationLayout-mohkq704.js",
		"integrity": "sha256-dSOCfqWL8OUY5iTq0O4XosEpW5wfCMZBli4ISL2mqKc="
	},
	{
		"path": "assets/CompactListItem-gv8s0bza.js",
		"integrity": "sha256-dSHdXSM9KihzFyMMwhJMCzzCgQbYa9QAinQrH25ueNQ="
	},
	{
		"path": "assets/ConfigureIPConnectRoute-i2hqopfo.js",
		"integrity": "sha256-J8L7wyCbhHYKFQ/OvxjiFjVVC6RsdzsyknEjm//I/OM="
	},
	{
		"path": "assets/ConfirmAgeDialog-c5000zfz.js",
		"integrity": "sha256-WuVMPY4MDUIHwsyJAD513GwBS6ikyM0EiC9SWbO/1wo="
	},
	{
		"path": "assets/ConfirmBlockDialog-kmym7uei.js",
		"integrity": "sha256-nTzd7AWiZtFy272UxKlFitK2IXkg1mGOVF9DHAwTke4="
	},
	{
		"path": "assets/ConfirmNewGamertag-csvljkcy.js",
		"integrity": "sha256-kIfrwbCNQK8cA9NqII+laXYpireO1s8eJK/oZUN/18g="
	},
	{
		"path": "assets/ConfirmQuitDialog-owlwwvtu.js",
		"integrity": "sha256-lHDaru4wgoq7uBNvHJIxRfu5hke2DA1ABs5YVdXlqZM="
	},
	{
		"path": "assets/ConfirmRemoveFriendDialog-h8hkd7zv.js",
		"integrity": "sha256-yldRX1+1QgXDg0GYNO4U1ED7Jm90T/yy858OxANE90I="
	},
	{
		"path": "assets/ConfirmStorageDataDeletion-ihc3ak1r.js",
		"integrity": "sha256-4bsdvEZs+4cx+8+cRgqHkGn//O2tY3MsIgE8FoMCCqc="
	},
	{
		"path": "assets/Confirmation-hra8pi5i.js",
		"integrity": "sha256-1iSLCq0i/E9udT1BXdrDZO/YuyEyviQfkNOgi9EGqCg="
	},
	{
		"path": "assets/ConfirmationDialog-lzvdkfji.js",
		"integrity": "sha256-z/zUIVu0d12o5afWYiWf2kB8OO9J+UuXavCfq3qAPgc="
	},
	{
		"path": "assets/ConfirmationDialog-mr52yg48.js",
		"integrity": "sha256-sBK2+ThgzqNy110htZH74JjnlXUTBqHztKIk2CCHuuI="
	},
	{
		"path": "assets/ConnectConsoleDialog-lq86a9p3.js",
		"integrity": "sha256-G3SMglLiLXSs8vfSuOpXds43qESYwb5fLcKGq/UQgD4="
	},
	{
		"path": "assets/ContainerVirtualGrid-db88vdpo.js",
		"integrity": "sha256-6/0VnVEBONy/nxM4XopLlM+bGHnaXDKVUdaPnUFP/vQ="
	},
	{
		"path": "assets/ContentAccessService-obnvvsib.js",
		"integrity": "sha256-/Q/MWjXHUNniouiP17FIIz+iXSqkKfRmYkO5yUsqxBA="
	},
	{
		"path": "assets/ContentPromotionFREDialog-hzp6blpx.js",
		"integrity": "sha256-LplXHIQpqtkkyvngtFg4WJOQPFAGRI5HC7nRLkjvQlQ="
	},
	{
		"path": "assets/ContentPromotionPage-o67dys44.js",
		"integrity": "sha256-YdGrAZhxYWKFroBMHvTez5YY8qt5790cuaLzQNMSetU="
	},
	{
		"path": "assets/ContextualStoreDialog-e6g5f142.js",
		"integrity": "sha256-IsAtk7F7ZBggCk4WLFE8nxpNUOLGzkXnwzKAkhlHE0A="
	},
	{
		"path": "assets/ContextualStoreHost-j7xjb8fo.js",
		"integrity": "sha256-KZR715FIaxSde623LlE2R+M+MNCwaZM3Fq3zrclrQMg="
	},
	{
		"path": "assets/ContextualStoreRoute-fkkxqoo3.js",
		"integrity": "sha256-wZZB5ex7X+QHJbLvx7NprAmdBqABitwqdPTkyeM5pHs="
	},
	{
		"path": "assets/Controller-kcw8hecv.js",
		"integrity": "sha256-uxXnJNzlCB3mLQfuMWyE4Z/vRhxRPXSY03EfCW3b65o="
	},
	{
		"path": "assets/ControllerBluetooth-gln8hyie.js",
		"integrity": "sha256-hlbZhm5JzgvH03vIyfHISnhyhyQNpErvz6stc+WCZ4I="
	},
	{
		"path": "assets/ControllerBuyQr-jj5avvv6.js",
		"integrity": "sha256-CUbNQ+rRyzp0ThTjcziZIZ1qzgcRBJ5WWAi7AjJz8vc="
	},
	{
		"path": "assets/ControllerConnectedUsb-hsr0wb4j.js",
		"integrity": "sha256-zweoalcCsm/p5I3TdpAaWWYCH4duyKhERBYc45Y0zP0="
	},
	{
		"path": "assets/ControllerGenericDefault-jpa7tde6.js",
		"integrity": "sha256-kRFZo1i3aThXaPLpcuneHIQ6eowPWxOWqXsIm2MT3dA="
	},
	{
		"path": "assets/ControllerGenericPair-meo82510.js",
		"integrity": "sha256-Wb6ZGH0iWZIrRxNacoCrU/KGI2t0y+BGHE0a4KIBPP0="
	},
	{
		"path": "assets/ControllerGenericPressButtons-j7mr3sky.js",
		"integrity": "sha256-j4sugQ+JTOI2ot6fhKXbgbIptdaXvO2eB37cAmfP4IM="
	},
	{
		"path": "assets/ControllerList-ey8kdyfi.js",
		"integrity": "sha256-+PqwHZ7xP7llhU5B9KOboewSRY8VbSG3n+ZYZG6m4e4="
	},
	{
		"path": "assets/ControllerLunaDefault-jeru3uzf.js",
		"integrity": "sha256-gprbYTJRd8b1DJSVvgRtpbqhuOUgbEMz5H8DOej6c1c="
	},
	{
		"path": "assets/ControllerLunaPair-h6kud534.js",
		"integrity": "sha256-pDAPMAwiOZJcN4D0K6uxHWcTrH0dWmqIrvc4Ts8H85w="
	},
	{
		"path": "assets/ControllerLunaPressButtons-m70t0mux.js",
		"integrity": "sha256-LhJzUCPqlrpv28kHrBZgovztB0bydPH7rEOur6CWsfk="
	},
	{
		"path": "assets/ControllerNintendoSwitchProDefault-lg9ajs6y.js",
		"integrity": "sha256-tMUNykyY0OyIEW07c/IFgvR5vM6VKTmOPHCehC8wUuU="
	},
	{
		"path": "assets/ControllerNintendoSwitchProPair-jdxlyax3.js",
		"integrity": "sha256-5aMg5UUIt/c9npC5dor8omAXec6b8CmCJ77noP7VxUM="
	},
	{
		"path": "assets/ControllerNintendoSwitchProPressButtons-hyt86bhg.js",
		"integrity": "sha256-/0Ct736g3qz5p5sjNEJhE8lMheQ2bdXb89KllPyz8mQ="
	},
	{
		"path": "assets/ControllerPairingContext-lndsofbd.js",
		"integrity": "sha256-V3SzsoV1IkeHA2y0zan+IUuIkRAVU4SItnt79F8HK9U="
	},
	{
		"path": "assets/ControllerPairingDialogContent-o9i5wui9.js",
		"integrity": "sha256-p+SEyj0RaTsSKWPvPD3h7QXJRudItih3s78FU7CX4vo="
	},
	{
		"path": "assets/ControllerPairingDialogWrapper-ntltik3s.js",
		"integrity": "sha256-FMDh4W5GfcNwRYjhwRpYGKdlbfWG+1SU7WVh9sd9lTQ="
	},
	{
		"path": "assets/ControllerPairingHeader-o5r7pkm4.js",
		"integrity": "sha256-Won3F6+bIUVceWAHv65CQ8MWIrGNdNL9jEFKVCgx/3o="
	},
	{
		"path": "assets/ControllerPairingRoute-ibjhg7js.js",
		"integrity": "sha256-RRdys1QuogDv645ZQGAKyOSJL+5xW9+mrelFVznNzPM="
	},
	{
		"path": "assets/ControllerPlaystationDualSenseDefault-gi8kbson.js",
		"integrity": "sha256-OfaqRQ4BcP5zrFI22RnnuEk9FczSrUiyHFkETvkd604="
	},
	{
		"path": "assets/ControllerPlaystationDualSensePair-cud408ez.js",
		"integrity": "sha256-DZ17+k7Z2JDh5YO8hIp5J7Vqz0LRwgZxcT1txWgLOAU="
	},
	{
		"path": "assets/ControllerPlaystationDualSensePressButtons-m6929ici.js",
		"integrity": "sha256-BOGhqwY+QEq1qwpKuyEnw/3yuH1KNhFAVeYOFuCFlRw="
	},
	{
		"path": "assets/ControllerStatusDialog-79l3d52n.js",
		"integrity": "sha256-5V4rrTMah95h7B2Xja5PZwAWBL0mFLG2qzbJJTbyI+k="
	},
	{
		"path": "assets/ControllerXboxSeriesXSDefault-liwipdau.js",
		"integrity": "sha256-HR+ykXKarbuhcmBXVKjQYY4lIU8yPZbJliX9Y+vw1Lw="
	},
	{
		"path": "assets/ControllerXboxSeriesXSPair-eogibq9u.js",
		"integrity": "sha256-R2Xky3+oFX7bYaNdKM69N1oN/2t7yHc6DwwoifpWGVU="
	},
	{
		"path": "assets/ControllerXboxSeriesXSPressButtons-i57wwens.js",
		"integrity": "sha256-xcH9ZbeGR3Kv+Z9vhd5YMqtGrbAV4YCH1fMI/fwQuvA="
	},
	{
		"path": "assets/ConversationsList-og9inibv.js",
		"integrity": "sha256-IDLZC5WOOTaFt0ivOQauOAdcSQur/7G3wUuIi1FD75Q="
	},
	{
		"path": "assets/CookiesProvider.client-i1hg9lp6.js",
		"integrity": "sha256-iFRyk5CTIuG0waqHsI4SLrpt5qYvnHFoKft4pSE8QDU="
	},
	{
		"path": "assets/CreateLightweightUserDialog-g5qtor2e.js",
		"integrity": "sha256-AYfdq4dxlm+pymsuXKgCMiYvmKn1bjAUndPx0gmlGhY="
	},
	{
		"path": "assets/DefaultPlaceholderImage-n7xcg7i1.svg",
		"integrity": "sha256-K26xxyrFaYwhjXuutlj9/P48aioMHuA39ra1KQBAmZ0="
	},
	{
		"path": "assets/DeprecatedDigitalAttachRoute-o7unjnmz.js",
		"integrity": "sha256-tZ+hq8NOKGvnTn7+fdaJSRJsqi1SSYkzq8N79Jij1F0="
	},
	{
		"path": "assets/DeprecatedPurchaseRoute-lyhscw49.js",
		"integrity": "sha256-nezUNgo42t612XuZMHBNAC4xPi6OPVp/Aeq+2bjDT8k="
	},
	{
		"path": "assets/DeprecatedRenewIntoRoute-k5e6uooo.js",
		"integrity": "sha256-89R+iuuAVI9WMfd4/YEzE4NGLvuP7GNHfiYttBsukHU="
	},
	{
		"path": "assets/DescriptionBody-m0jwtnw4.js",
		"integrity": "sha256-+0glWPDd5VLZZ1/6PwmP881T4Jqpz4DkpW8rUKvc2rs="
	},
	{
		"path": "assets/DesktopMode-om1fpgma.js",
		"integrity": "sha256-v4OGH4+sLQ7eDCT96BjGn5sFCg1EFmJkXYdYppYRcQI="
	},
	{
		"path": "assets/DeveloperTabContent-oba9y71o.js",
		"integrity": "sha256-qfsYCYDMZjuZq0RFUnzNRcqkRyZVrKOJqHkXheRT918="
	},
	{
		"path": "assets/DeviceCodeRoute-osrig3il.js",
		"integrity": "sha256-b1SmVvxd4lOVdRN4JJ9Qer33KXvrByfMdZufvlQjma8="
	},
	{
		"path": "assets/DeviceGameInputPage-ejwb6h73.js",
		"integrity": "sha256-V7+CSS73+HjRhw+MXkyHE59TniyL0XewCbrsUXEwJwc="
	},
	{
		"path": "assets/DeviceInformation-nadl8dei.js",
		"integrity": "sha256-OIwUfdkFQjXq4Ld0qBH/ogv7VEXIWUWaUp3rH93r7Ls="
	},
	{
		"path": "assets/DevicePage-jd4gkk2m.js",
		"integrity": "sha256-jymqh6vJtz9l571f8lbuU8pfX4kBosxLByo8teWa7lE="
	},
	{
		"path": "assets/DeviceSoundPage-jtn97o9q.js",
		"integrity": "sha256-S+G4dU+FH4m3NBj7XnMTnve3XAQ+x3YypLvIgQsgNwI="
	},
	{
		"path": "assets/DialogShell-k2jpaw9r.js",
		"integrity": "sha256-2dvRBbr6mP+swpwsEEWMrq2sraBB2AeY9rQOe/LHVF8="
	},
	{
		"path": "assets/Diamond-i0wk65ub.js",
		"integrity": "sha256-nNU9RwLvHXM6THSRPvGEgljfgNP0hWtMdFWGu/GDcnY="
	},
	{
		"path": "assets/DigitalAttachPage-cafm5szl.js",
		"integrity": "sha256-SLaiDc3x6ot/pUkONeN0kmIAvQE2OEsoD30FwS4vUi0="
	},
	{
		"path": "assets/DigitalAttachRoute-nc5bw84b.js",
		"integrity": "sha256-74rg6tdGI0f+4EHfX0lGn1vUYMasGDRaxsbvhW+0fnM="
	},
	{
		"path": "assets/DirectChatPage-k7e6eyib.js",
		"integrity": "sha256-K7Up6iPISFikC4hSBFH/rYXAAjJ0q3Zl5xHhbHNWfnw="
	},
	{
		"path": "assets/DisconnectWarningDialog-cwtfgroi.js",
		"integrity": "sha256-umNBJn4gtIcmHkUZ8PBcpQXF3pt52/PVi2QqYpTgGuI="
	},
	{
		"path": "assets/Dropdown-c0i6gmef.js",
		"integrity": "sha256-FWQaZ+aJ7+Fy/H5q1SqmHI18ywulGJvzDw1RDLzSkzA="
	},
	{
		"path": "assets/DuetDialog-n5q154y9.js",
		"integrity": "sha256-hMAbAZQY51I+TpeR1Md79tfYTPossZ5X1qJhNQC6faw="
	},
	{
		"path": "assets/DuetPostUpsellDialog-k34ldchd.js",
		"integrity": "sha256-rCZphPIuDsV7nJvWdMacbkxx+CbWbPuvt8tWubtW0ZA="
	},
	{
		"path": "assets/EIDV623S-dtkajrto.js",
		"integrity": "sha256-GQ7UFSXaToHKHc9DxOz03CH8NHCbjGs7d4mOZYnaHro="
	},
	{
		"path": "assets/EmptyAchievements-j5bus2av.js",
		"integrity": "sha256-04d+rahdt6mw3dJeSQ2Y+OkXAjxcBOsv5025vNjpnVg="
	},
	{
		"path": "assets/EmptyChat-cc18p9s1.js",
		"integrity": "sha256-1W3vVXbkVcYknWeHKVcgsjL1H82OkTgkNkxYMQJgp+E="
	},
	{
		"path": "assets/EmptyFriendsRequests-d5kcwfw1.js",
		"integrity": "sha256-sQUySOXZMrO32MdTyOLjGqus3pCTGiFxYzOtTjsorYQ="
	},
	{
		"path": "assets/EmptyPlay-gbnuf5c9.js",
		"integrity": "sha256-pTjl311xBCXR6BDunlIEsi3R4IajiWdw+iw0HaHraW8="
	},
	{
		"path": "assets/EmptyProfile-m44i4tt3.js",
		"integrity": "sha256-76FoLIKRUc9lHQS8iR2j8p1lj8veuAhmCT7P2ngo72U="
	},
	{
		"path": "assets/EmptySearch-n4tjnn0o.js",
		"integrity": "sha256-hlNJeFGz0KEvqYtf8K9vGvrorpVj5PfAHqlty0sCRoY="
	},
	{
		"path": "assets/EnterGiftCard-gksoxv38.js",
		"integrity": "sha256-ZNjlv6Dvq5e4+yRJ7977OPtYgwQJDV/TnVnJVGwlNzw="
	},
	{
		"path": "assets/Error-gn301cce.js",
		"integrity": "sha256-uduYXm03VrlXYgq/+fLx4MiXnPK9Wrxw3C7HwRjK1Ek="
	},
	{
		"path": "assets/Error-otusx1oz.js",
		"integrity": "sha256-WMsD+WNrFthFslkeJRdrO0XHWlr8lssu4DCjJxysWOQ="
	},
	{
		"path": "assets/ErrorAccess-bv8vi7xa.js",
		"integrity": "sha256-DcEqaqUA0BQSNmUHyUm54RLjOWWzmGVCOyPgBN/nmJQ="
	},
	{
		"path": "assets/ErrorChangeGamertag-nbvigfyo.js",
		"integrity": "sha256-48mjVkk7GAKcjlatFRy7i3+5ZoaJ6t2vQe4YTsygK6o="
	},
	{
		"path": "assets/ErrorChangeGamertagContent-lnv0mwl1.js",
		"integrity": "sha256-i0brjJBFWiW7tgpng7Z1acpp1ShuhKGLubc/MEcNPQ0="
	},
	{
		"path": "assets/ErrorChannel-k2pg78wg.js",
		"integrity": "sha256-IgWf4fW0fQmhecdpGfY1z4mwrilUPVky8+AlrmOSmT4="
	},
	{
		"path": "assets/ErrorDialog-ur80ixpo.js",
		"integrity": "sha256-vYZz0JZwNHL2KI1FVP45syI/LAoLR7sryFdu23OvzV0="
	},
	{
		"path": "assets/ErrorProfile-mvdrowio.js",
		"integrity": "sha256-NMMjBPHq9BW8bR3zh6MDTrelsaJQpOfIkhEMVM2yqUs="
	},
	{
		"path": "assets/ErrorServer-m6vpm8cd.js",
		"integrity": "sha256-2U6BzksGWo/C67gRi29xrHL6j+SofdbbjfK0mbiUxJo="
	},
	{
		"path": "assets/ErrorTestRoute-pfim4l28.js",
		"integrity": "sha256-JaZ3CCo1E0BWG9uPqlx5oywz8dVCkGSeBMg9tKwj0T0="
	},
	{
		"path": "assets/ExampleTemplateRoute-c9amnk9n.js",
		"integrity": "sha256-NiMnjhECfcR2RgqFRnpl7UIXlXaFXCoeIpzI/q7dPA8="
	},
	{
		"path": "assets/ExceptionRequest-g6950487.js",
		"integrity": "sha256-vWbxpolrju3CbA9i+CusXJTp73vd1UAl9qDqStmVMRo="
	},
	{
		"path": "assets/ExceptionRequestSuccess-pfnao756.js",
		"integrity": "sha256-nnNQydm9pIO8eDDFCxof+SpUL8mIJ9DEwh4IM5H3VWQ="
	},
	{
		"path": "assets/ExitFullscreenDialog-canc9how.js",
		"integrity": "sha256-SgkHY+FjUcQN88wUXY0ZkwFtpxIfJ4/XsLGk5hp7AaU="
	},
	{
		"path": "assets/Feedback-i80ue0hu.js",
		"integrity": "sha256-ylCKG+MGRPrwGF1Pf2nzKRJpwprPazZATqw8UYQytVk="
	},
	{
		"path": "assets/Feedback-l6v3infd.js",
		"integrity": "sha256-PzgUe0aK059W95tvJl29vo7zzpnx/mgGI5VHP9IP7Qs="
	},
	{
		"path": "assets/FeedbackButton-dmwv11aj.js",
		"integrity": "sha256-XI0MbsP8RKHMgxtfPzp0TSqcFTrA0GfbhtJBd3PWtuc="
	},
	{
		"path": "assets/FeedbackDialog-h7i5y6tm.js",
		"integrity": "sha256-raxufor+kqxiMMRV/trFkRkhi0Hnj0RZKTaw92lce3g="
	},
	{
		"path": "assets/FeedbackEntryPoints-bcb5r272.js",
		"integrity": "sha256-9+8i4j6vr5jP9D5ZTiasWvL0TCgx/4509erMmaDfYFU="
	},
	{
		"path": "assets/FeedbackExternalRoute-7a5atrd8.js",
		"integrity": "sha256-eTAITJlLtYNFKsKox0DEt1HkelebYpmY0Huff6SrY+o="
	},
	{
		"path": "assets/FeedbackVerbatimScreen-b3q3d4oo.js",
		"integrity": "sha256-Bor3NP+Jl1PzN7cxea7MlEkl7woaodEUqW6pSreDkm0="
	},
	{
		"path": "assets/FetchCacheAdaptor-j49ssbci.js",
		"integrity": "sha256-jsAVn+nRaq/SUhjGAYelJSIZtmoPIWznq8AnoLfduC4="
	},
	{
		"path": "assets/Fingerprinting-bseize2n.js",
		"integrity": "sha256-omHvDh/gVLgZZkWE7y8EzzwrxcQaAFPmy6apa5pRkao="
	},
	{
		"path": "assets/Finish-fx3mws36.js",
		"integrity": "sha256-ykzJlnED4l8K0tVZfSaOzCq92U4maonl2fYqjilT5WY="
	},
	{
		"path": "assets/FourOhFour-fpc5mn66.js",
		"integrity": "sha256-sM9d2UQw4645JBKZjc4WRilDTqqVp5p3T5OvuYFVess="
	},
	{
		"path": "assets/FresnoPostStreamDialog-maj9hzc1.js",
		"integrity": "sha256-r5LdX2NRn+HukOFlfK90+lG7vcGvzMmhzl9+/revdjM="
	},
	{
		"path": "assets/FresnoTimeoutUpsellDialog-bmucefi8.js",
		"integrity": "sha256-AtOXpfSVjuF2YPsf2YqmTe8tFCSlL1DsgS2qUo+OdKM="
	},
	{
		"path": "assets/FriendRequests-mgbsikcv.js",
		"integrity": "sha256-IPVuT0SFqge/0FwgG7ld9DMiaj5hGZmQ+fyWL/Fi5JQ="
	},
	{
		"path": "assets/FriendRequestsPage-kyl6wo53.js",
		"integrity": "sha256-avLyyidZE1X3HihbjRZPoNvYF7oQ7D9NZ8t+Wr0/ljA="
	},
	{
		"path": "assets/FriendsWhoPlay-c25cmbom.js",
		"integrity": "sha256-S9ozsSwyY6+ByAkajR7Sk4iMLSOOmJPJ5twv40/HzHQ="
	},
	{
		"path": "assets/FullScreenMode-id2ckpyz.js",
		"integrity": "sha256-5kOj80hwbQ/bxhAXceHovHQ5f34yNNrOG4xLMkIk+NE="
	},
	{
		"path": "assets/GalleryDialog-jqqy5og4.js",
		"integrity": "sha256-sbTmGwB187XWRLbx82m7IUmmqVwpoD/Nl0KIa6ViLew="
	},
	{
		"path": "assets/GalleryRoute-iu5o36gl.js",
		"integrity": "sha256-SMPHmFHC3JVGZM5SXQjn5ZCH1t1Um3MPp4iixMt3xFE="
	},
	{
		"path": "assets/GameArtScroller-od5f5tc5.js",
		"integrity": "sha256-AwPYhjxxKCzD266ls6rys02dHcTY1JRXyC18C0flIuY="
	},
	{
		"path": "assets/GameDescriptionDialog-i0xn55km.js",
		"integrity": "sha256-rbGUy4euEXS8WpNrGLrGHgcgQb1kchGL5399kNWSlA8="
	},
	{
		"path": "assets/GameHubGateLayout-mzmjq45q.js",
		"integrity": "sha256-6GFl7cErJpFOdB2JwbOVLxnynpclctIvMdAlvDtfU0U="
	},
	{
		"path": "assets/GameHubRoute-jwfymzsy.js",
		"integrity": "sha256-38a4SEyZUEr/DyhZLqyiSVxtyLfVvuIV0MhH7lnkN44="
	},
	{
		"path": "assets/GameInviteDialog-hrbwhj3h.js",
		"integrity": "sha256-FebCJznQrmqotSaZ6/kqrk2U7AUjQxJBit9KNukKOOE="
	},
	{
		"path": "assets/GameInviteGateLayout-mrq92wnb.js",
		"integrity": "sha256-B8tJkkxFNs6niYcYcGlp/R//6oNVnIQJXYBRzcy9uxI="
	},
	{
		"path": "assets/GameInviteRoute-naq80dfi.js",
		"integrity": "sha256-q4lPH3EFIOLWBF9pbPWZL5dZiI7lYyIepBjS2XlFg2w="
	},
	{
		"path": "assets/GamePassBadge-dyhvpnbf.js",
		"integrity": "sha256-4C2fUnvveEfXNyFjbHXCkn61sUO+NTSSOT6STCFjFIg="
	},
	{
		"path": "assets/GamePassGateLayout-o0u0v1un.js",
		"integrity": "sha256-ZEPhKHWJqAZBgZHVhWJYf+UryVZpKoJKO/6kAwQdw1c="
	},
	{
		"path": "assets/GamePassRoute-dphecfe5.js",
		"integrity": "sha256-4VCWAQN0VEiwWZm2dbma1WTZf/mb331ZjznTLtr897w="
	},
	{
		"path": "assets/GameSessionCodeDialog-maj97zjx.js",
		"integrity": "sha256-gSpyZN/KgaikWeEPWNFjMlVSsQ/MF6wuC2iwME09C/4="
	},
	{
		"path": "assets/GameSessionDetails-ecycyzpq.js",
		"integrity": "sha256-EJyM09788JB1YMDmhNi04LshWYnijdnYowVGbcKTOzE="
	},
	{
		"path": "assets/GameStreamBootstrapper-dkchivvi.js",
		"integrity": "sha256-ybaXV++X12dO6iTEGB3Lt2i46O/AESY+1HsYaJBTgBs="
	},
	{
		"path": "assets/GameStreamDialog-bx5jo6w4.js",
		"integrity": "sha256-ebXqLhm/SOXjwsssWHJNr8n2RUfZvM97kel+99ZFOXI="
	},
	{
		"path": "assets/GameStreamDialogContext-fbymttir.js",
		"integrity": "sha256-QLcn+SeFzmXBb+wdAhjzpM6pAObC2H2e47HLJQrgick="
	},
	{
		"path": "assets/GameStreamPage-kvdmt4vc.js",
		"integrity": "sha256-tiPo/EnY2/ZEZFgsuuYctDhfK/8GN8SZfefy0VGlB0M="
	},
	{
		"path": "assets/GameTile-kxn1jxuq.js",
		"integrity": "sha256-uqE2ERq3Y2LWNLc12DsIeTAj1JIeqNutvbJRu+8Qh1c="
	},
	{
		"path": "assets/GameTileError-n5mrzlkv.js",
		"integrity": "sha256-xWEOWe8Txtem6a0c6B11zJETZJl02j8uUTklxCLi1ks="
	},
	{
		"path": "assets/GameTileLoading-nieaaofo.js",
		"integrity": "sha256-H+HIfC2SWt147qXThhKBXS33N2q3EmIFWe22Sdd7MuM="
	},
	{
		"path": "assets/GamepadDisconnectedDialog-lnwexf8k.js",
		"integrity": "sha256-j874Om9Nl9QD5RbM7jI5BT6QEeoKoWfhQ8FNK6CJ8Y4="
	},
	{
		"path": "assets/Gamerscore-hxfaor61.js",
		"integrity": "sha256-dRXQtx9TgJf7nElfkIWJEcSL/9s2ozdg1TgIgV3w6Is="
	},
	{
		"path": "assets/Gift-czuc7s6y.png",
		"integrity": "sha256-HKxu51CVY6109f9Zd3SMyzMQltRDqIVqJf1vnQ1vzgU="
	},
	{
		"path": "assets/Gift-n506jqqv.png",
		"integrity": "sha256-NkjinG3errUYPFtbeEU06Q/+kmcE9tG+CdsbQyJlCFw="
	},
	{
		"path": "assets/GiftingDialog-gadyvbx2.js",
		"integrity": "sha256-lryKd6DOQgu6Tb7hTJBAGJ4kNC/o9R5+re8+/sLp/iw="
	},
	{
		"path": "assets/GiftingHost-hgnt8esd.js",
		"integrity": "sha256-As/4rNRS8B1gzfkvyPyOuThrYnyMiBzfwJP6aMvZKmc="
	},
	{
		"path": "assets/GiftingRoute-g6ej9p4y.js",
		"integrity": "sha256-bopAIByGfzR54BGrovbmpFjStUlsxDUrGW47jSIPEm0="
	},
	{
		"path": "assets/GroupChatPage-mewya3se.js",
		"integrity": "sha256-FVymrbFZGw6I/n8oVaF4E9MyhO6lMFimBGaVEsK0g7E="
	},
	{
		"path": "assets/GroupGamerpic-cgh0j1sv.js",
		"integrity": "sha256-GTZm9DgeJNU/dk+Xujlbmb7J/1F47hvp39n73+6mJEI="
	},
	{
		"path": "assets/GroupMembersPage-eban7bvk.js",
		"integrity": "sha256-MiPhC427RtJkuAPAUSBk+QqMxFAUni3q2S4qUx64fiw="
	},
	{
		"path": "assets/GuideAccentImage-c0qs6cd8.js",
		"integrity": "sha256-wFBTYTrkKUMOKNo/u2y441ffL20RzFcU4VygdhISIpQ="
	},
	{
		"path": "assets/GuideDialog-o5ws8upl.js",
		"integrity": "sha256-2QjQ2DlS/l60mGbkka7/MT5WYKzs1VZE38YPPRODSvA="
	},
	{
		"path": "assets/GuideFriendsPicker-e05agpt5.js",
		"integrity": "sha256-1FUunAk1G6F/fxUBwPuuQdufUxg+t16G59sy/Azlv5Q="
	},
	{
		"path": "assets/GuideIllustration-ox8r1eop.js",
		"integrity": "sha256-Yle3pC+/UgZ2UJ6zvpREBJhV5RvKqa0wqJ+Ugn9HMI4="
	},
	{
		"path": "assets/GuideL1Header-ntkqljmx.js",
		"integrity": "sha256-/OW8U8vkI3IajnGHnrXoacju+WCOE6Qc1F1JetmLZP0="
	},
	{
		"path": "assets/GuideL2Header-b90pi17a.js",
		"integrity": "sha256-jWxn6ybJujd4EQx62Ex/xWrrBR+VBEKwhjQyM15TgDE="
	},
	{
		"path": "assets/GuideNavToggleContext-e3b2aj32.js",
		"integrity": "sha256-FUElbbpTe2/zHC8bP+p9+gyW0+jy+E9b46tucEbtARE="
	},
	{
		"path": "assets/GuidePageLayout-imh16gdu.js",
		"integrity": "sha256-2x3as9tqTv9iDIAcUQu/B956c0oPx3PsL5YT3aza1J8="
	},
	{
		"path": "assets/GuideSplitActionItem-gtzqvdcg.js",
		"integrity": "sha256-f3ZNZmnedmI/3QnFcDUvLGEt1tecFReDiYHNk69rmJs="
	},
	{
		"path": "assets/HeaderContext-hexqpul9.js",
		"integrity": "sha256-PhFyhiAqXdiVeEgbl5cIQxEq8O4v1LKBXR6TE5uH8xs="
	},
	{
		"path": "assets/HomeRoute-mv7exaq1.js",
		"integrity": "sha256-It4y8sYuxxwOwvzM3F1Pzgm0Cr2GiRa+FSnvXb/nKRk="
	},
	{
		"path": "assets/HorizontalProfileItem-c9hkkgc7.js",
		"integrity": "sha256-FI2uQA04CeWP+iRoXkSqMGffXcjKU+tXn5yMx/Y4bZQ="
	},
	{
		"path": "assets/HorizontalSocialItem-en4pxu2j.js",
		"integrity": "sha256-16fko9Mmoe7S2K3+wPzcMfJDCBXnErIfwgRrU9yUv0w="
	},
	{
		"path": "assets/HorizontalSocialItemLoading-m0axsm2y.js",
		"integrity": "sha256-IjwWNRlcVb3TjtcPWU4XZ8riXZaRU4dd/EmZZF0ijFI="
	},
	{
		"path": "assets/HorizontalSocialItemWithButtons-fc5y7ysi.js",
		"integrity": "sha256-gIzR3WPSAtkqFhKxj4O+ASlToSgSFmU+T64wlyJwYqI="
	},
	{
		"path": "assets/HttpUtils-e2rnpjqi.js",
		"integrity": "sha256-Wwewu5KGnX68xgXvi0GGG+ahB3X90xbjMa0wGv1v88k="
	},
	{
		"path": "assets/IPConnectRoute-2va4oqdv.js",
		"integrity": "sha256-RuCwI+xe0BAleXStrsDPzynVBN85Jyye0lVOcmAIJ9c="
	},
	{
		"path": "assets/IdentitySharingConfirmationDialog-yclavwxk.js",
		"integrity": "sha256-DfNgAgbbTPOmOq5bMEl5G3Vu5tgSA+PH0yv9UjI8dHQ="
	},
	{
		"path": "assets/IdleWarningDialog-kyq5hvv5.js",
		"integrity": "sha256-JT7N3ERzuLrCQJWu3xRrXH5u2B6XOT1OKTJK5HInQ9g="
	},
	{
		"path": "assets/Index-7nrtahhb.js",
		"integrity": "sha256-zQyjgp4CwvJoF4Re8/pqeuNECmnmeixxvnEHpB7LJt0="
	},
	{
		"path": "assets/InfoContainer-n9kk08c5.js",
		"integrity": "sha256-bC30CdIe43v7XYdCrIaMCAvFuNgm2X2iBcXikvUXX5w="
	},
	{
		"path": "assets/InlineTabs-me4z0aef.js",
		"integrity": "sha256-H7nnAx7NTqJ7DT1bvTI/TzNnNDtbdvCiDjTflQDmxOA="
	},
	{
		"path": "assets/InputCheck-mpy0n6ow.js",
		"integrity": "sha256-p57EzPQevwAFe+1myboH7mGzhptw9gWoKaJW0X2WzTg="
	},
	{
		"path": "assets/InputTab-mutq4goa.js",
		"integrity": "sha256-JJcqO5xOZVm+nnsYuxO0MFClAVKJv7EUrY9zpYwTvHI="
	},
	{
		"path": "assets/InsiderPreviewGate-ewd4l5og.js",
		"integrity": "sha256-FVmkWLAFcrl3oL8ZaBS73qjT8hdj+toEQOI6zxS1BzQ="
	},
	{
		"path": "assets/InsiderPreviewGateDialog-dl7r4rj4.js",
		"integrity": "sha256-lrRYnoYzJJHAnOoBA66qQDHOLwnN6ywBphtdaoBt+RU="
	},
	{
		"path": "assets/InsiderPreviewGateLayout-nicr90sw.js",
		"integrity": "sha256-mcniJgJ8P9kt8tzwasXdvEyd2lM7KhtE98crb4npPHc="
	},
	{
		"path": "assets/InstallDialog-mlactrbd.js",
		"integrity": "sha256-DD/V8qkWeC3ohVjmv8zQJFOFUrOgahB5DPT+Z5/ZFOA="
	},
	{
		"path": "assets/InternationalizationPlugin-njwgx1tb.js",
		"integrity": "sha256-u7w4z81xUZE1GsYXqsNSkIylq5IYjaA83NU81sfkLgs="
	},
	{
		"path": "assets/IntraDialogNavigationStorageProvider-i6u7ojtd.js",
		"integrity": "sha256-9fhY42Jpb+qbW568JJfPy4M9XheliAMKUt87cxpMQCk="
	},
	{
		"path": "assets/InviteAndCreatePartyPage-fqznm8us.js",
		"integrity": "sha256-1sMjF4XZ6biizyVEWYMfygjJt1IcgihtTYxgpYz7fmY="
	},
	{
		"path": "assets/InviteToChatPage-hgqkxbwh.js",
		"integrity": "sha256-nh6pVdt10nVlnHm4Xu8zJ5R7e1XjCo5hH6iMO5bTS28="
	},
	{
		"path": "assets/InviteToGamePage-ckh52emq.js",
		"integrity": "sha256-eTGAqrmTmxx44KBwPnaP4r09eOOWgwK3bUP/iIqNanU="
	},
	{
		"path": "assets/InviteToPartyPage-z7b2rkb7.js",
		"integrity": "sha256-1y/aUBVJ0vhpWa4BRXbQ3A/PmGn9ZllPc2rdKKMOp2k="
	},
	{
		"path": "assets/IrisService-dj647e8u.js",
		"integrity": "sha256-jbSRCSWQGfT/N1zbkebYakmrWGER670gAgOQY8wXcB8="
	},
	{
		"path": "assets/JoinGameDialog-cr8yz6g4.js",
		"integrity": "sha256-AH40AnLVS957hYx9p9vPv5LRVzDsiS948Q4stSDurxY="
	},
	{
		"path": "assets/JoinablePartyPreview-b4mfmfjm.js",
		"integrity": "sha256-8herYFA6RwSKZ4cXWmeQsKda6roX6csw2H5+ck41oXU="
	},
	{
		"path": "assets/JumpLandingPage-jnzfwx62.js",
		"integrity": "sha256-JYV+5FTLi0JR1XSWdcQngv16ROtItSekKKg4aKadqvo="
	},
	{
		"path": "assets/KeepPlayingUpsellPage-gkf5g2ph.js",
		"integrity": "sha256-i8T/f83TFU9g3WNKtC9a6QJAVEUr1jdm/t0Ry/EkC/c="
	},
	{
		"path": "assets/LanguagesTab-ipigdlf1.js",
		"integrity": "sha256-Vm2KnAfjKXlowsSPCcd8feyjXdEkjkzjyaEt9aColao="
	},
	{
		"path": "assets/LibraryFilterDialog-khsifo7w.js",
		"integrity": "sha256-v7f54dTowTrT8RK1Na4e8mzEB3gTGgviTuGoECyN+8o="
	},
	{
		"path": "assets/LibraryRoute-ee5log6y.js",
		"integrity": "sha256-8dVnC80VVGrJYXU7VJToJEDpBiszURt22HLFLzwllhA="
	},
	{
		"path": "assets/Link-o0t529u6.js",
		"integrity": "sha256-Lr3aU58ATJEewLQDF4c08y0hfuC85EnYZD4mkDDdgHs="
	},
	{
		"path": "assets/Loading-cr26kvvh.js",
		"integrity": "sha256-QWrPiZWFHWoIiDumcdWj0enY89SKXvauncjQWrz4teQ="
	},
	{
		"path": "assets/LoadingTrackerElement-f7phpj08.js",
		"integrity": "sha256-Y69b8pcqZfWGjUXngJdnrhCNA/M4SCKhxqyofovvplc="
	},
	{
		"path": "assets/LoadingTrackerElementRegistryContext-c4cb07x7.js",
		"integrity": "sha256-H0Pr7rvOilCxI6RaqTzc7VXj+q6eI7YrldmExQ2EOG4="
	},
	{
		"path": "assets/LocationPermission-kane13ev.js",
		"integrity": "sha256-WNO9KDiQox1XE45FHrcgRfjsEs6YAgAWgBB8u34fvn4="
	},
	{
		"path": "assets/Lock-j0ot7tqi.js",
		"integrity": "sha256-eNIbC5CmioNDC4mIx6f05Bt7XrB1+q0Ot5LGK1XQQhc="
	},
	{
		"path": "assets/LockedProfile-glqdqh7c.js",
		"integrity": "sha256-m0lMMbBI9B6jfKXFURzzaQ308uidWMT4dcaRubEvv0Y="
	},
	{
		"path": "assets/MIMHJGAX-z8d5n2fr.js",
		"integrity": "sha256-ydk2fGlmi7Y7MHnAFNxly2+qT2xc4gEeKeZmpzEuysU="
	},
	{
		"path": "assets/ManageBillingAddress-ab1rku3t.css",
		"integrity": "sha256-O5Xc3vM6suW0Jmjb/tap/b1VSAKoXpua79Airjc9UN8="
	},
	{
		"path": "assets/ManageBillingAddress-ghle66c7.js",
		"integrity": "sha256-4Yoi7W1vW1PsNmH9SRlYn/w8U02bgqDtQQwIB6D+3mg="
	},
	{
		"path": "assets/ManageBillingAddress-mkofup6h.js",
		"integrity": "sha256-YnXH/XI9VfqHmUsaobST8QDYilUPyzVFKl4JXlOU2XE="
	},
	{
		"path": "assets/ManageGameStorage-cugggdzw.js",
		"integrity": "sha256-YhiJVroj4i9+x0MK5OB8mVwumRRL7+/QPm9N1HUWQ+E="
	},
	{
		"path": "assets/ManagePaymentInstrument-9mbsmjcg.js",
		"integrity": "sha256-oR5mhn1GCLeyJ4cIvncsLCCsLv2lATh8/ZvBfYBqtXI="
	},
	{
		"path": "assets/ManagePaymentInstrument-iqm8tqq7.js",
		"integrity": "sha256-bhFLHNBV647LRO6tytPEp1rcsy8eLv1RYezu9aFOE0Y="
	},
	{
		"path": "assets/ManagePaymentInstrument-p402pnte.css",
		"integrity": "sha256-BUHXGtuEHVP6DI2bs9DAbuYj3mYYZ3wjVIpWEdxJ3lo="
	},
	{
		"path": "assets/ManageSavesMenu-kb1uh024.js",
		"integrity": "sha256-iUv/EB+arralknbjcYA/BV/NxiVP1ezwbGdTnhg1c50="
	},
	{
		"path": "assets/ManifestRoute-nnl9idbs.js",
		"integrity": "sha256-6hG71+XZEmgvgYqfulCfj9jKwP+g8t3Bm895f979EtU="
	},
	{
		"path": "assets/MeControlDialog-ilc0gnuw.js",
		"integrity": "sha256-gjt/HOKpvnK/BrvO3BTE/gAxt+gABQUS8NS5vyBqGgc="
	},
	{
		"path": "assets/MessageList-gtd1sl1l.js",
		"integrity": "sha256-t3BdCWtws2EdKU0W6+T7CojkDYRu5Mf0s2GlZxoMi28="
	},
	{
		"path": "assets/MicErrorMessage-h1bkymt3.js",
		"integrity": "sha256-nozShMnM7ggiqS/6cEvskcScxD8dDFVpQjyz15d0o18="
	},
	{
		"path": "assets/MinimalLayoutBase-fqht8avd.js",
		"integrity": "sha256-/lT6edWa8V3rc+LdR8kbu1dOudNidpHy6LcZ3PDAnAw="
	},
	{
		"path": "assets/MinimalLayoutWithBackground-fhrqreh5.js",
		"integrity": "sha256-dogsMQevszGJDxx5mjNUjBPG6u3Z+TsuUL54uy5rfMU="
	},
	{
		"path": "assets/MinimalLayoutWithoutBackground-o6rsdhpm.js",
		"integrity": "sha256-alMfbTh0IjV/xXXIfG4OxV/HUe5qnwYllV6KzfGuDGs="
	},
	{
		"path": "assets/MissingImage-7i9oj7fj.js",
		"integrity": "sha256-KNh+xOsf0D4for2MxkDh9OK8XZzMmCGmxQ0yQtEzSVk="
	},
	{
		"path": "assets/MyProfileHeader-ba7o7ua0.js",
		"integrity": "sha256-cQfj3dSt8rgt1mdzCsc8p/y1jlFQWgZzq3MzU05R0eg="
	},
	{
		"path": "assets/NOTICE.txt",
		"integrity": "sha256-DO0ObOkZxBm4NlSMdb7h2XJr1Aeqfm4DKWL9w00hXcU="
	},
	{
		"path": "assets/NarrowPurchaseShell-lkyxvfta.js",
		"integrity": "sha256-eo3SRJJcze/EpIck2Adj1nA62ydwBZHjPZa3cTwix74="
	},
	{
		"path": "assets/NavIconButton-keqowef0.js",
		"integrity": "sha256-U6amAvp1SvC8eJdvf0OU0b/rNtCwV5WpB0GRtQyKJfY="
	},
	{
		"path": "assets/NetworkInfoPermissionRoute-m3snobgl.js",
		"integrity": "sha256-xBDi2RIO0qgbIcq6mjCHnLJ7qtY5QdRXL89ywVdhI8o="
	},
	{
		"path": "assets/NodeWrappers-d8d7hboq.js",
		"integrity": "sha256-GkCg6Bjt6cUJ+GD2kFpEoR08RwIAH/sPAn7LNoiuHY0="
	},
	{
		"path": "assets/NotFoundRoute-pbmb1lus.js",
		"integrity": "sha256-Y28y0DV5jBkz0eZwdOm1V8Hj7sa6GwRZBwPvdBR0Z68="
	},
	{
		"path": "assets/NoticesRoute-yvasnjmn.js",
		"integrity": "sha256-rLL1/9/8xFsAa3hlhGsGbrLV/OyRgg/sz3FKjt+DntI="
	},
	{
		"path": "assets/NotificationBell-kadp2ri2.js",
		"integrity": "sha256-K0ze++CwabSZ3FMWPKnP6LVh7a5kiebE2Muc25tuj9k="
	},
	{
		"path": "assets/NotificationsPage-doh3y8c4.js",
		"integrity": "sha256-58wHIpzIjZ38RwrwJThJrNCOMKnYWYEj7DcYTxgljOI="
	},
	{
		"path": "assets/NotificationsTab-nmealo6t.js",
		"integrity": "sha256-uagwydt7p3qinXSfQbAxTK4KSQzOE6OD828ryZLFP3c="
	},
	{
		"path": "assets/NumberedList-fndikzs6.js",
		"integrity": "sha256-HTZKjcLx2Rupt/Ityb2NM3/iCjrVVt51YpKkvvdloI4="
	},
	{
		"path": "assets/OfferingBrowserRoute-hz06r1kl.js",
		"integrity": "sha256-H3Mm3FoPO97Ry46g/7B50Du47WSYIM9A2FElNfvGXEM="
	},
	{
		"path": "assets/OfferingEnrollment-chb51wb7.js",
		"integrity": "sha256-g+UZBzr9lQju612IynKydKqX8T4xIPQ3P6srb66Icp4="
	},
	{
		"path": "assets/OffersAndCreditsDialog-gjv9ynhs.js",
		"integrity": "sha256-aW1hdSA9Lrwy7TKWmQTOMSDUwnh1FKcJ0cUgJUkWIp4="
	},
	{
		"path": "assets/OffersAndCreditsHost-jfnu7rfh.js",
		"integrity": "sha256-WY45shLtbu8PMlgqn3PWwAAhJ28GAWI499iGdfqDh9c="
	},
	{
		"path": "assets/OffersAndCreditsRoute-phfzlzmi.js",
		"integrity": "sha256-Jk9M0SRkDc7UcIIx47ejnVaoiBViErCr89JKQdbVukw="
	},
	{
		"path": "assets/OnboardingRoute-g78clrt9.js",
		"integrity": "sha256-Xecbcp2sg6NFQPj/pXYV4x0YTCx7hLoMntSI8VDhypU="
	},
	{
		"path": "assets/OpenDialogLayout-k2pi5w47.js",
		"integrity": "sha256-VdunPPO2leOuM/S6HHd0638mhFqzFSLgg2Pt9QZU9pI="
	},
	{
		"path": "assets/PageMetadataError-isg9ggom.js",
		"integrity": "sha256-sONPBEGYxe+fkrz7rKuL5N3XmddLtNg0h93BL1TeAWE="
	},
	{
		"path": "assets/PairError-lygdps24.js",
		"integrity": "sha256-YyFZanjwuB47zJyF+0bndQWiCSgNSoxuklUPmO+PpuE="
	},
	{
		"path": "assets/PairScreen-bmbfzsa6.js",
		"integrity": "sha256-ZeArVGc1cn0qSUirGHrLRw+cTVcF+Ul+OvUf1N76Lak="
	},
	{
		"path": "assets/PairingHome-gvm1tyfb.js",
		"integrity": "sha256-0WcpnqFBBMBckq50ZNz3GJad+W5Z/AQsE90y1G4JTqw="
	},
	{
		"path": "assets/PartyBlockedDialog-jqn89iek.js",
		"integrity": "sha256-3EXRlV/UTCiclZdLdvcYhKb1KdkFV7JT/e0dlsvsVLI="
	},
	{
		"path": "assets/PartyChatUnavailablePage-i101u6cz.js",
		"integrity": "sha256-kFzkavHhDDHGEuUdNAxXsKC+Y9rHuvRhwx1oJKfVpPU="
	},
	{
		"path": "assets/PartyInviteCard-ir1jdsvh.js",
		"integrity": "sha256-YNGQGe9OG9+yZL/r/VFc/Rtc43/cm1sW5gJ5iJrvm38="
	},
	{
		"path": "assets/PartyInvitePreviewPage-ddo7yn90.js",
		"integrity": "sha256-cOelpZjfLPBfp3pXIyZZANjl2KyI/OyA7RAdoFWbU10="
	},
	{
		"path": "assets/PartyJoinPreviewPage-kzqm9p26.js",
		"integrity": "sha256-M4xTM7sTJtdWF5kn4wBjFXAEfsmyHFjDPiHLYMcEBLs="
	},
	{
		"path": "assets/PartyJoinability-iq42e9ph.js",
		"integrity": "sha256-5DbcEsT1AeYCemkdpkB7OrkhMzllxlzoEnKYmL9UnNk="
	},
	{
		"path": "assets/PaymentInstrumentShell-b1pcior5.js",
		"integrity": "sha256-wzfwD9giekpeGQSn1JC70YYOnASjXSwkSwMOjP8cGBI="
	},
	{
		"path": "assets/PendingFriendRequestType-kfaj8vup.js",
		"integrity": "sha256-eh0xHVYtYffjYXar8QTYt2mnzvnh+iaJeXB2cK6Jsj0="
	},
	{
		"path": "assets/PendingPlayRequest-jyefxrdt.js",
		"integrity": "sha256-+GQNFzLNWNXsO6adf+WimQ4COwkzqFfCW/i3ydRUItM="
	},
	{
		"path": "assets/PeopleLandingPage-ctl3tvg7.js",
		"integrity": "sha256-NIC/25/9xrpdFXIJv2IpaSgwZGBOgJOl7XmkaQBhbFI="
	},
	{
		"path": "assets/PeoplePickerList-0mvaxs16.js",
		"integrity": "sha256-PFDlBbD6SIsoCmZgx05g14xjI2NjmSDNOsXN5GMGy7o="
	},
	{
		"path": "assets/PeopleSearchBar-d1km1sgg.js",
		"integrity": "sha256-OLy41h9VVPsY+7CG/SoaCYteUxoZkQq+Peb56YjIkeI="
	},
	{
		"path": "assets/PeopleSearchView-jauqk0rk.js",
		"integrity": "sha256-UNwZXo5oGIFXOBEBSXFo/BjeralGPKvdFrrYdsbwHn8="
	},
	{
		"path": "assets/PerfTestGameTilesRoute-fisr5xqt.js",
		"integrity": "sha256-3X8x9+jhASosKn8BY7pgRDspnke+ZUSEQ4HyTmN+XmE="
	},
	{
		"path": "assets/PerfTestRoute-hw40oezm.js",
		"integrity": "sha256-OQv/5WOpKwCDGtpt1nSwwC5clPqp1FHkOBlz0M02SRM="
	},
	{
		"path": "assets/PerformanceMeasurementLayout-n95quzkq.js",
		"integrity": "sha256-rr7icqhv+eOIbwLoXhdmKcplUDbmCVpIEf+VGx5C3r4="
	},
	{
		"path": "assets/PersonCard-n3z49202.js",
		"integrity": "sha256-8txMt5QZ94wzSnXtCvQyzLXyOxDAwJuHdGNjpG8qCmo="
	},
	{
		"path": "assets/PlayFabService-ivettrq7.js",
		"integrity": "sha256-o0bmu8RSAUWNygl5ZH3L78DX/kDAaCGG7b4M+/FNqDs="
	},
	{
		"path": "assets/PlayService-j85yb43u.js",
		"integrity": "sha256-6MurYndb1wgPRKp2Zd73L0NJMJzwHYFgoaBjSMLKA5E="
	},
	{
		"path": "assets/PlayVideo-lh0dx3mv.js",
		"integrity": "sha256-kQ2I3n71G5InNPQELvSnj0vlAI3FADaPDcSepi+sRW0="
	},
	{
		"path": "assets/PlayableOnCapabilitiesDialog-lo0xnyb5.js",
		"integrity": "sha256-/S6foGS586ujTvO8ux4Faj+AW6SMy09C9v3O+lGVSoE="
	},
	{
		"path": "assets/PointerHandSolid-bphwg8iy.svg",
		"integrity": "sha256-LBLFwQJrNYv97LkK3yon/QcKjkBX8ZlWIlBMwgZdnyk="
	},
	{
		"path": "assets/PostStreamUpsell-bhkh2447.js",
		"integrity": "sha256-KY9oICYbbycFeebh0rBYpOWuTd1LQsTlCGL4cM7ZH3o="
	},
	{
		"path": "assets/PreloadCommerceRoute-h4vn6oc2.js",
		"integrity": "sha256-ALvRD7Jyd36XcXWB9zxM8aew8tF+hR9Y9G0v8ae6TtY="
	},
	{
		"path": "assets/PremiumGradient-fnp3xu9x.js",
		"integrity": "sha256-H21pn2BLhD9nF8u7Zr3A3+ZpCpc+w8iqjooglmBsYzA="
	},
	{
		"path": "assets/PreviewHeader-oeio7w32.js",
		"integrity": "sha256-k5GhYg4tDLVkSQ4eWm3QB3fYYhKfBn91Y4J1kB2aSEo="
	},
	{
		"path": "assets/PrimaryButton-cd7tn4bn.js",
		"integrity": "sha256-dj9nuJJ0LjnpQ48hRiKoLclFqtuF/mi1GUfbaNbbmmQ="
	},
	{
		"path": "assets/ProductDetailRoute-db804vts.js",
		"integrity": "sha256-E84PwNpQnrxSRGo/Xw63LKMFl77FUoEwev88VJwdKNg="
	},
	{
		"path": "assets/ProductPrice-eu0ej2f0.js",
		"integrity": "sha256-EuuDn5w6VA9PPZ5JMFlEnVFxh5ze/oDrRuz3aYUHrt4="
	},
	{
		"path": "assets/ProfileCard-h3130h19.js",
		"integrity": "sha256-mlCccj+24Ke1Dz720UTxzaKhbNmoH8qUgzY6rqVdsBY="
	},
	{
		"path": "assets/ProfileCardLoading-nyvatzlc.js",
		"integrity": "sha256-soC37qUv5yA3hRjVdDGDGy9y5wMKqx/OKqtXhAbCPPI="
	},
	{
		"path": "assets/ProfileLandingPage-6tsprdod.js",
		"integrity": "sha256-sIDDwCr7ZpYRxpEOxOFrrSSWqBuxVhlD9v0H0PVhX6s="
	},
	{
		"path": "assets/ProfileOnboardingDialog-bbmj33lk.js",
		"integrity": "sha256-f1WfKRaTT3DrFfF20cYKwSTmw4vPH/sRP8DWfSDgjiI="
	},
	{
		"path": "assets/ProviderFilterTags-k8jlp1lg.js",
		"integrity": "sha256-l6JGF+/eOSCeOk9O4ovzIWADB54y0uqfZeoGGVQCWIU="
	},
	{
		"path": "assets/PurchaseDialog-j2cqanoh.js",
		"integrity": "sha256-o4CAZiSNuEE19HzgDvcIbiBXLdlKhVJOM7XFMTwlwZo="
	},
	{
		"path": "assets/PurchaseHost-neaf6sjk.js",
		"integrity": "sha256-lxmRxetip1e3HvqAQN7BvxxZDgEFlNZFgUmvHlEHT6w="
	},
	{
		"path": "assets/PurchaseNotAvailableDialog-nfgbuy5a.js",
		"integrity": "sha256-mYeS1NbX5qiuhtLhU3puwBjM2dUwqUT7vF2/jMjn1Ng="
	},
	{
		"path": "assets/PurchasePage-mhi88hre.js",
		"integrity": "sha256-OMGOIMmwvmapHgFFsVm55Srm2yvZJBaimQ/aIr5GgPQ="
	},
	{
		"path": "assets/PurchaseRoute-fdd72xi4.js",
		"integrity": "sha256-a3uAfjTuUqsws1LKNcoFFGE82Hkztntg+gJgA/v7Lqg="
	},
	{
		"path": "assets/PurchaseShell-bdt26dfl.js",
		"integrity": "sha256-DsdSqL1LDmUYxLFwQGyLVP2WgJfhCRLFm0uHpi4rp4E="
	},
	{
		"path": "assets/Purchased-cp3tw2n8.js",
		"integrity": "sha256-xTV9iO7uaOp2OktjxkjwfX2/B5bm0uwnaPuzJriq1Ns="
	},
	{
		"path": "assets/PureInStreamConfirmationDialog-ivf23uic.js",
		"integrity": "sha256-lJVQKvQ0Yh/2szUGXUXa8W6vzYCCLjf/Z+e2EgOlZ48="
	},
	{
		"path": "assets/PureInStreamConfirmationDialog.styles-f9kkr64u.js",
		"integrity": "sha256-5m20WVsaaRqtMn2XOUYkVuMCVtXDVPMJ7eskv/V8g9M="
	},
	{
		"path": "assets/PwaPromptDialog-bbgybcuq.js",
		"integrity": "sha256-Fvct2RrnVkrYGo1Sakp9t5ZW8eYcUsD+AKJTnxO831g="
	},
	{
		"path": "assets/Q7LWSL4U-jq4gk87j.js",
		"integrity": "sha256-b/19NbHWhxw4wLbSYEbHwH9NKwo/pnazLbPLMq1vVyE="
	},
	{
		"path": "assets/QRCodeDialog-m75ie96t.js",
		"integrity": "sha256-adFSC6TBtFjOfqxtrAN+5Y7qSaV7fT4/nZSqBJs4CGw="
	},
	{
		"path": "assets/RareIntro-idpjko0s.mp3",
		"integrity": "sha256-8tWW90/ayXAd9mJ9FPQzeXtT7u02u8rCA0g6QMIxIAI="
	},
	{
		"path": "assets/RareOutro-d4vjsgx4.mp3",
		"integrity": "sha256-ajffp451jAr20MbiwbuALWAUk1xhXKA4jlnpjtPSWwc="
	},
	{
		"path": "assets/RecentAchievementsPage-cjgmvs3b.js",
		"integrity": "sha256-/Le8nKwR+8cd9jvkHXrWR48Bg2bUM3cpgoXzI6vOxYM="
	},
	{
		"path": "assets/RecentFollowersPage-oz4mwrfw.js",
		"integrity": "sha256-rPBJf2jGvkoL2TOjb2U6YIRRysgLjrC+DdU2+HtVIHg="
	},
	{
		"path": "assets/RecentFriendsPage-mn61ytf2.js",
		"integrity": "sha256-/goEr+kJC2rLQ4DEsQ4zuaeY3gug9wpgDmhK0DGlFAY="
	},
	{
		"path": "assets/RecentUsersList-cgakj8qv.js",
		"integrity": "sha256-yD3e4WdjStfr8uGv5tIlpSSDJZMkTtd3dGkdmkhnKnk="
	},
	{
		"path": "assets/RecentlyPlayedWith-kwvzcd00.js",
		"integrity": "sha256-wqsUd4M2OyqlUo5bFPuHdL57zwaxCob9mexMengZ87o="
	},
	{
		"path": "assets/RecentsPage-j3s2hvs8.js",
		"integrity": "sha256-ijhOcniQLOQ3sPOYyga11QeYJyDUFa36S1su8WbCHoE="
	},
	{
		"path": "assets/ReconnectDialog-boozkn57.js",
		"integrity": "sha256-et/vzR/TB+dMZwhs+BEE3PvX6tGnqH9BNFbkIt7/5Sc="
	},
	{
		"path": "assets/RedeemDialog-d5s805x9.js",
		"integrity": "sha256-BbL3951PFVbQlziJl/DhM8ikScHnlgl2Q4Q8p5I/XU8="
	},
	{
		"path": "assets/RedeemGiftCardConfirmation-icsq6ohg.js",
		"integrity": "sha256-JqG1AIoU7QLGt6NLBzCjEZ/d7oczBMWn9ILvQmnYYTA="
	},
	{
		"path": "assets/RedeemHost-jvewtwjr.js",
		"integrity": "sha256-zV5FqieTFl38gL2WTeR+gbxyjhX+uJ54XN53dexRotU="
	},
	{
		"path": "assets/RedeemRoute-y22b81uv.js",
		"integrity": "sha256-/W7zLJBNxWKeifNFLOthaHQDj3fNG7ni2q6Y75/ag5w="
	},
	{
		"path": "assets/RelationshipTag-kk3o3td7.js",
		"integrity": "sha256-3DCfCdrKp1hoTlTRN44aABib+jL0GarP91OKvgSrtoM="
	},
	{
		"path": "assets/RemainingTimeIcon-kcjp6ylx.js",
		"integrity": "sha256-KCStJGH3safdoLN06ji4OMlZ3dNgSpMQvu4ZDALhn+Q="
	},
	{
		"path": "assets/RemotePlay-lgtmoxyz.js",
		"integrity": "sha256-moU8CtkbcttLfHEUeD2jmOM1oA/Q+Gw17oAQnvVV2ig="
	},
	{
		"path": "assets/RemotePlayGateLayout-ok3cjx5c.js",
		"integrity": "sha256-09D6nUPQg37Mlm9KDJ0V2JT5NZaGAT4cbZdyG/yu/ZI="
	},
	{
		"path": "assets/RemotePlayRoute-idi5p92i.js",
		"integrity": "sha256-fggqCQX/1mR0it20PWAkmfMyVj2uLHnLV5gDzFTw0y8="
	},
	{
		"path": "assets/RemotePlayStreamRoute-glp2sj9f.js",
		"integrity": "sha256-pdRX1Fq/+zlhm2DYoJk2X8GzBFSGvXrnVIhJCNjrt9o="
	},
	{
		"path": "assets/RemotePlayWarningDialog-bg87zd8a.js",
		"integrity": "sha256-z/YJU8O+NRzULhuBvI+AievG788XNIRysOhl8hA6oC4="
	},
	{
		"path": "assets/RemotedPeoplePickerPage-iwuqdeaz.js",
		"integrity": "sha256-YK+s8SEJbtbObd21fsp/Zz2qfh8f006DIbA81pUd4BM="
	},
	{
		"path": "assets/RenewIntoDialog-eptr6313.js",
		"integrity": "sha256-B8kbrRnyQSTjdKmTFE8zvt2ZKMogTBk9ITUPNFXmP7s="
	},
	{
		"path": "assets/RenewIntoHost-jmp0eyac.js",
		"integrity": "sha256-+uIz0R4tMbxQqXZkIxkhGLKOpdlGIKJnBh5KLFbH5HM="
	},
	{
		"path": "assets/RenewIntoPage-n62dmdaa.js",
		"integrity": "sha256-qAEfbWRvUBLwHQVn3mD0vJh5uUvPTnzbcAZvOnpTnSY="
	},
	{
		"path": "assets/RenewIntoRoute-d0ymnj7y.js",
		"integrity": "sha256-rPe+E5XojPz2UhwTCWU4ijaTgXSPoul5kjMJIqah++8="
	},
	{
		"path": "assets/ReportDialog-j60xljrs.js",
		"integrity": "sha256-1wTYn+/EfWx6GUruMHkNxlGxT9PyFrMhzU0/wk1pViY="
	},
	{
		"path": "assets/ReportProductDialog-ejbcedv8.js",
		"integrity": "sha256-cE8EyTHsF5hw/wHk0ZAqVhK/he3YGflSsx/TIsCVJos="
	},
	{
		"path": "assets/RequireUserGestureDialog-frd21p6x.js",
		"integrity": "sha256-rIGaLQRiW+XkZonO2Pr0BZvNkJFaZJ/bsSfjwaQb3Uo="
	},
	{
		"path": "assets/ResizingSlider-he07pe6m.js",
		"integrity": "sha256-5dvAPPNJkW5fD8J9HlyZjwv9Y+tPLBTH8sHTQC7j/FQ="
	},
	{
		"path": "assets/ReturnButton-ma4yihqe.js",
		"integrity": "sha256-1+ctqmC0TxeUGDQwoOBaXHvAvvBzu9dZCQH7OqvqM0U="
	},
	{
		"path": "assets/RiskChallenge-iams0vj4.js",
		"integrity": "sha256-FcZYWGnnz2FsQFGuEuq5ZaEb9jt+MD/BwsJk9HwtGw4="
	},
	{
		"path": "assets/RiskChallenge-lharsyh0.js",
		"integrity": "sha256-ZSelRtwXoSzPmRcRQg+vsXnobuG6wvi7MhZF78KLxTU="
	},
	{
		"path": "assets/RowLoading-2vx5tw6k.js",
		"integrity": "sha256-s3xaxcdHJiUDM7vp+J21GlBXehvcl4aLqxTZssmHiIM="
	},
	{
		"path": "assets/RuntimeDevToolsProvider.devtool-l4a3logl.js",
		"integrity": "sha256-v3tcU/W2BaHyMfyCh9R4qd0yD1Ty0YxQmwa/YSo2x2A="
	},
	{
		"path": "assets/SafetyAndPrivacyTab-gfhbqbsn.js",
		"integrity": "sha256-u9ge/xa3lbTNkFTl+FcpUg5DNya0TdzMDtKZAAOxNyk="
	},
	{
		"path": "assets/SearchRoute-hrbayyg0.js",
		"integrity": "sha256-3cOFbTKa9jvXyk0T0FpVhnQ39elyuzaighfxS25lxqw="
	},
	{
		"path": "assets/SecondaryButton-honvur9l.js",
		"integrity": "sha256-aKrjBCMElR9piMglwloY/bzaV620h/Qg9McnD5nfSoA="
	},
	{
		"path": "assets/Section-kt29ebn0.js",
		"integrity": "sha256-kc34AWp/YCRaF74D83DSDqmEhPHJMbQY5MnFEbjqYxo="
	},
	{
		"path": "assets/Segoe-Sans-Variable-2-021-jokom3al.woff2",
		"integrity": "sha256-PERwuNnV2eLnCTGEyn/eRGamJsoPuONMzL1fQ4Go0JE="
	},
	{
		"path": "assets/SentryAdapter.client-w6f6t70e.js",
		"integrity": "sha256-x5+JajGER9guwpHLpZOvLwC0I6bq1vEJQbnpSlYPFDg="
	},
	{
		"path": "assets/ServerAllocationPollingConfiguration-ckgvfiix.js",
		"integrity": "sha256-i1uO519U9m8b9YQn62tSCqRfbJ2HCZSSTwwQP5rPD6s="
	},
	{
		"path": "assets/ServerInfo-ifpzd3cf.js",
		"integrity": "sha256-gA5Lw/z4RF5N+dwjFZofH4OOpyeEmjwf+qPYPiaKbA4="
	},
	{
		"path": "assets/Settings-b4iqv6g9.js",
		"integrity": "sha256-rIftk+/tvGlxJBxpTdI+hXXvazBWFbq7xwpirxrff98="
	},
	{
		"path": "assets/SettingsContextProvider-hwno1vg7.js",
		"integrity": "sha256-+Q75sBOl4S/VohstSrd5+xZvGhCIvdg7Mtiuf9ITqzU="
	},
	{
		"path": "assets/SettingsDialog-c64wkoqt.js",
		"integrity": "sha256-AORekBhecEBW8HxQaqisRNe1HuPxlGyM0VeHCqgY60Y="
	},
	{
		"path": "assets/ShareALinkPage-dujnzfb3.js",
		"integrity": "sha256-MmDSQfNXK4FYx2+yhR6FjGgo5oC6eDMDx6FVdD7jaBw="
	},
	{
		"path": "assets/ShellLayout-ef5gh6cu.js",
		"integrity": "sha256-xjledhi8AxqParU6hm9j6Z6IuO+2I0aNlBYIJrASzbo="
	},
	{
		"path": "assets/ShellUIContext-mh617n44.js",
		"integrity": "sha256-GPz75AG4PZTZ8magZheyg9G0OvcrTepHAtOXQRlLh7E="
	},
	{
		"path": "assets/ShowApplicationDialog-it3zwzr7.js",
		"integrity": "sha256-z4p8mdaqAbKbTZC19n+utyHaAvhuBQyKFQXmxyl2aTw="
	},
	{
		"path": "assets/SiglGameChannel-njt3uruk.js",
		"integrity": "sha256-6l0bXieMUaK0KGwoR26U/5xj6P2Ip9MqIOpwSJXSVQM="
	},
	{
		"path": "assets/SignIn-nq0c2aew.js",
		"integrity": "sha256-1XcAHAGxlwHhIg9C5YitKPz6ZPBoU38PhV6Fjf8cGJw="
	},
	{
		"path": "assets/SignInRequiredDialog-nh83wvoc.js",
		"integrity": "sha256-gGNr9aZvvTczGwEjbX/vZSuVWDFtCXYhCH0OZX1A7DE="
	},
	{
		"path": "assets/SkipOver-glmwwlua.js",
		"integrity": "sha256-2w19UPgZvxx1Oz+olBbVejjhar+qO0Fmu93FOchYygY="
	},
	{
		"path": "assets/SocialCards.constants-fcylm6as.js",
		"integrity": "sha256-aPoscb1erRHRikgwudX2Nk0rgO07qdprQVYr7XAzpMc="
	},
	{
		"path": "assets/Spinner-mrd5j1i8.js",
		"integrity": "sha256-KDuJnAUaPHCv0w7D0PteNoE7014TOgTDlRGEqPqseYI="
	},
	{
		"path": "assets/StackedGamerpic-niip4yd3.js",
		"integrity": "sha256-/s1UUAVsv48Nsea5KcO8qumhJYICzI8YJGb3hFuc6Es="
	},
	{
		"path": "assets/Standard-lv501k87.mp3",
		"integrity": "sha256-42R5YWxdVz0KiBBBJZ3N1NJWpf+rwFEnnMuPS/8jJak="
	},
	{
		"path": "assets/StorageTesterRoute-fotaeri4.js",
		"integrity": "sha256-3Rx/9LKMcyN1fMS2d2m14O5g9dpS1Gq8CHBwRyhLXcE="
	},
	{
		"path": "assets/StreamClient-c8feo6q3.js",
		"integrity": "sha256-GIy3S1t5/H/WzRpb33DJrZt5DPb2/7HVK5yQE0+d/A8="
	},
	{
		"path": "assets/StreamGateDialog-itolngd5.js",
		"integrity": "sha256-8OWjgiRgoHSF8n3CGbJa2f8FvNYlPghcCBjABiJjbbE="
	},
	{
		"path": "assets/StreamIsReadyDialog-mbdrfduf.js",
		"integrity": "sha256-/1z87lIK7z965QCfRg+v8QFGYVLLvBnI9Brt7Hr2MEs="
	},
	{
		"path": "assets/StreamLogger-e6yhbc3w.js",
		"integrity": "sha256-7B+my8xpr0qX380Jfl2NP637rOreUeL4IPLyN0k2u2Q="
	},
	{
		"path": "assets/StreamingTab-hubh0t93.js",
		"integrity": "sha256-WWy+oCTNhKqu5WskKY0/+AiY25vjXQjZZaATxuHN7LM="
	},
	{
		"path": "assets/StyledBaseListItem-kp6wdn5e.js",
		"integrity": "sha256-dfqnrWefQFE0Flefl2ia161p0j4iV/cvqfOfUZNz5+4="
	},
	{
		"path": "assets/StyledListItem-gwb4xn23.js",
		"integrity": "sha256-mbW+eeS5OzRymFNW0uNdYBZpdlyh1j6YZaSiM0sBn3Q="
	},
	{
		"path": "assets/Styles-pe7l89m3.js",
		"integrity": "sha256-YrsplyJNzRDQE0XyL4UBy7mdgNJICxX+l7ahthyblwc="
	},
	{
		"path": "assets/SubscriptionPlanPickerDialog-j64ry06t.js",
		"integrity": "sha256-wKZObdGyDrv/1zun52SfqBwfbdesvJgh0SM/OtBqrkw="
	},
	{
		"path": "assets/SubscriptionUpgrade-pd3fzjhq.js",
		"integrity": "sha256-0PtAYMeoAgYvZGGTDQFIUilh0prqxpUl0kSyA4AYTYU="
	},
	{
		"path": "assets/SuccessfulChangeGamertag-dtn1t9xy.js",
		"integrity": "sha256-8F3EFTXdmKEp+cTqO2iuUe+miFmSgIRi0UwWNWnxp20="
	},
	{
		"path": "assets/SupportedLanguagesDialog-jxxk0swg.js",
		"integrity": "sha256-iIz1j9FQxWet/v8Wzw7OJ8l9N7dYoYIYI+A8n+jaMxQ="
	},
	{
		"path": "assets/Switch-7x9agj32.js",
		"integrity": "sha256-GiA4SEOJjRncSlxD9h57FHwHYvdCoR/ta9JJBv7Yi+w="
	},
	{
		"path": "assets/SystemRequirementsDialog-lsjpbjrw.js",
		"integrity": "sha256-WR8WAqI1GmrVOzQlD3+xisNJSxhm+Q9lwEzEHZVNGv4="
	},
	{
		"path": "assets/SystemUiMessageDialog-bk570tnz.js",
		"integrity": "sha256-ooGK4TC5Za/lrtbYa7QcRRTSgKUxOlQVwsYT/GkjEd0="
	},
	{
		"path": "assets/SystemUiVirtualKeyboardDialog-nrwpkwev.js",
		"integrity": "sha256-pZdHEyOTraZje88qjYHvjXMT7FepKvLJnkPa7KNCrF0="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@1.0x-j8mnprwb.js",
		"integrity": "sha256-Ncv7sf7iaV8ZUG721otcbCBpKxDMJO97YYOWrDNRujM="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@1.5x-kk0ag0s3.js",
		"integrity": "sha256-PBXNpu9+V8JY9RKBqj5kD3wfYFwzcr4GdILswajFJkU="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@2.0x-k9gtjs6n.js",
		"integrity": "sha256-w+4zGmM7yPfHCcRcB2LkpFOrgtvtxv4O8hjJ0+xbB18="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@3.0x-jvnyonv3.js",
		"integrity": "sha256-craGSX/OIiYOEqNMXxADpZHwyvtEaJJnHBYoau/BHkM="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@4.0x-l2ocn889.js",
		"integrity": "sha256-yAhAvC6aKMCYpUAz5uxB6l88g2MtEabECKFuFtcySj4="
	},
	{
		"path": "assets/TabContentLayout-ltqqpnab.js",
		"integrity": "sha256-sSjN1vq7SUDrZTvCf654KNVhy9AXGR/Uikx0KThm6Uk="
	},
	{
		"path": "assets/TagListDialog-n1uh95vn.js",
		"integrity": "sha256-io2E9GE0SUySjsmMDOD2/0IT8CPM6lncYPIIXu2UlBk="
	},
	{
		"path": "assets/TakEditErgoDialog-ojbxlo4z.js",
		"integrity": "sha256-jLg9T+4T/a4VfZTQJTRoBlOUN5Scd6D7hm1qMsn3V3Y="
	},
	{
		"path": "assets/TakSideloadManager-kwhvxhyi.js",
		"integrity": "sha256-5s9lpjPLYe8xbnP0lj9gXGggZrgAuqQLNCu/KLGsbNM="
	},
	{
		"path": "assets/TakTooSmallDialog-fhsq1b4p.js",
		"integrity": "sha256-8qg3cU2rITOxKblfm0x3fDG9wQ+RHXQ58D462cnFtEg="
	},
	{
		"path": "assets/ThemeSelectionButton-nc4xa16b.js",
		"integrity": "sha256-2b7jjBfB4kQ+r2kKW67uPh0vGiQ9s+K7eOFXM69giS4="
	},
	{
		"path": "assets/ThirdPartyGameTile-mzymclxi.js",
		"integrity": "sha256-cOOmDqAS0Mcg0paUQTxly/PgWgSxqOaipmEqC6nVK7s="
	},
	{
		"path": "assets/ThirdPartyGridItems-bnnwwz53.js",
		"integrity": "sha256-G3+91y2KJwJFQL0x27Ar8Yf/1qgXi1i0KvAd54orgvw="
	},
	{
		"path": "assets/ThirdPartyRecentTile-emoc396k.js",
		"integrity": "sha256-jrBMjL8zAv4KJvFOWbFilhGjAzTKr00MjWmMtv6qkmU="
	},
	{
		"path": "assets/TitleActivationDialog-o5sdzkbm.js",
		"integrity": "sha256-u0HyGxm2K9kLPZQv+gJI+jAy0vB/C7wyNkEpCpvD1uU="
	},
	{
		"path": "assets/TrialTimeManager-nhccbffk.js",
		"integrity": "sha256-xZpdFfXrV2XDV0PPPtRURewpx09pCq2JF7VnkQS+6SQ="
	},
	{
		"path": "assets/TrialsEndedDialog-i0aood68.js",
		"integrity": "sha256-SOTlAyjt6hfSiGmVC/OL1xFDPnxB4X8wlf8pFPM05Lc="
	},
	{
		"path": "assets/TrialsEndedDialog.types-n8gsn59q.js",
		"integrity": "sha256-f7YU+8jhczW1prasgQeMHA4JCputmAiaM2WZg+SDEbw="
	},
	{
		"path": "assets/Trophy-i123zm1k.js",
		"integrity": "sha256-3hW3G4sKJgaps91iKcsdegtc/yY2uPlgZzgQeYkoBM8="
	},
	{
		"path": "assets/TurnPhone-e4c9wttb.js",
		"integrity": "sha256-eVM2Pm4RqGCnD97ePMynC20+O8V/9/KJM1EDglmsMqw="
	},
	{
		"path": "assets/URI-ittm5tyy.js",
		"integrity": "sha256-zJN2M2re2gO1NqJkba8shj1UyzIFm3+1jDIgGu3ECwg="
	},
	{
		"path": "assets/UltimateGradient-iu5r0wlr.js",
		"integrity": "sha256-8Oq3PH+R1RYIPKoV2xYke1Xak5eEoft7K3jghDa3vZA="
	},
	{
		"path": "assets/Unauthenticated-dbafsqpz.js",
		"integrity": "sha256-TdDbzSK3LrYdogaK6K64nARBznIMsKMBRbpZdXH6tuM="
	},
	{
		"path": "assets/Unlock-cjbpkc3v.js",
		"integrity": "sha256-s7yhVQBCwHN3Pk4XL3dMCGO8r+nGaSoDCOuNfEyk0BQ="
	},
	{
		"path": "assets/Unsubscribed-jcitchg9.png",
		"integrity": "sha256-Pn+pJ96nTDGfu4jyvMJxsRoHPJUtMJjb3tP7Zc4WjLs="
	},
	{
		"path": "assets/UpgradeAccountUpsellPage-d15odcp6.js",
		"integrity": "sha256-jVfnuLBuWsxvAh38nAmX/wjgF3sKdq9hdrLxrkPrrUE="
	},
	{
		"path": "assets/UpsellBackgroundImage-l50isgz6.js",
		"integrity": "sha256-6HHm1v9JdqzGkvPdE6XG6BVhjkVG8ATjyHLCFCSOj3I="
	},
	{
		"path": "assets/UserPresenceDropdown-dj59zflh.js",
		"integrity": "sha256-dubOZt+QcCOnUoAu5LEoa8qy17nR6H3HN+c39UMZFIM="
	},
	{
		"path": "assets/UserPresenceService-evxve7wc.js",
		"integrity": "sha256-QoJAqIJa0L40yO0qJS92oPUEiJ1zV5dOOftKV2ECtEo="
	},
	{
		"path": "assets/UserProfileRoute-kjax8hr9.js",
		"integrity": "sha256-/QS+EnBsQLrnwmchGD/vwfO4/I6MhIgfNg7BTxDCRRY="
	},
	{
		"path": "assets/UserRelationshipsDialog-ej1f2ydn.js",
		"integrity": "sha256-rtUR3uI/P4BWVu5JeoZlAevYydgbBeuYXNzcIuUaaGU="
	},
	{
		"path": "assets/VLTTJS3N-oecwr6eh.js",
		"integrity": "sha256-xdz4UlX5nTTd9e+RYm0S10DB5om0kgmZ8hSjWVzQj6s="
	},
	{
		"path": "assets/VerticalDivider-h2ytp1az.js",
		"integrity": "sha256-oWdbh+WAiraDdZxrPxD0rj32Xg0nbRdIZFgO3YXfknI="
	},
	{
		"path": "assets/VideoPlayer-kgwtkog2.js",
		"integrity": "sha256-7QwETu6EB0JW5kse5TfRQZc9jeVmp+qAKbt28cQYzIA="
	},
	{
		"path": "assets/VirtualGrid-mj7g6yd5.js",
		"integrity": "sha256-3BH1KxanyzAojFwcHWzNa+ZXllffU6hvuIoiAoJEumU="
	},
	{
		"path": "assets/VirtualGridCore-h5ddo71i.js",
		"integrity": "sha256-FbXPnkR8VdEp+0I5JYbzcs4VSMmDkV8sLekEfMVrJ7s="
	},
	{
		"path": "assets/WebRtcStreamV1-bqhaihi5.js",
		"integrity": "sha256-k4XNOYrEBJeH581I7rZuE5uEMcdF5H1+Pa5Ek2QjwlE="
	},
	{
		"path": "assets/WebSettingsProvider-mn1fn3wi.js",
		"integrity": "sha256-40utf3hm2ydS47xcdkKX4mwNwj1eWEyd6Mlc2mU+zto="
	},
	{
		"path": "assets/WelcomeRoute-fsz9gcte.js",
		"integrity": "sha256-KpX4h5B09C2UwSt9kbnUqrdPQ2AsSttvaITNOsLo69k="
	},
	{
		"path": "assets/Wifi-gzwwkjp0.js",
		"integrity": "sha256-AxoUm9xFAXXhsDBIQEhYbeyzEOOCkbVdyvRTKNK2Mho="
	},
	{
		"path": "assets/XboxComFDService-lnlsle2n.js",
		"integrity": "sha256-+HIJPFn6OAzuuq878jXb0J0X/emUd2HhL4CnopmBdiQ="
	},
	{
		"path": "assets/XboxOne-kv8l2xyr.png",
		"integrity": "sha256-+UPR+T04WuDMG5vG09NHFMXB772M00RzyiLTK3ZObNU="
	},
	{
		"path": "assets/XboxOneS-hecaq60d.png",
		"integrity": "sha256-+TIekCMPBi1mr8JiOIDqa2P6dyYedkZk4mPqgCc84lM="
	},
	{
		"path": "assets/XboxOneX-bbh8uatg.png",
		"integrity": "sha256-BVdS5P56kqW7YGXI8PI/FcCTaVy0BiK3QRY9k+52hvc="
	},
	{
		"path": "assets/XboxReduxModulesAdaptor-ev8km4ex.js",
		"integrity": "sha256-KmMCSqyAehuuUX3qJA0THVR+DCOOtPUqwT3l9D/ko9g="
	},
	{
		"path": "assets/XboxSplashScreen-k4sxyhua.mp4",
		"integrity": "sha256-YAM360y8WhnrpfZccBXBz3Q66XbI0yVE7KzkQisVF/k="
	},
	{
		"path": "assets/XenonSpinner-hionx0on.js",
		"integrity": "sha256-wecUgYtugSNBjFRBIku2FzFsEAiX2PF6M5KkZuG06P8="
	},
	{
		"path": "assets/_AchievementsPlugin-mn5udtgj.js",
		"integrity": "sha256-aat8mgAE1OPafJyDfLRyYSkRtQu3LDuYbSdVlrkpToE="
	},
	{
		"path": "assets/_CatalogServiceAdaptor-ocgzrdjd.js",
		"integrity": "sha256-wxnv6Q3pEqjvgZuPSjzEPeqjzZXrB10k4kyotrypHUI="
	},
	{
		"path": "assets/_CatalogServiceAdaptorIndexedDbWrapper-ej87icxx.js",
		"integrity": "sha256-ixu55jaAOIXAuO9/j/8c6vVpQWwY/TNVmDE++0pTXlI="
	},
	{
		"path": "assets/_ChatSocketPlugin-o1168ew6.js",
		"integrity": "sha256-0aZAuiZV96T4bAtuOdukOJ1C6X8ubVydY5g8cQMm7J8="
	},
	{
		"path": "assets/_ContentBuilderPlugin-jvyutisr.js",
		"integrity": "sha256-jeF+Ykkeh7a3zo+aZ6ljtHYZzbrRsXPxcEI3MjXsiVk="
	},
	{
		"path": "assets/_DefaultApplicationLifecycleAdaptor-fta4zg0c.js",
		"integrity": "sha256-14EhsM1aQgXIDxKhbN2t4t/IynKmTshl7a0tKBsLcCg="
	},
	{
		"path": "assets/_FamilyPlugin-dsfh01ke.js",
		"integrity": "sha256-htsQejF0Upsqd4mFkdj8LgSCJq6pPnbhCWbq1nF6KnY="
	},
	{
		"path": "assets/_FamilySafetyPlugin-mtmi4j3m.js",
		"integrity": "sha256-1+fYVF1k6RebFtX1hHmTvYn1uMjVhgpCe9jktghMuNI="
	},
	{
		"path": "assets/_FeedPlugin-ghi7iob3.js",
		"integrity": "sha256-c546CHoC7aDR0LQlFn618lNS2k3on4mhB1zlD/7YQ08="
	},
	{
		"path": "assets/_FireOSApplicationLifecycleAdaptor-n0ev63ay.js",
		"integrity": "sha256-GF9B0D4PZBONFNXUaQdldwZpJUGRMmlPu09OaEuc3Yk="
	},
	{
		"path": "assets/_FireOSBluetoothAdaptor-nicypfz3.js",
		"integrity": "sha256-Do0/3OY1CUEJyC/PT2HonU7O5CtlUc1rBhnF13fqehM="
	},
	{
		"path": "assets/_FireOSNativePlatformStorageAdaptor-b6ga0ur4.js",
		"integrity": "sha256-B9CNU69lk4Uxmvztqhfl0mpap96ljRzMf3fGfTJ/CHs="
	},
	{
		"path": "assets/_FireOSOSSNoticesAdaptor-cpzrd2zf.js",
		"integrity": "sha256-BNFZv+d3v2s6ZaDBk5p+ipIVbAxoF1tLZxwBxm7WBiQ="
	},
	{
		"path": "assets/_HomeOSApplicationLifecycleAdaptor-fpt3tk5a.js",
		"integrity": "sha256-0S0jC05KZlldMN3lQkCSK8dyZLYUmafUFX23yAq6+gI="
	},
	{
		"path": "assets/_KeplerApplicationLifecycleAdaptor-i9u951wo.js",
		"integrity": "sha256-k4qvI7xIqVjPgpgixDaIgIHN7JuXwjmwcgKdK6ic2gY="
	},
	{
		"path": "assets/_KeplerBluetoothAdaptor-jfzttug2.js",
		"integrity": "sha256-Fl1y6vt0fL4yHDfwLAzdUVPN+7OxwEK2yrlra4EBHDQ="
	},
	{
		"path": "assets/_KeplerNativePlatformStorageAdaptor-gznyf8a4.js",
		"integrity": "sha256-rf5ijMxr5sUfuWngsxFtQGImq5lcWTa0Br9w+U6wDPM="
	},
	{
		"path": "assets/_KeplerOSSNoticesAdaptor-fj2nsalh.js",
		"integrity": "sha256-bXihGLIf/q9vfpIHPyPxzULkcB1IuIdR+FUM578jeB0="
	},
	{
		"path": "assets/_Lightweight1dsAdapter.client-0l2s967v.js",
		"integrity": "sha256-KGXR31UXhPJnoFtZI/y4l80F2ycEF3GlfuePsagf7NA="
	},
	{
		"path": "assets/_LinksPlugin-ff4qll0m.js",
		"integrity": "sha256-omK+f5lki+9FqyFgcZpUWoBrPpHPaILa5wj0rCn+aSA="
	},
	{
		"path": "assets/_MediaPlugin-fr8y30xg.js",
		"integrity": "sha256-6FLi0yMZzKziPKupq8lMLyxGdYR04iah7u8AQo/hzMY="
	},
	{
		"path": "assets/_MessagingPlugin-c66smrka.js",
		"integrity": "sha256-HvV+3vq1CPmAZqk8N2xcsOZ5OlPlUf8Mddq6F/wH7xI="
	},
	{
		"path": "assets/_NotificationInboxPlugin-m6ummq1u.js",
		"integrity": "sha256-A9R8FJNblM3++czOzhwXjQoZyFqERTLorVnraVGmlkA="
	},
	{
		"path": "assets/_PartyPlugin-hqm55km3.js",
		"integrity": "sha256-YQuPhMes5yJC1xVsekOk/1MoQNII+R+mpQXaFDIJzw4="
	},
	{
		"path": "assets/_PeoplePlugin-mu7qxnf1.js",
		"integrity": "sha256-2PD3KD7pdFO3oCIxWZta1+gFVu0UYPQY2fUvx3ei2Uo="
	},
	{
		"path": "assets/_PrivacyPlugin-lss43b4j.js",
		"integrity": "sha256-amY4NAJzP2LEm0SukIpt0VtbNBcEuPPOwrgjNR43iVA="
	},
	{
		"path": "assets/_ProductActionsMetadataServiceAdaptor-gsy9sj3v.js",
		"integrity": "sha256-9nYQsDPBsgFOpPIh1HfUeKnzGl8EOhHEVkwqfwC6TwE="
	},
	{
		"path": "assets/_ProductPageMetadataServiceAdaptor-ijdtrgjb.js",
		"integrity": "sha256-8qPq7r0zZh1xTgiegnZ9i8J+3Uif3zbdEZQ6Yae1O94="
	},
	{
		"path": "assets/_ReportingPlugin-exelsci8.js",
		"integrity": "sha256-ar9hLbvQgzJnLIRHB1g0td5nFqjDM6zOZtvm3lFPkms="
	},
	{
		"path": "assets/_RtaPlugin-chb43cp5.js",
		"integrity": "sha256-kaEgK2iihjrZBTUSTSjsnnUczM8+3+nNcQfTLTDuR5M="
	},
	{
		"path": "assets/_SearchPlugin-jxbabucm.js",
		"integrity": "sha256-ZLphHoDeXLvf+TE2TpJGe32D4OAhHn+l4u23NCtk1oQ="
	},
	{
		"path": "assets/_SiglServiceAdaptor-nelljduf.js",
		"integrity": "sha256-AavU/2PEN8X6xbnOPwDIYs3RJ0VaYR+I8QO/h3MnV8U="
	},
	{
		"path": "assets/_TitleManagerAdaptor-mtww1z6s.js",
		"integrity": "sha256-nmTc24HGgAzjZFDe/AGsuO042jV8uANsBGYjrrV96YA="
	},
	{
		"path": "assets/_TitleManagerAdaptorIndexedDbWrapper-mqhbl0j9.js",
		"integrity": "sha256-cg7EGN81SnkS3Dm+yk5lNZ0T3Fj05cIFdxmVZcjN6eo="
	},
	{
		"path": "assets/_TitlesPlugin-b37lw53n.js",
		"integrity": "sha256-K+DYakcKVggZPH18hQwe9ha+Rf4GR3Rsqu2PJLjh6eU="
	},
	{
		"path": "assets/_TizenApplicationLifecycleAdaptor-hg2c3r40.js",
		"integrity": "sha256-9lzZ127zMKPidZT+UV6tC+J7kMgHzrWGS9fF/CAKwkQ="
	},
	{
		"path": "assets/_TizenBackgroundServiceAdaptor-bjxqacic.js",
		"integrity": "sha256-Xlc0zK1125bRgjeLrl44tB1RJoNhrazT6Gig56MugKc="
	},
	{
		"path": "assets/_TizenNativePlatformStorageAdaptor-dobhci4s.js",
		"integrity": "sha256-VtgX7KIFE/SVv26hwmcP//lmFffeGZwIZ/SVlaOgwuQ="
	},
	{
		"path": "assets/_TizenOSSNoticesAdaptor-j4cmvi2h.js",
		"integrity": "sha256-HD9E0e1cajEoFdW/XUdxuR/Gyr/ElPJVtmhMEBe3ads="
	},
	{
		"path": "assets/_TrialTimeManagerIndexedDbWrapper-duavjvh5.js",
		"integrity": "sha256-hiZE2HQlAhgHkazSYKiiXL7v1LhkthumoyYbEdduYEw="
	},
	{
		"path": "assets/_TrustPlugin-onpgye9u.js",
		"integrity": "sha256-Kx8dwuHzL9qwkt1d2BTguNB+lr7i+oES4yQbtZYKnOQ="
	},
	{
		"path": "assets/_UnsupportedNativePlatformStorageAdaptor-da3gbzvq.js",
		"integrity": "sha256-GBT9mn0Ep6wF/ZQMjlD9InHrfaJodAssEHWlJtDPQBc="
	},
	{
		"path": "assets/_UnsupportedPlatformBluetoothAdaptor-n256gxjd.js",
		"integrity": "sha256-1D+Bs2EYYCx7DDHqnLml1wD5AdkfIGa9PWSRCYfY63M="
	},
	{
		"path": "assets/_UnsupportedPlatformOSSNoticesAdaptor-dwtv5ytw.js",
		"integrity": "sha256-wC3BDFuEDNvVYKot7E5iGsjdbXJDU1cEnY0bkqQxTAE="
	},
	{
		"path": "assets/_UserPresencePlugin-clfhj22d.js",
		"integrity": "sha256-whi/U7bnGRuCv4N55e3hz+lLAl/tDCGgNI9KTrE+lQo="
	},
	{
		"path": "assets/_WebDeviceManagerAdaptor-kded41gs.js",
		"integrity": "sha256-uTOYjw0YNj+vnzcXuYxyjo75IpEVxpjmOU+kximeTQU="
	},
	{
		"path": "assets/_WebFallbackNativePlatformStorageAdaptor-jkjfakaf.js",
		"integrity": "sha256-9ayScqSrCTBuViBIPdo/vhATG5F3a7wlzPzdlUfZ5Tc="
	},
	{
		"path": "assets/_WebOSApplicationLifecycleAdaptor-pdm9ncvv.js",
		"integrity": "sha256-LSIDO3GN2uOviNNH50luCmPKLBoaxYNCEjlKFa6SHzw="
	},
	{
		"path": "assets/_WebOSBluetoothAdaptor-kfwuxe61.js",
		"integrity": "sha256-t/z9V6Ps4FprJjM0eUEj9f7h5CaZ9NkJ2SIh4162tG0="
	},
	{
		"path": "assets/_WebOSNativePlatformStorageAdaptor-ofbk0t5e.js",
		"integrity": "sha256-Oldhf+D331IxI+LMyRG18WmglhQHe8X+CBzpqjkhGWM="
	},
	{
		"path": "assets/_WebOSOSSNoticesAdaptor-6ltlncx7.js",
		"integrity": "sha256-tD68s4HkNPVUIUUDci6XCyTYSv6wyAL+Fib24KQAZrk="
	},
	{
		"path": "assets/account-dark-mzevsfe4.svg",
		"integrity": "sha256-hqKjYcleE9ME61h1DgwRrUzCM3Fr8Lx4Kdgf13mje3k="
	},
	{
		"path": "assets/account-light-j0fv5hp9.svg",
		"integrity": "sha256-3M/cOWfcW4j2jnaEynnq9GnjuYIQGr5tZzhDU+n5OjA="
	},
	{
		"path": "assets/actions-khgs3p0j.js",
		"integrity": "sha256-gtStYkhNVx4/+imqG95LQ0AZfWqcwqXzevy8fC2/9pk="
	},
	{
		"path": "assets/additionalInfo-o1pzy87s.js",
		"integrity": "sha256-1p9BFKTc55RerGUNJXS7S+fZKg/imVY3zNJj0zqE8vc="
	},
	{
		"path": "assets/animation-data-eieehv4k.js",
		"integrity": "sha256-O9wAVAZ04fu7e4vosAxgsIfNU4OHpAY6MYrw8xGgm0E="
	},
	{
		"path": "assets/animation-data-fg1ekhe1.js",
		"integrity": "sha256-IcjE54zv///ATTztyHe6RSoBIBIInjugb/vYVXZM3Bg="
	},
	{
		"path": "assets/anime.es-jiflpru5.js",
		"integrity": "sha256-9DgrU/pL7f3AgtGGktvazBv+Rnc+pbbWmJ+XfYE9KYs="
	},
	{
		"path": "assets/app-j3dwnli9.svg",
		"integrity": "sha256-lU3hvr5SmZeEqxbTojeCntVmmxuEjJAvD5YfUgIqD/o="
	},
	{
		"path": "assets/apple-device-match-ghvcd7xk.js",
		"integrity": "sha256-jwQO7k0lzOE49NGdNvDowo4qWrPqEKpoU/GUoIPWx6c="
	},
	{
		"path": "assets/apple-gpu-deobfuscator-gs7m1e9q.js",
		"integrity": "sha256-FjLXNwlGLs81NItjI8ztNm6HkJGi4ysAlYlAPWh/n9w="
	},
	{
		"path": "assets/applicationManager-ieqxakm8.js",
		"integrity": "sha256-/0L/WtRy2w/etB4MlSUkZbyqFbrSa3+O+7SNBb6FpJY="
	},
	{
		"path": "assets/assets-ohjao908.js",
		"integrity": "sha256-//ShN7bTPSJ/K8NgKuM/Tsx285tmEhpIL7Jj+33JIKI="
	},
	{
		"path": "assets/auth-hooks-karaxdb8.js",
		"integrity": "sha256-4bvfLASKy9dDlxevYQl/u8WhFagyJIPoqDpKWW7h6o8="
	},
	{
		"path": "assets/blue-cjok205r.js",
		"integrity": "sha256-RgXXTlc/u01mo2Pqt0ORivlFyxxS+NscZePcBr5oCfw="
	},
	{
		"path": "assets/blue-iyszrtka.css",
		"integrity": "sha256-Sg6aEdTy7naIDDSnQicqJnqIFd7WAUhREFG+Eoc5NjM="
	},
	{
		"path": "assets/bluetoothManagerPlugin-lxlkwq70.js",
		"integrity": "sha256-YqtguyXaazOIdAjPiNzWOvkQZxftq2b6dUEJIkk5EI0="
	},
	{
		"path": "assets/browser-fqjxrlnc.js",
		"integrity": "sha256-h+312ItOE68+/bmx6eFeyn6qAxXLxpsHaY2Fb+4PTWc="
	},
	{
		"path": "assets/browser-ltec02fx.js",
		"integrity": "sha256-nnZwnS8DqFeAdbUOPmRXghp+N+88GnDJ/eKO47WHiks="
	},
	{
		"path": "assets/classNames-ikl45qo7.js",
		"integrity": "sha256-0e3VJK1ucUSWG8tQeBVo8NRXijV3qO4K3trqAbsJouw="
	},
	{
		"path": "assets/commercePreloadLinks-7ptujqoo.js",
		"integrity": "sha256-/tNogP3nU1nlo4FOwsp3GigWINOZd02nR2amRNnj7sE="
	},
	{
		"path": "assets/community-dark-jktpu849.svg",
		"integrity": "sha256-aANbuyTc8bqpXiLOflFzh5zia4gwcbocW5aTlvE21a8="
	},
	{
		"path": "assets/community-light-kdceaeah.svg",
		"integrity": "sha256-6HX0N8PHiTv7Qu6XCxl1oVrJeG9swr2i8JL7dD39yV8="
	},
	{
		"path": "assets/connectionManager-d2rg2gp7.js",
		"integrity": "sha256-wEsTReWYbOssDdfNORJn97YpggoO7qcxNSG/66fRr+4="
	},
	{
		"path": "assets/constants-nryplh1o.js",
		"integrity": "sha256-eNBlKFbODmnzGJal1B3PKGh6gk8iMfAVr0lj16ZPLIk="
	},
	{
		"path": "assets/constants-pb9qv30l.js",
		"integrity": "sha256-sSPWp1LdcA8mTaGA2stYgkvW0GqSnlRoehv4zAF0wCk="
	},
	{
		"path": "assets/controllerPairingRouteBindings-b89rfn3x.js",
		"integrity": "sha256-iscP0e9MFabqh9mVbzbnoacyjKZTE8IpKDZv97UzltA="
	},
	{
		"path": "assets/converters-f7qua07c.js",
		"integrity": "sha256-r+ToaCJbCKoRP0SkibhE7s4yV8zG4tFsEcMaHItfKy8="
	},
	{
		"path": "assets/core-4v8u4sxj.js",
		"integrity": "sha256-RUQXGHskXz3kdxuNslGXBR3FcoLdQUxLHrxmrTtFPxE="
	},
	{
		"path": "assets/createChannelBasedSagaMiddleware-moczvi7d.js",
		"integrity": "sha256-clJoS2gg5VT+k9GMwq+g3VSehgrWz6rnpZBzHPdf5MY="
	},
	{
		"path": "assets/createGetAuthToken-gzsh85ms.js",
		"integrity": "sha256-LR85hKr5K+ttfLMc72k3yT3RpKk5mMtqNBbKEGhqZCc="
	},
	{
		"path": "assets/createLoader.client-b8e7550l.js",
		"integrity": "sha256-qlirEUGWfIMg71adfjxSmbvqeWBgD62J3xfp5uAeVxA="
	},
	{
		"path": "assets/crimson-db706no6.js",
		"integrity": "sha256-dshpeU2KSsI0AdZR8JhE2EAm8X0tRKjamBXQMkzKjLA="
	},
	{
		"path": "assets/crimson-en5v3uf5.css",
		"integrity": "sha256-iHTevS+QtVUiVMKej/tDA0QgdmH06S/4jIsItCSpT9I="
	},
	{
		"path": "assets/crush-dark-c9wwu3j7.css",
		"integrity": "sha256-5AuXwhn/+JJ8NB5kYnVrRrmLOuKhNrL1ADACrgyaB/A="
	},
	{
		"path": "assets/crush-light-gllu3wkt.css",
		"integrity": "sha256-tpKYrSLzzMXyBPoVSMHX1dnThkdsuPlwd7/6DLFKPDE="
	},
	{
		"path": "assets/customTokens-nwxg2rwm.css",
		"integrity": "sha256-e0Zl8qPwKsNlGfGAgH79EdFwF00J4Wvi7qq5EH4j9UE="
	},
	{
		"path": "assets/default-1136x639-dypmbckf.webp",
		"integrity": "sha256-qgCyDP7D09H0GxXDL7tySUYpIzadXfE581Eg4XtNaSQ="
	},
	{
		"path": "assets/default-1136x639-n2lijp3w.avif",
		"integrity": "sha256-qnzjXRvBcZYcJ+hEz89dhPu1KDuMg0DmiN3OiGiu9yw="
	},
	{
		"path": "assets/default-1136x639-nr7lbidq.jpg",
		"integrity": "sha256-Dleqyljj7v5yBF+T4YR7wa/LBplskeEBNa1MRGAO6nw="
	},
	{
		"path": "assets/default-1136x639@2x-b0yuuz3g.avif",
		"integrity": "sha256-D1dwvZK2Rp4HQk+wlH8LGU1m6svIrHxqMAy9sjlVyUs="
	},
	{
		"path": "assets/default-1136x639@2x-cx8vmtqh.webp",
		"integrity": "sha256-Wg3BJPlpk06WsnRQ71UgPVPqrEEnzkKEZ4FKbrvE5yc="
	},
	{
		"path": "assets/default-1136x639@2x-fad8qo83.jpg",
		"integrity": "sha256-dX6fiiiq15EBe96Rcx++aNYQCdQGdanNqeW2z2QTLt0="
	},
	{
		"path": "assets/default-1536x864-b6l8a6vs.webp",
		"integrity": "sha256-ns6kia6K/QngD8vpymUjD6CcTZI19gM387z35U6X4fo="
	},
	{
		"path": "assets/default-1536x864-cgqtoiva.avif",
		"integrity": "sha256-+qX3WDJ0z1yk2GUuzglf9LBeJsVX8YGs2b2F+OqgT40="
	},
	{
		"path": "assets/default-1536x864-oudjb8ly.jpg",
		"integrity": "sha256-1nrjCh2FHbCWr+j6nZ7sF0q2wci9nsnH2VdM5yVaOIA="
	},
	{
		"path": "assets/default-1536x864@2x-jufv19b5.avif",
		"integrity": "sha256-S6JTx6KhbYtcBxy+r004I5bd0MdfhI5YmWKUgwUfsi8="
	},
	{
		"path": "assets/default-1536x864@2x-m2ljkg8f.webp",
		"integrity": "sha256-gYQDoZGdJcJF1VtycakYQf7LTdQRDBN+/ydYM6TwhwA="
	},
	{
		"path": "assets/default-1536x864@2x-wfq584gq.jpg",
		"integrity": "sha256-MKqSSZvKM7850leC8QA7iaw+kw0OyF6lhpY/MgiKqy0="
	},
	{
		"path": "assets/default-2048x1152-ctgl6g8t.avif",
		"integrity": "sha256-hKeRR1eAT1sWUJJ+wcHv9LXfT0YXhnbPYU5M8Cf+JMU="
	},
	{
		"path": "assets/default-2048x1152-d80op9nt.jpg",
		"integrity": "sha256-7jpLo1/c4rhG+1aG5GQT8W22G6SMZKNQx6WAlxRdpIc="
	},
	{
		"path": "assets/default-2048x1152-n643itlv.webp",
		"integrity": "sha256-WxV7yyf7iKkVwyWSE5Wtu0Gwz1MHbagPJoR52Qksh7Q="
	},
	{
		"path": "assets/default-2048x1152@2x-ctcwb2qi.avif",
		"integrity": "sha256-rByuQGbKpCLKaFowj2Zcf8LUeqeJ/62E4y1hNHm6vpg="
	},
	{
		"path": "assets/default-2048x1152@2x-dlfrzw66.jpg",
		"integrity": "sha256-XmwucxQSjlAIjzILMcQQlXLw8XTVWElF4YzWH9fzAsY="
	},
	{
		"path": "assets/default-2048x1152@2x-krh626qm.webp",
		"integrity": "sha256-CnTJFuUlLJnDMxxp4add5E1r3VVabNKoW6v/jnZc9Uc="
	},
	{
		"path": "assets/default-960x540-cakg60qe.jpg",
		"integrity": "sha256-Z37J9rTh0HKHeJqI6ZxTVNB6z7Ca3jmhWGh1WazHPwI="
	},
	{
		"path": "assets/default-960x540-cscf4whi.webp",
		"integrity": "sha256-ixkorXpwwwiB8VGFUJhR5IARY600o0Jlqt/fR4lNf8o="
	},
	{
		"path": "assets/default-960x540@2x-cg3casy1.avif",
		"integrity": "sha256-vSHmVbrWqZzg1l2IA8kmZ0DZSTjs4wI1dNG/nRGcsGE="
	},
	{
		"path": "assets/default-960x540@2x-dtr62lam.jpg",
		"integrity": "sha256-yLj0QDeBmzStcpzvAlY6ZEpCzWU2TnZU2YaL2vH1voo="
	},
	{
		"path": "assets/default-960x540@2x-fa6bxugn.webp",
		"integrity": "sha256-zT1AS64xYU4aIMbFcUEnr249u0vL0xv92/VE4hZrJXA="
	},
	{
		"path": "assets/default-l9smv0ug.js",
		"integrity": "sha256-KpzErrJgSUwpIEQM3PqtC2WP5noegsWKXwJAIx7zGrc="
	},
	{
		"path": "assets/default-megzy7ma.css",
		"integrity": "sha256-Z+OueQ5546R148wb/sW9c6YkNHvFSl7/s9W9ah3pbUs="
	},
	{
		"path": "assets/determineUpsells-kizqoxq1.js",
		"integrity": "sha256-+cgKfjJiPr8nDOmG8+ePPZWrkudCKB4htpFEAqOzWb8="
	},
	{
		"path": "assets/dialogPreloading-7hh3nt1j.js",
		"integrity": "sha256-xDf9z1SXbSS9/p2K3Bs/CUtryrAFdG9Hn21SpM79W24="
	},
	{
		"path": "assets/dialogPreloading-fzmpjgd4.js",
		"integrity": "sha256-3++gyK7ts9BDEGgT33+KiECRKVse//Dwt+mGx/aNu+g="
	},
	{
		"path": "assets/dist-bea1xtig.js",
		"integrity": "sha256-Y1sTkEqSLGUqMusvX/zJ/glshbL57FN3378QRXiF+lI="
	},
	{
		"path": "assets/dist-cwmyfzd6.js",
		"integrity": "sha256-XX6VNvunOiHqfT67kPaftJzWYwpaK+HSWu+Mz6xD9TM="
	},
	{
		"path": "assets/dist-dy1rpgvi.js",
		"integrity": "sha256-46XcCw01kbZfM+JT4X0FoyIBjG3/Q7eQK8W3JBRWAD8="
	},
	{
		"path": "assets/dist-eblctkno.js",
		"integrity": "sha256-7S9ANTaqI5XpWpPkGtSHnqCoX1myoborRKzrks3tyiE="
	},
	{
		"path": "assets/dist-fr7x8wom.js",
		"integrity": "sha256-IEJJHuTI2nzwEWbrVqmS6jM/UhFWHevbUCJ+Axp7wJQ="
	},
	{
		"path": "assets/dist-gisqjxt7.js",
		"integrity": "sha256-L8Xl8xzyeL3iDbVVCeu1eOZivIUtd6chX9e41nmqY4o="
	},
	{
		"path": "assets/dist-gzqf4pom.js",
		"integrity": "sha256-6A6MEaYp/MC0vf0eaP+XUKZAfgwmOzkq57jZFRPvt/w="
	},
	{
		"path": "assets/dist-hbayhsjd.js",
		"integrity": "sha256-nKgcXqyrtI/AegeNX09RSvwATZaK/2oifsijGAE5//g="
	},
	{
		"path": "assets/dist-igm7e9mu.js",
		"integrity": "sha256-hKeK0IrBwvyRzbAE7MpAU+5ecq5jNmGP1DqfDM3Jcyk="
	},
	{
		"path": "assets/dist-ilzntnij.js",
		"integrity": "sha256-Gi+G4CA4oXNYGJfKup8mDVdTqwPUxai0EoolY0wYyWk="
	},
	{
		"path": "assets/dist-mh7lbneh.js",
		"integrity": "sha256-JKUwRgZ6gFLregFqYK4TAH7K921Z6S7lqMMbZuZt0qI="
	},
	{
		"path": "assets/entry.client-dr7r6s9a.js",
		"integrity": "sha256-b9N8cxpxZoV16pqHCf/Wu8U+hcRnK643BjHcXUPpww0="
	},
	{
		"path": "assets/esm-browser-jqlozrse.js",
		"integrity": "sha256-k4HJhqS6/OCWCWybffvGMtbNXk9/KMO1T53kYo8gxiA="
	},
	{
		"path": "assets/esm-opqpx5f9.js",
		"integrity": "sha256-gIAht37bWZySRVf6kqIRTimFNvPRsWUdnZ5a5m/qriI="
	},
	{
		"path": "assets/esm5-srngp8y4.js",
		"integrity": "sha256-0G8aN8zSHvXc2E5pQQDg+ucaXi7FvpzVFE/35V/fCmg="
	},
	{
		"path": "assets/fireOSHelpers-dm17p2ca.js",
		"integrity": "sha256-EHQSaVY5PwAVoEIw0L+QNNR/Y0Fult4XzlWTEUIjIgk="
	},
	{
		"path": "assets/fonts-kxvwg6sq.css",
		"integrity": "sha256-ySTQGrjnC7VnMLpYxTRxD61E/1Fk7LsEVrFcZqocQBk="
	},
	{
		"path": "assets/forced-colors-ihwojem8.css",
		"integrity": "sha256-7/e63HibtOUalZDgx9BReDrm9w5BzR5G5Qng8rg1WVc="
	},
	{
		"path": "assets/fpv2-bx0e4jvz.js",
		"integrity": "sha256-evYC5oDmCrSyjuioc+oewI9ufIGcsNCbt1tAxd6N7Qs="
	},
	{
		"path": "assets/frame-landscape-dark-lyl8ts3t.svg",
		"integrity": "sha256-PFrsxiQS1yzattEy2Ok3SaQqKek1n6ymT+J2gairAZo="
	},
	{
		"path": "assets/frame-landscape-light-oqy90k4e.svg",
		"integrity": "sha256-MQqsnaS1C3/6mAslWuP1MA8J/x/pLSMhsl6/6BDpLvk="
	},
	{
		"path": "assets/frame-portrait-dark-orce274k.svg",
		"integrity": "sha256-eLXlTOje7eRO4PhvWThE7haBoG6eBejBLmi8cIR2YmI="
	},
	{
		"path": "assets/frame-portrait-light-izj6hdcd.svg",
		"integrity": "sha256-L6M5z9H7iEYZQNVz33D3Sk9cbjrgaHXkXMQ5ME5e1Dk="
	},
	{
		"path": "assets/gamepad-ebn9bcrq.js",
		"integrity": "sha256-F3+aiMs34dlCPjouFOeE+DTr2CIAwZnO+Ub3dmTszmA="
	},
	{
		"path": "assets/gamepad-nav-virtual-cvbizm2x.js",
		"integrity": "sha256-ysP8W8To8GtEbaflM0CYasFVaKw18CuhSV21ol1exko="
	},
	{
		"path": "assets/gamepadUtils-rk5i47js.js",
		"integrity": "sha256-MC+ZFxXHJT0F63RWEMuXOomAfKcc9so1tGHl0dkw/Ok="
	},
	{
		"path": "assets/gamepass-sigl-service-fiy6qsdl.js",
		"integrity": "sha256-zBU4P4bzeGfG1l4nPWCtzv4WZRMqzclK6w9CBojGCqU="
	},
	{
		"path": "assets/getAchievementSummary-pao4wm3y.js",
		"integrity": "sha256-FaGxyMkjVCi/yK/NDT8t9kq/cQ1RPBAvfofSB+45RaE="
	},
	{
		"path": "assets/getCatalogMaxBatchSize-ggepkzod.js",
		"integrity": "sha256-mqR31wiuVDxZ/iE1KYdxA4hpOaWHTvvPG2C7bTL2hkQ="
	},
	{
		"path": "assets/getChangeGamertagRouterEnvironmentHooks-e2ysxgj6.js",
		"integrity": "sha256-TnItV4baYP1o5sKNDI8Ci2Wcwud5J5x5gBw7MjmGaAQ="
	},
	{
		"path": "assets/getControllerPairingRouterEnvironment-cyamx6ev.js",
		"integrity": "sha256-gZz3Silz+j4lZXdupVq7t/nnuibrWW3iIQrSi2H9DYI="
	},
	{
		"path": "assets/getNetworkInfo-jj9kc2jg.js",
		"integrity": "sha256-0TysUlOpdPFSLlt53Dovs27/87kJcBLnOObYFWVuC5I="
	},
	{
		"path": "assets/getNetworkInfo-mmzys019.js",
		"integrity": "sha256-NUamAQe+SXlIli+HrQjwQUZ+XeSrZVzqa+pePz8Gj5M="
	},
	{
		"path": "assets/green-b14hf8bo.js",
		"integrity": "sha256-M/AtDPj8eFerVGRnW0BrkMRxxRjjxzUqty7JjfNZGH4="
	},
	{
		"path": "assets/green-ifko6gpn.css",
		"integrity": "sha256-lyzkSKUxKe3Ri2RwfTUurfi+9NprwELmZsRkDxjkZ+U="
	},
	{
		"path": "assets/guideRouterEnvironmentHooks-gdtmgzra.js",
		"integrity": "sha256-QYH1ee40FdzMDp0a4uIUP4UizJ0380HBZZbIeGzg9y8="
	},
	{
		"path": "assets/high-nwvmxkig.css",
		"integrity": "sha256-65U2Q7oc+3ZUOsw4U+qRTeLEsME54fsJqa15pxktk/k="
	},
	{
		"path": "assets/hooks-e2ql4s1e.js",
		"integrity": "sha256-m1g444pW0Pvr4SRz1U4hkTXuINfEBw45gsU2jnT2QPc="
	},
	{
		"path": "assets/hooks-hcpio92v.js",
		"integrity": "sha256-QE07qNkSvxNkggNc0e9Zag4Cziz3SCriknk6+WOqPQo="
	},
	{
		"path": "assets/imageUtils-fgnptyto.js",
		"integrity": "sha256-Eo0X1Hpui1pSk8wd+wPnWBF5WkL4EqLQgPSL6QaAT3g="
	},
	{
		"path": "assets/index.client-i2a3xk51.js",
		"integrity": "sha256-yNQXdgSmhXUS4pT+EZcGKrFejdT7AlNHqnln6y8F0fk="
	},
	{
		"path": "assets/index.devtool-hn4mt6rs.js",
		"integrity": "sha256-78axvjO6Z1HHy6v3mJ3UXB+ooSyUPT3KYeXmqi29z9c="
	},
	{
		"path": "assets/index.devtool-i9filq44.js",
		"integrity": "sha256-kSrvbaTU406c5c9buG5ev9rEMjnzeb8tQyo4jbkPVCs="
	},
	{
		"path": "assets/indigo-f7c8yw6u.css",
		"integrity": "sha256-NevzDf9KdFNff/6K/aDPbqWF4jYbTAS88rKYY8E6YqE="
	},
	{
		"path": "assets/indigo-in21zwll.js",
		"integrity": "sha256-M88RtBfwVKUeQeTxvWNzv+1UlHoUbi7hdIUrMZP793Y="
	},
	{
		"path": "assets/interval.worker-BCpYtupM.js",
		"integrity": "sha256-LUqaoSebUcQhnclb5rTGTBJpHnv+qEuwxkinbZO4jec="
	},
	{
		"path": "assets/keyboard-ejv1yz7b.js",
		"integrity": "sha256-yzPVcot2XtHrUK137xQ7w2uIOIsRC/lsdjp+qdpGBKk="
	},
	{
		"path": "assets/labels-k6t3mk4x.js",
		"integrity": "sha256-Tk+KRHgR4o49L9UgpYfBEqYz3hSJCpvDYpUKDn/4M8c="
	},
	{
		"path": "assets/languageTranslations-lqc1v57n.js",
		"integrity": "sha256-TsrwKtPcyv7xFg1Jbr/h/0r+JGydwYGAOqOa26UGBpg="
	},
	{
		"path": "assets/lib-pfqwm4mg.js",
		"integrity": "sha256-bpbpoIdjAw/KUhQDDY59MtB8FdBfguxgOV8jVlftQ/k="
	},
	{
		"path": "assets/loader-ar-SA-583fwaxa.js",
		"integrity": "sha256-JOg9c1tzdvQ+h7HWPSjv1UyzWKZnDl/UGBRCl/r/rEo="
	},
	{
		"path": "assets/loader-bs-Latn-BA-by9bxdyb.js",
		"integrity": "sha256-0L4nNM6bn2Eu0tbqgY3sOP36azlI6gGyeuAHMdxuEbw="
	},
	{
		"path": "assets/loader-cs-CZ-h6ykayp2.js",
		"integrity": "sha256-sPIlMEgFly68f16/N7hfmp75c5on3BLtIS7h4c7yYZA="
	},
	{
		"path": "assets/loader-da-DK-o7u0qyet.js",
		"integrity": "sha256-HSRynRyFLZnsKSgG+nhByRSLWlB/tzKHhGWfzg//8Ig="
	},
	{
		"path": "assets/loader-de-DE-okbrh3yi.js",
		"integrity": "sha256-1rhBZv6ZVrWMrOm0c8VKAR/wjE9M8oIDZlN6plNe5qk="
	},
	{
		"path": "assets/loader-el-GR-iduws09j.js",
		"integrity": "sha256-tw6ffko40ziQ9NpqK4f7cHoB21ZLrI6pq5FuAaIqDTQ="
	},
	{
		"path": "assets/loader-en-GB-ggg010kk.js",
		"integrity": "sha256-sb5VRTO9I/05t94VfEBWbjqqbMOc9snYtcp6+fyfAdA="
	},
	{
		"path": "assets/loader-es-ES-e9eancvy.js",
		"integrity": "sha256-eXNEGx8wsUXFyP+Gowu7FaJOiAm0PFRYcLQ0TIqEn1s="
	},
	{
		"path": "assets/loader-es-MX-jxtx26xi.js",
		"integrity": "sha256-/RCG5u5loJB8nhYosmQ+5iAxjLN8DN3WRMgDud8hUiQ="
	},
	{
		"path": "assets/loader-fi-FI-hjw20d20.js",
		"integrity": "sha256-5wscvNVxKlWShRTYJft9MXUejkjc/Tid/PtTOgRkl90="
	},
	{
		"path": "assets/loader-fr-CA-n9rjbivn.js",
		"integrity": "sha256-puh4H6mzaxIu+GPB3wzxE+aIojlNIeeNwKZcMtJmzgY="
	},
	{
		"path": "assets/loader-fr-FR-ewoila6m.js",
		"integrity": "sha256-E7o6aJqrCslW9e7Qv/Qa3S8jLA1sG2kzr6UlsIM78lw="
	},
	{
		"path": "assets/loader-he-IL-ojk75xtw.js",
		"integrity": "sha256-u3840aIzZqKF9eVyCMKSQRv1WcuuYCC9Ss6QtvEyYu8="
	},
	{
		"path": "assets/loader-hu-HU-e93rj4pg.js",
		"integrity": "sha256-i9uJ7cd3Qm36HhLDG/vVqi+520E/1m62v6XYaXD/NKs="
	},
	{
		"path": "assets/loader-is-IS-mjlxhlg2.js",
		"integrity": "sha256-BqDhTUyKZQs01EJ7FD4o/rbIUBgVNNGUT8nZTp6dg8g="
	},
	{
		"path": "assets/loader-it-IT-b0dbpj4d.js",
		"integrity": "sha256-tLbAqwKUjg9FBte/oiIhH8aSv1pHPa0Qhi/NcxgjCBY="
	},
	{
		"path": "assets/loader-ja-JP-bslia7ap.js",
		"integrity": "sha256-MUsjP5h2dtpJmqIbQhtWSEsz+m3QWO1Kp1aiayCFBB8="
	},
	{
		"path": "assets/loader-ka-GE-cxmmcs0c.js",
		"integrity": "sha256-AhleVozH7Wp2Vel2zfce7w1QNfasXQIj2itCnUby6yA="
	},
	{
		"path": "assets/loader-ko-KR-mq3bxuqf.js",
		"integrity": "sha256-idipbaMvl7VJtOzDvZx37yyFzbVVkn2KnqHWQp3i5Kw="
	},
	{
		"path": "assets/loader-longest-debug-gvqrhfh7.js",
		"integrity": "sha256-/p6aAoCmOl6aUFuNp6HR5WR/O7q9++aBVOCeYlyZ0bg="
	},
	{
		"path": "assets/loader-longest-mmvnuyg0.js",
		"integrity": "sha256-TfLn+x+6zmLT6wcYFZ05y8Nuq76UpI8nBP1YrmsM4qM="
	},
	{
		"path": "assets/loader-mk-MK-o10adta5.js",
		"integrity": "sha256-Ql5YWQZNQkyMq4QavWXWAGf2CdsPAedUj2HTwYs+sA8="
	},
	{
		"path": "assets/loader-mt-MT-e8egyjx1.js",
		"integrity": "sha256-CSAzYJLkuC321fdr17VX1e68c+CtWYag2uodD2zBaDM="
	},
	{
		"path": "assets/loader-nb-NO-lduenhn6.js",
		"integrity": "sha256-QcrmP8b8rFIw75VkkXAwpaoNPE86f9ROKgl49+7oi24="
	},
	{
		"path": "assets/loader-nl-NL-mzp6lnc6.js",
		"integrity": "sha256-PKQbwim/lECW57eOCym0WpHwcPqF3TWobRnoixFORxM="
	},
	{
		"path": "assets/loader-pl-PL-c9hmesgs.js",
		"integrity": "sha256-ImPgwxapGS32mh9tEHr2mOLgkxN5wXLdZBwAimEJADY="
	},
	{
		"path": "assets/loader-pt-BR-ik5mvfsb.js",
		"integrity": "sha256-vd5/VryXyKGBeMDCfyd2Ei8zATAn6ETtXxlIwugCZA4="
	},
	{
		"path": "assets/loader-pt-PT-kumrd1xi.js",
		"integrity": "sha256-FTCAP+e6aTeqK/dbNbVttwNVUrYA8a6YmiIMAj/s9JQ="
	},
	{
		"path": "assets/loader-ru-RU-pna790su.js",
		"integrity": "sha256-sF+Xo4zV6jynZ756k+5bMEj5J0xSE+xr8CM+CA7lcAA="
	},
	{
		"path": "assets/loader-shortest-debug-dvbkfhjr.js",
		"integrity": "sha256-YnvcTe/rp2sMXT5GCwy6cAF3SIUo60oCLe5U/Bxon9M="
	},
	{
		"path": "assets/loader-shortest-h199omqj.js",
		"integrity": "sha256-rAkOq0LAOsml39mjgv/eZmysOnwcFkxb8qqFokP3P6s="
	},
	{
		"path": "assets/loader-sk-SK-dn22tl84.js",
		"integrity": "sha256-Q4KjqpoNTMOiwhLJBZgPqyhjVfG/Vmh/K1Ba2slHu+g="
	},
	{
		"path": "assets/loader-sq-AL-fshybx7y.js",
		"integrity": "sha256-53uIPLgrwPbaiYtdMA92lQDI4uX+K8fIO4e6yhBUIzk="
	},
	{
		"path": "assets/loader-sv-SE-ju3o3lcb.js",
		"integrity": "sha256-hwZaziLGNkyR0PP8J8Ap9tykPASjmGbI7DF9HHhJmmo="
	},
	{
		"path": "assets/loader-tr-TR-jzp0nz6b.js",
		"integrity": "sha256-h6Hw0qfvy8TyrhUqZ9cPW0dP2TpZ5U+enSAvcmuaVZc="
	},
	{
		"path": "assets/loader-uk-UA-m5jz7yz0.js",
		"integrity": "sha256-0r4wn2h/DS98iH5G0zLMbtpt4vWbjZRqNKRAOs0eVoU="
	},
	{
		"path": "assets/loader-zh-CN-dkvnjjpg.js",
		"integrity": "sha256-o3d+adnUgrF6jnyPHuNHJJUJmzoXVlWGxJ8qI2EEu4Q="
	},
	{
		"path": "assets/loader-zh-TW-usbgwq04.js",
		"integrity": "sha256-KMd6fPaeShQOXjAqbiLQNgZ93GbXGjYj9nhyn07w4Uw="
	},
	{
		"path": "assets/lottie-oo98t5di.js",
		"integrity": "sha256-5zHsxDDS9rqx/F2AqJP6kAzMymiRFZdy7AYbArJZApA="
	},
	{
		"path": "assets/low-i4syrotf.css",
		"integrity": "sha256-YyzK+iVRm5xI0N2Vem+9IpY1VlgCTlaS6lVLAYvn9uw="
	},
	{
		"path": "assets/manifest-9c0272c3.js",
		"integrity": "sha256-OKfAezNUNS8k8pMj1aY1XCIbX3fuRrsXHNsbqv3d8VQ="
	},
	{
		"path": "assets/mapStoreResultStatusToXboxPurchaseStatus-k5b1k5ku.js",
		"integrity": "sha256-7liOQz3I2Fl4a7U/teCMxFhmpMPyKdKBuQJwfwEZ38Y="
	},
	{
		"path": "assets/mobile-app-qr-ks3cr11i.svg",
		"integrity": "sha256-E/dQndiXm3eY17s+4q9P5R9+hk4tNQtqhifSe7VPRMk="
	},
	{
		"path": "assets/mockConfigProtocol-f0ev6mmy.js",
		"integrity": "sha256-ThKOq9fkrFuWWv6vIiMOLQgWJfcywsIodLDwAWnv948="
	},
	{
		"path": "assets/nativeStorage-jvffx4yv.js",
		"integrity": "sha256-U3yby8U+M+21/cbdIntWwfi8wgMCxcR8lhU50FMi7M4="
	},
	{
		"path": "assets/navigation-stack-m5o0zkpw.js",
		"integrity": "sha256-cnJScZ9o1IvaZZz5cslgICV1HRmIRTV5h5vMP2aqaGg="
	},
	{
		"path": "assets/openDialogSchema-jdirgrus.js",
		"integrity": "sha256-dnHsRdwbMumONtU0n3K2DXF028h+j2eEpOPCUTRcn+o="
	},
	{
		"path": "assets/openNetworkSettings-cgabhauj.js",
		"integrity": "sha256-R+TdH3IlAyS064zIQ5Gz/2b+42idakGQv02xZKiLBM8="
	},
	{
		"path": "assets/openNetworkSettings-lhfkzeb0.js",
		"integrity": "sha256-R6Fhs8bDrUUFZIIQP0PX/sYMaBxNtiOVvk9unVTi7i8="
	},
	{
		"path": "assets/orange-ema6fcnv.css",
		"integrity": "sha256-IKdyDbCywvo+l3ZMcMzKVwqF6V1wsfLTx8sGmvwYE8k="
	},
	{
		"path": "assets/orange-ibpyjmye.js",
		"integrity": "sha256-FAstBF5vTIkv3l07cjEzfBWJI7Fbd6QeGTVsrcFY0F4="
	},
	{
		"path": "assets/ossNotices-nwqrwgqn.js",
		"integrity": "sha256-5MNHSQV9+uTAFjyFeT1YNXJlYX4Z+GXPEYiyDDDLmKg="
	},
	{
		"path": "assets/parseSearchParams-lzmzldiy.js",
		"integrity": "sha256-ARwQbvJ6HErM5yVzO/74/Wfk/s8hIYGnNrfuDUBIMYk="
	},
	{
		"path": "assets/pidlsdk.resource.helpers.module-lmygf733.js",
		"integrity": "sha256-4G+daFic6rcUVU/HtdPT/XB+HYhp9hDmvX+XGNB5jyc="
	},
	{
		"path": "assets/pink-d8dsctok.js",
		"integrity": "sha256-h/DUEESder+WAquQrCX0ICW4mX6MZDxyP4o+Nb2/P0k="
	},
	{
		"path": "assets/pink-mdwu1xnv.css",
		"integrity": "sha256-j8WOpQ35vM21S9NLCYBCmjVpDzRztadgD8cJyI6JSyo="
	},
	{
		"path": "assets/priceHelpers-jmxztd6p.js",
		"integrity": "sha256-R0imuJLn3/iV5cP1Fwbo7ytCkMjViUdAzBfp4AnIIrY="
	},
	{
		"path": "assets/privileges-jro7zmhy.js",
		"integrity": "sha256-TfWp8BU2j9gls1M1Rdf2UT+0K0gOh3EcU6TL+5Z6F3c="
	},
	{
		"path": "assets/production-h2z26wh6.js",
		"integrity": "sha256-Vq8zxOAdW/rWXBYyWUADopmr+kWlP0V7DuA5GtLV0t0="
	},
	{
		"path": "assets/purchasePageReadyUtils-n2r38x2a.js",
		"integrity": "sha256-D/mBjwHkZQKnat18CER6FtBeUiCHjaKJZ39gszud8QQ="
	},
	{
		"path": "assets/red-jbbj56m4.css",
		"integrity": "sha256-9jJri2YFm75yS7yn96JDovPVnU9Q8YFDUCvK+ibT5T0="
	},
	{
		"path": "assets/red-waojdr4d.js",
		"integrity": "sha256-03qG74eFim9KTbcDPI6UR+cxpYVIOtWY/vt6cDM7GIQ="
	},
	{
		"path": "assets/relyingParty-l51ajef0.js",
		"integrity": "sha256-UC5dKMQp16wsbji9d72Hu/xvZ/K0vsjan+COeXwWMAE="
	},
	{
		"path": "assets/responsive-toolkit-nc72eouk.js",
		"integrity": "sha256-Crcbg021kbrMhXsIhM3MPkEYXI4EbYII2/36YbuIvYc="
	},
	{
		"path": "assets/rolldown-runtime-eb2nym32.js",
		"integrity": "sha256-jStMfj2hwYzcTPBCJkGtPcE3InsBA0kCh2W3fuKKQtI="
	},
	{
		"path": "assets/root-iz0kwbpw.js",
		"integrity": "sha256-gjnGof4tII4fuTm+MH2Za+LLchpxfhYgdadlRGBOx8c="
	},
	{
		"path": "assets/routes-bxal063z.js",
		"integrity": "sha256-Ja6Rx3hIsSz1wm6ZkAW53HQcd9IzMbpzwBcCZYBg1j4="
	},
	{
		"path": "assets/routes-cum86uu1.js",
		"integrity": "sha256-uCSLaNrR5b6pD0YuPWoOzIewF+jGjWl8RVbxh0MQ1eA="
	},
	{
		"path": "assets/routes-ewiustbc.js",
		"integrity": "sha256-dGeRxL2zqgV780u91lUje60F4Nupsn/yjZb5HA0gmV8="
	},
	{
		"path": "assets/routes-jaw4ngve.js",
		"integrity": "sha256-VlYQHOFdcXlEPaejCsjwNuZ/D3o+RD2kWiBSve43DX4="
	},
	{
		"path": "assets/rumble-store-mos1cmlq.js",
		"integrity": "sha256-11EuAQW6/E4JpGvBKRGwJh/Kk3KfsIcoYiJQbGV5TFU="
	},
	{
		"path": "assets/selectors-jy7eaal3.js",
		"integrity": "sha256-m1b32XXPFoGk+HbNQdPp36Tp6I/GWlzxi3tZCA6IQ/U="
	},
	{
		"path": "assets/series-s-fg0lid33.png",
		"integrity": "sha256-Fg0vdgV7xTUT+eVC1uhjz5/n1QbG4+pQUHTpvPSgTC0="
	},
	{
		"path": "assets/series-x-dosmzchu.png",
		"integrity": "sha256-Y99DPKjY4sVrV+hcaMwx75otb7Kj8/kOjraLOEHTjqY="
	},
	{
		"path": "assets/slate-6mel6q8v.js",
		"integrity": "sha256-3KWWJ4Of9732T8y737E3dID/eDgexGV9ZipTRV89GYQ="
	},
	{
		"path": "assets/slate-hkkujtoy.css",
		"integrity": "sha256-ByFd11XppRx9czD5o+I5pMK4zUglO9+qGR8tYv734h4="
	},
	{
		"path": "assets/smart-tv-help-qr-efybpt6d.avif",
		"integrity": "sha256-l9uVxdbO4utEMxfxZr8qRMShfP9vfiuKtzww7Eh2vmM="
	},
	{
		"path": "assets/smart-tv-help-qr-ionlzhbc.png",
		"integrity": "sha256-vS1TuUDY+f5yrjgpenaKoo8uA6NRWJLdhAWcHJjdc3c="
	},
	{
		"path": "assets/smart-tv-pair-qr-gbtuapk3.avif",
		"integrity": "sha256-iH61hppBxcsEnWUtwUswDMb8Mmk6jMGoMon1ZAeyZ2c="
	},
	{
		"path": "assets/smart-tv-pair-qr-kqcu2x2t.png",
		"integrity": "sha256-PjVEa//+aRSsnQD4TECmS015EWudF3PCBqi1AIXpusQ="
	},
	{
		"path": "assets/src-ln7rh653.js",
		"integrity": "sha256-zTC4TEfs0CSa1VIrRBc3fd432+IqrOIq0i22iiFKg3g="
	},
	{
		"path": "assets/standard-dark-j5grapun.css",
		"integrity": "sha256-11GjqFRkgvCBrsSdj+//yknoLArF88xilxlCwxiOKzM="
	},
	{
		"path": "assets/standard-light-dgin4sko.css",
		"integrity": "sha256-7X6qqButItWOjcVMJg1UBfSG7vAsoeUgHvztcrnHtZI="
	},
	{
		"path": "assets/steel-nevvao17.css",
		"integrity": "sha256-UItQwMyKhSrDB84F3ninsw2u8FvQibrpHLb0Y/ZHW2E="
	},
	{
		"path": "assets/steel-ot2qi7mi.js",
		"integrity": "sha256-4ECascE/+7hzHJHccODKr2+QL12zThBYdXnIm5nqHI4="
	},
	{
		"path": "assets/stream-gate-hooks-fa9kj8pw.js",
		"integrity": "sha256-QETYfGqknqgh4Ic7nAAgSoYNpbbNkl3moOrzb0Ij+LQ="
	},
	{
		"path": "assets/stringify-i87igzza.js",
		"integrity": "sha256-zQnSpL8cFxAm8SX5qracpmqTkXUSKjAco/Dx3RKS+is="
	},
	{
		"path": "assets/subscribe-dark-ytq1g4n5.svg",
		"integrity": "sha256-xhOxhmlvuh1mvnWcykUeGNfDq1AAlg2MX/ji7XsHZcw="
	},
	{
		"path": "assets/subscribe-light-ln6qgeim.svg",
		"integrity": "sha256-ke5ArANBcBxVfPcYrQu98/RrqIg0kkYlQe49Bm9+/JQ="
	},
	{
		"path": "assets/tagSelectionUtils-nzz7bakq.js",
		"integrity": "sha256-30cx7g+kpq804w3ljivyyu2zEtv4rjQDdmE478UsAYw="
	},
	{
		"path": "assets/tailwind-ksy7kudd.css",
		"integrity": "sha256-AE+US+rWmQru4uosEYtwFmHHeJSbMG8UBYGeTTAMs9E="
	},
	{
		"path": "assets/teal-ckzbk7l4.js",
		"integrity": "sha256-sHGgGhgr4EcdlJniCeR1Ydtoo0nktMBRABkV1pZm3G4="
	},
	{
		"path": "assets/teal-o7f9dtnd.css",
		"integrity": "sha256-egAm21f7i7vMfK4/Lm4NLR+O2bWFwoLXJMxm8LW9vYU="
	},
	{
		"path": "assets/thinEngine-j5727mju.js",
		"integrity": "sha256-7t6NseFLO+n+wY7XTdAKGl9UUqifaunLG2qxDIWFyhQ="
	},
	{
		"path": "assets/thinEngine-ku9ex51f.js",
		"integrity": "sha256-ssGQDZZOGCCBi0IyBB3OW1Bmfhib01hbBMioY5YiTBs="
	},
	{
		"path": "assets/tizenHelper-0y5v5d46.js",
		"integrity": "sha256-rlHF+67Dvoggx1+Ft7TapTHNFWOc36J6wT5HxoBvLP0="
	},
	{
		"path": "assets/tokens-kujvecol.css",
		"integrity": "sha256-vD5OfTV7dVdyZ6UBj8nU7xkGd9RVryVvimBCWnqjDWQ="
	},
	{
		"path": "assets/types-gp0w1ger.js",
		"integrity": "sha256-8Rom5u4wvVmtkPZd6NzjZBGEbVmqHK4huxRoWfIhh8Y="
	},
	{
		"path": "assets/uhf-ar-sa-fen3sxsm.js",
		"integrity": "sha256-tPpvw6gLjg1PGMXhCZYbXjVUi+BE5+5atRms82fd81k="
	},
	{
		"path": "assets/uhf-bg-bg-kf8az9i4.js",
		"integrity": "sha256-d2QCMPKvPdlWGsLT5kyNpMBwkv7fZTeS4MN44mHPSKc="
	},
	{
		"path": "assets/uhf-bn-bd-1mug019h.js",
		"integrity": "sha256-b8ep6BH1EJjZ8zKJGdp5l5XcLVK//1Jtr+3yAQpyxEQ="
	},
	{
		"path": "assets/uhf-bs-latn-ba-j966anle.js",
		"integrity": "sha256-2rt6N1w1AljrhgG7vEjejI/CxXkG5bzcup8OSCmUiCI="
	},
	{
		"path": "assets/uhf-cs-cz-t5z0z61j.js",
		"integrity": "sha256-5u/UCdC4Lcd+yqPazjpw3OsD5EdDkEB75p6MuXLg/jY="
	},
	{
		"path": "assets/uhf-da-dk-npnhc4l4.js",
		"integrity": "sha256-qJtrs2FU9P0XA3UD7Rn0YJPzB7C4z37oqLXjWPAmXZE="
	},
	{
		"path": "assets/uhf-de-de-nlhzbeqa.js",
		"integrity": "sha256-3Y4fy3V6pDo0WIYcO31Beyvhpq7lYfPoO43tc4FWWDM="
	},
	{
		"path": "assets/uhf-el-gr-eez7wf4w.js",
		"integrity": "sha256-sUY9A26KmqpgMHF/IoXat+vpOq79/HhZSD5wgv+0hG4="
	},
	{
		"path": "assets/uhf-en-gb-im187c8x.js",
		"integrity": "sha256-nKFTO0bUaOgVXhD75f/FDJFPjcPhWYy1jeuALmTmAtM="
	},
	{
		"path": "assets/uhf-en-us-bpzytxt0.js",
		"integrity": "sha256-H3NHgxZvr5b5AzFxqnea48AePbxMY9JWU0l01Xyp/Dw="
	},
	{
		"path": "assets/uhf-es-es-bqcuhwyz.js",
		"integrity": "sha256-3UP6z2B1mq+mw+4sCtVpGG51dR5BpVkvuXBODXg1j4s="
	},
	{
		"path": "assets/uhf-es-mx-m89vpeic.js",
		"integrity": "sha256-g3KvAbai1ZkW15SZymn8C5EAlju3WSJK6Xz7GfbWXtM="
	},
	{
		"path": "assets/uhf-et-ee-ng61ourh.js",
		"integrity": "sha256-7oMUgHqyDDBg5JKWqxe8NeTNVcBHROL561XwGEBGYiQ="
	},
	{
		"path": "assets/uhf-fi-fi-cjr6cuwu.js",
		"integrity": "sha256-NZJEuPxLKPAccw1chL8ITeXAD25prsDofRmFxSjNtC0="
	},
	{
		"path": "assets/uhf-fr-ca-ir8z2cnz.js",
		"integrity": "sha256-tCspHMS+zmxrVJ82jlQpRJ9TIVJOSP9z+WQ+wQYEn8U="
	},
	{
		"path": "assets/uhf-fr-fr-f0udve51.js",
		"integrity": "sha256-WbFz/64rSmgY39n0mstJmlZGFP15guI+eWFlXUYXdOQ="
	},
	{
		"path": "assets/uhf-he-il-odut2y22.js",
		"integrity": "sha256-IGxBOEZnEXNthwgkConel7Cq/PW6MORSkInhumsVJXY="
	},
	{
		"path": "assets/uhf-hr-hr-hiauif71.js",
		"integrity": "sha256-wteSh9Vn8XDaY32oO4YpuNoctO5fWx1SdgNWUabdlf4="
	},
	{
		"path": "assets/uhf-hu-hu-g08gyvvj.js",
		"integrity": "sha256-f1WrdqdI36rI30rdVgyC4/BNT9Pz8PRUz0ey/Kj8MVY="
	},
	{
		"path": "assets/uhf-id-id-d868sssi.js",
		"integrity": "sha256-D0gIwnmuL467OIh1qdXTCDVkQlpcuBfkGdVaRyMt8JQ="
	},
	{
		"path": "assets/uhf-is-is-mmocktzo.js",
		"integrity": "sha256-tbUM0HGMLgLdISZ9OWHJbpdi3dLo6rL1O9s7aMKZAgs="
	},
	{
		"path": "assets/uhf-it-it-e8573v4q.js",
		"integrity": "sha256-y8cpAZenl+A0r/U9a9a70ddJ6QXQtl+KZhOfTkLtSYE="
	},
	{
		"path": "assets/uhf-ja-jp-nz77q7dy.js",
		"integrity": "sha256-s/uLuu4/ruWLqXhHLruXQzcKiXUodkJqqBORlGT20NE="
	},
	{
		"path": "assets/uhf-ka-ge-oybpzl9u.js",
		"integrity": "sha256-6FAB2Sqtf+jlyY1VaizNQ4jldoaj2FS1+wNNR/uLkHU="
	},
	{
		"path": "assets/uhf-kk-kz-llfx98ah.js",
		"integrity": "sha256-hEWofz63dCwAEx/QXJV6m+z8YfkQQkdWzCrqbkHjr0k="
	},
	{
		"path": "assets/uhf-ko-kr-j3botbn2.js",
		"integrity": "sha256-3XY1peScf+YPa5TInb6cNI+07DVcC2HdELOSsbxQKcI="
	},
	{
		"path": "assets/uhf-lt-lt-m7ojiddf.js",
		"integrity": "sha256-eM++V8XlaZYIER8yQFpdiHjyYmnYKSZAs0j+luIIIyA="
	},
	{
		"path": "assets/uhf-lv-lv-cwazltsc.js",
		"integrity": "sha256-i6lZ4F5gYA6v0kqpUL5NytYfGLN3Jh4jiR2bfYPKqGY="
	},
	{
		"path": "assets/uhf-mk-mk-efq2kr9b.js",
		"integrity": "sha256-4BmhJfMIp7nZfVCza7MRLlZZTXR9o9qVJXbqbdJkQGg="
	},
	{
		"path": "assets/uhf-ms-my-f6itc8ag.js",
		"integrity": "sha256-4iv5kjKMrHn/n4a062Ews5zFx/wdjOzSjZ5+6XdE/j0="
	},
	{
		"path": "assets/uhf-mt-mt-cgokqxnu.js",
		"integrity": "sha256-mFL5i99vOCaZ/sLlcTU1THU/tOVZXuVcEfWISpaHTGY="
	},
	{
		"path": "assets/uhf-my-mm-de2555rt.js",
		"integrity": "sha256-K099se/PHuIsiuIKJtMhnRmUHLUVKLeO0h2M0gEVtAM="
	},
	{
		"path": "assets/uhf-nb-no-f4y4w98h.js",
		"integrity": "sha256-lXBY2UNBfdHaInFCO4BPDaRdETrXPWwhyL6NLnZjlpQ="
	},
	{
		"path": "assets/uhf-ne-np-h8ccvpye.js",
		"integrity": "sha256-N5jz2t7IQvLFzczr7HM3O5JEnJWlRmxUzd44dO87Abo="
	},
	{
		"path": "assets/uhf-nl-nl-bpzdbzyh.js",
		"integrity": "sha256-hnXyCgMGc1U+SKJQXMgmak5LOUHwh5TfEM75em30+vs="
	},
	{
		"path": "assets/uhf-pl-pl-wl20ym7e.js",
		"integrity": "sha256-acIOB2+31UI2WMMdDaxDKdWuM4EAJn7CFXD1sEShFng="
	},
	{
		"path": "assets/uhf-pt-br-ow31wlv9.js",
		"integrity": "sha256-3nddFxOaNQ3CqBUU17suQtcqvKStFIJzrCdQtKDlcu8="
	},
	{
		"path": "assets/uhf-pt-pt-oq0djqy9.js",
		"integrity": "sha256-1ruXqR4BR9DpszCBvs9zDbD1DtUiEAis/to3xGS/UD0="
	},
	{
		"path": "assets/uhf-ro-ro-nlnvv2pf.js",
		"integrity": "sha256-Efi6eyAKCwMt0K2bCfcuHNUGQP23aZapfps+iiFBsk0="
	},
	{
		"path": "assets/uhf-ru-kz-jjkr9ccq.js",
		"integrity": "sha256-xC6phN7V3Sy4yysIXUFekaLsRyLUvFMEyFvb56EhN9I="
	},
	{
		"path": "assets/uhf-ru-ru-mxx4wl69.js",
		"integrity": "sha256-1n19LLvy+yeTCvabpZLbHhmZTlUrsup3P3nEER6nIBk="
	},
	{
		"path": "assets/uhf-sk-sk-hynd0gpz.js",
		"integrity": "sha256-+0482gyPabUnUU3OwuRQXvdAkI03OTDQKgAyP9eKKUc="
	},
	{
		"path": "assets/uhf-sl-si-m7jm8hue.js",
		"integrity": "sha256-BX7heC8UB5L8HaOZbU/tkAq4T1lCckFN4Rc51ZUISV0="
	},
	{
		"path": "assets/uhf-sq-al-gjz359xj.js",
		"integrity": "sha256-LmYLVZaBUOx8qEIY/6TNwWLxmoTF5wj4XtglvRlMUzA="
	},
	{
		"path": "assets/uhf-sr-latn-rs-ltgsqr4w.js",
		"integrity": "sha256-Sdemi1OBiql4HpcmZn8cI0yNoctU62ZfAw1ll1xxMyo="
	},
	{
		"path": "assets/uhf-sv-se-gafztn5v.js",
		"integrity": "sha256-6X3FKe7dUA2qbF/iJr3l+Pu7NPfdpmCNXvLbJpup9XM="
	},
	{
		"path": "assets/uhf-th-th-m42nci5q.js",
		"integrity": "sha256-2j9E45GM+/j3ImI1TFcDQqBPnZKsxFY/VzI1wu4WQOo="
	},
	{
		"path": "assets/uhf-tr-tr-g4i6tx7r.js",
		"integrity": "sha256-FT+wlgw3ygvooS3wXSdA1bKajmvIT7Z2BuHlAAhr+Ig="
	},
	{
		"path": "assets/uhf-uk-ua-k5m3tr98.js",
		"integrity": "sha256-QPiMXp/GbW5Myw10Gq8nsH71AWydBM1neyrKP2kyZw8="
	},
	{
		"path": "assets/uhf-vi-vn-kdo6b3h5.js",
		"integrity": "sha256-shUfOhQB8O758rjMM/iYHVcf6j4VCNEQasyt/9cY7KY="
	},
	{
		"path": "assets/uhf-zh-cn-kc5p3p7u.js",
		"integrity": "sha256-sTb+oR7ov03HNvFLzCVDin8y4118WiykmSuwS7Q/jKU="
	},
	{
		"path": "assets/uhf-zh-tw-e4imaf95.js",
		"integrity": "sha256-d1HFEpiumFCdyNpPORX7YPogKldBkpbrxNvbMlkXXgA="
	},
	{
		"path": "assets/useAButtonHandler-ftqyzpyw.js",
		"integrity": "sha256-8nHEp6MDk5fP2Bt6DsAwz78ZhlryP8YhtVE3996Dgb4="
	},
	{
		"path": "assets/useAdditionalContextForGame-ofd6rsxu.js",
		"integrity": "sha256-t6IMnSSyMZBG9QbEMs7c+1HGMU9s7BTM+/uHk/eHnNY="
	},
	{
		"path": "assets/useAnnouncement-cz71ehgy.js",
		"integrity": "sha256-5kqZS47A6fjljWqdxlxE+G6HNoHD5dhn4VFnCtvxgnY="
	},
	{
		"path": "assets/useAutoFocusOnNavigation-gd2bn98v.js",
		"integrity": "sha256-Stl+LLpZlH0nQP/VQCdTOF1bMvzHnVBXskaaz4jGgO4="
	},
	{
		"path": "assets/useBackHandler-hk8w5qbn.js",
		"integrity": "sha256-BYaVyxhskJUKSeYRHL/plstScdHAso3Ncz02c4+FMuo="
	},
	{
		"path": "assets/useCaccsConnectedTranslation-ibv0e51d.js",
		"integrity": "sha256-qZQx0FYBykT5c6jjpheSOi5/WNa1hiyRvgDbubiHxeY="
	},
	{
		"path": "assets/useCenteredPosition-my4b99cu.js",
		"integrity": "sha256-fbrupTKB6guadvwC+vUKgYdH+7sV+LXv/s/2BVxZEHw="
	},
	{
		"path": "assets/useChangeGamertagStrings-ks3jik87.js",
		"integrity": "sha256-9PB9UIxKkpwNrAXtiYAQMX+dvDk7c1KOfL0bNN4jRnY="
	},
	{
		"path": "assets/useChatStrings-ddn3ault.js",
		"integrity": "sha256-HhfNOR4YBnvbV6VN/RLY2TQ8qjZ9VPZs1Gh5WRGV8O8="
	},
	{
		"path": "assets/useCloseHandler-ct51xnyg.js",
		"integrity": "sha256-QdrzJTdNzTtHczmh8Hk/i/8hJ+8eYgrAWjolPFNrnEA="
	},
	{
		"path": "assets/useCommonAccelerator-gnlmbc7n.js",
		"integrity": "sha256-fJGjb2jgKT1lCZPd5gXsRGuoZsjvZ3oMv+sIvRIp1kQ="
	},
	{
		"path": "assets/useControllerPairingCommonTranslation-lqkd50h0.js",
		"integrity": "sha256-4YMEawWFjgNGaIMjTStnaN/54JCpXlbIfJA2vweYuNo="
	},
	{
		"path": "assets/useConversationHandlers-jm7mz07v.js",
		"integrity": "sha256-AgUdKceKNlXeINEsbTtfTiOTHyuPtFws14rrg0tjxxY="
	},
	{
		"path": "assets/useCreateGroupAndNavigate-ebmfegn9.js",
		"integrity": "sha256-h636QjUt08vlh5HNof1F4VGtJ1kC0XTCr8wRIR2e1S8="
	},
	{
		"path": "assets/useDebounce-iucu4c6g.js",
		"integrity": "sha256-FaPrX8KxQdwTh45DLX2+z+g9yWyeZBulmXaMEDHKtsY="
	},
	{
		"path": "assets/useDeferRestore-dt4p0xnv.js",
		"integrity": "sha256-i0lxlLudFzAb3odGKROVaZcvdWj6VkNv463B7ObPDHM="
	},
	{
		"path": "assets/useDuetDialogStrings-kqmo6gxw.js",
		"integrity": "sha256-Qv2iM3VOr5m6WUuYkwwkHvednYBO2F2wL47skyCj7NI="
	},
	{
		"path": "assets/useDuetFREDialogEligibility-e4ea8mkh.js",
		"integrity": "sha256-MJn1u61EB8Ga4P8HBox7YckPwelEA/4/sKyb73T6mGY="
	},
	{
		"path": "assets/useEmitGameStreamDialogEvent-dljcy1v9.js",
		"integrity": "sha256-wFTLaEywaVa/PvRfStFzGATUIxPYvI3Hhd3ByQRJ4uM="
	},
	{
		"path": "assets/useFeedbackAllowed-gk1zhv9k.js",
		"integrity": "sha256-MUq72A+wHUWdEioL9qHDm00lNB+PbUfaHwJ/jIo1chY="
	},
	{
		"path": "assets/useFindNewFocus-kskwmu1u.js",
		"integrity": "sha256-aJS4IBsbYOgq8fQrXOPLgGkYVDikp/kfunmUdOqTJsg="
	},
	{
		"path": "assets/useFlowId-n9vqrww9.js",
		"integrity": "sha256-6GYXiClxeX7GMXFMx6ln0OblLFtzMRm+izufa9itG3k="
	},
	{
		"path": "assets/useFormatAmountOfTime-njujwiij.js",
		"integrity": "sha256-Pu9ynsBCS5bRCiqd9h4BTLw1JgCNajq1e7EG65QU2Ro="
	},
	{
		"path": "assets/useGameStreamDialogContext-ivl0rv5q.js",
		"integrity": "sha256-5dMxWwjYkTQWdQItVmHxb3aYn9Ccw11HIphmOsxJxOc="
	},
	{
		"path": "assets/useGameStreamProps-h4pgc81o.js",
		"integrity": "sha256-72i/yCdbeqX5rAyuDOMx4BF8kyC/7szHxPyqzYtky5M="
	},
	{
		"path": "assets/useGenerateQrCode-eafstml0.js",
		"integrity": "sha256-b/WY5UIcyGkGzHNUy3M4BQdEpj3KqCt0cBc15cAe7ug="
	},
	{
		"path": "assets/useGroupConversationHandlers-fvgs4r14.js",
		"integrity": "sha256-agm2rBom+iYD5yJ71/vzE9fvhvM/sDr5G1OO+ynj9uc="
	},
	{
		"path": "assets/useGuideStrings-d2n0srzf.js",
		"integrity": "sha256-oN3hjLiOQUIfkV8l918/pkc80KOYr9wJcS0pwhMJn+A="
	},
	{
		"path": "assets/useIconConstraints-pewa2c3o.js",
		"integrity": "sha256-a1hGE88+xqfdS4WgkOVyKnVVPetQpp8xNKqGnaVnTzQ="
	},
	{
		"path": "assets/useInitialFocusIn-fziws25j.js",
		"integrity": "sha256-y2yS/CY02D3U6DRl7H6dCd5VybrkjX24/HkYKVGadco="
	},
	{
		"path": "assets/useInputIcons-gmfoyaf1.js",
		"integrity": "sha256-vWCl5O9SW0oNIyDiZGUpHz4BOU0KinVQneKtmCtY8wg="
	},
	{
		"path": "assets/useIntraDialogHistory-jdzxwi77.js",
		"integrity": "sha256-OjccCpzmrSmvamwxVtMGVo62cbVhMhOV4kLxJNgp62o="
	},
	{
		"path": "assets/useIsDuetUser-fcto9lm1.js",
		"integrity": "sha256-okQLvDAEyzrZRuX/U1MDhPW1oiRZmalO4OLYp+jB034="
	},
	{
		"path": "assets/useJumpPartyState-ouv42xfw.js",
		"integrity": "sha256-1J/0oK50aDz8aOvpvq7Fq2N10omZd0y9IKf1WNWqlRA="
	},
	{
		"path": "assets/useJumpStrings-kzg010sg.js",
		"integrity": "sha256-J1PcZPA1a7+s9Xz7kZv6SC6zGupDtTgeJsgqMfOLl+M="
	},
	{
		"path": "assets/useLabelForShortcut-d45njste.js",
		"integrity": "sha256-aMl3fhSu8Z9g2O23Fau+gr8nkGHZUIzqDvMtfIXKdzc="
	},
	{
		"path": "assets/useLibraryFilterStrings-g28ocqtu.js",
		"integrity": "sha256-minm/WPEUkjDHnqWC4eVTGjg1291bS2AwtQM9hLT9h4="
	},
	{
		"path": "assets/useLocation-fu2554ly.js",
		"integrity": "sha256-j7cgSmW6SVezYSkPfLxq9SZPVeQp4pXUAMgPQ6Ur2TQ="
	},
	{
		"path": "assets/useMatchMedia-ou8sntjn.js",
		"integrity": "sha256-EUAINQ/gW7rRKLiEg7wXgHn+DTmtI3Ash01WWO4xrPY="
	},
	{
		"path": "assets/useMicrophone-dpqw35jd.js",
		"integrity": "sha256-ZBjJe9b7l34s2a3UfzvSm7GD0RAuqmvZ0CC2G6J0H0I="
	},
	{
		"path": "assets/useMountedFetchMessages-exje9cl3.js",
		"integrity": "sha256-eOkUF0rcOWpte5MOv5tFTrGkGro7i5D5/BiAk7yoLA0="
	},
	{
		"path": "assets/useNoLocalMultiplayerDialog-accd2ulm.js",
		"integrity": "sha256-S9qg0ankW8o5ejYFDQdeovcBaU2Gcn01F+kEnwlJZ28="
	},
	{
		"path": "assets/useNotificationStrings-lwcuduja.js",
		"integrity": "sha256-FOeSGdv9wPbtf9b9hnOCkojtOxO80agsUYk9QqsQu5A="
	},
	{
		"path": "assets/usePageProductBackgroundImage-febn6trb.js",
		"integrity": "sha256-go26kl++ht02evxs+S/Jwgo9f2aw+k4iSzkhyJzu7mo="
	},
	{
		"path": "assets/usePersonData-eox3kazb.js",
		"integrity": "sha256-T/C7/YmdFb8aKPjmCW6QIOe4gQOHCymePKtnMzHeXjk="
	},
	{
		"path": "assets/usePlanPickerProps-kd3toy2t.js",
		"integrity": "sha256-FrK6xtmO7DCT+dnHKuSQoQRvb9ntqrH0dgmTjJD5DHM="
	},
	{
		"path": "assets/usePresenceText-ojb3zf4j.js",
		"integrity": "sha256-auHTi/JMx5QvTkI+TN96hdjjvseXQh1Ya7ekHAWdm+w="
	},
	{
		"path": "assets/usePrevious-launn218.js",
		"integrity": "sha256-50OweT1l6Ed20o3wUItwCS7Gkn3FRDTNYRT7Gl4IUcc="
	},
	{
		"path": "assets/useProductWithNative-olp3h1g0.js",
		"integrity": "sha256-uySsc5v0Qs90gm5gFdwTSCUcVcQP7nPj+2JQs6CeFPU="
	},
	{
		"path": "assets/usePurchaseCoreRoot-ijsnuj8g.js",
		"integrity": "sha256-w2kxCZ6Pi47WE4X15hFJof3+9xWjgxeIM99LXfSuIG8="
	},
	{
		"path": "assets/useRecentsTileHandlers-on4lue0a.js",
		"integrity": "sha256-McF0C/lUxGitjeVye4KIkTiD08HPO16U07wI1i0vPVY="
	},
	{
		"path": "assets/useShouldUseDialogNavigation-m43o5g92.js",
		"integrity": "sha256-9qj13BjSPv8C1DxkrGwkK0AQJu4zFDvjrU/BSZYXx0M="
	},
	{
		"path": "assets/useShowControllerVibrationButton-bth88xjt.js",
		"integrity": "sha256-9/YSihAt4Y4NwKVlrD6Vqay0Fo3zifRg9C3s5BMHYhw="
	},
	{
		"path": "assets/useSiglTitle-jb9drhg6.js",
		"integrity": "sha256-YkaNTNVCBX5BHw5TJNWF8Wlghb/KYITXynw9K4X5m6M="
	},
	{
		"path": "assets/useSingleAchievementInfo-grup6hnb.js",
		"integrity": "sha256-PGg9O8rscndsRMaf4rBFLYZ4pd5E3xsN/uyeq5Jhj54="
	},
	{
		"path": "assets/useStartParty-ooqgumui.js",
		"integrity": "sha256-RqqWfzDF4+9hYZIr0SPb25ubCt2U1GuowEAsgRiJa/g="
	},
	{
		"path": "assets/useStreamAwareSignIn-kz1c5bg4.js",
		"integrity": "sha256-5cz7XnwXHGfLw2wR6zwX52W5Bhlea+Uzjiv06hBerqU="
	},
	{
		"path": "assets/useStreamTimeLimitCountdown-egttnrn7.js",
		"integrity": "sha256-UiQpixgaZIxxw29nGuAtN7rC9DdL1Qg3NI4C4Smn2MA="
	},
	{
		"path": "assets/useSynchronizeProductVanityUrl-oak38o4v.js",
		"integrity": "sha256-DWCV2Vhcoh02X/FoipFa5HnVPQtTujxE+L5+F/q0fBI="
	},
	{
		"path": "assets/useTimeToHowLongAgo-m0zux8ws.js",
		"integrity": "sha256-5ylOGxeNbo/kB+Qlws5pyc48MensBfE3rTFL3IXy6kY="
	},
	{
		"path": "assets/useTimeout-cqe06frz.js",
		"integrity": "sha256-OXhm3h3fBxGZIejFi2o+/EKyek8uLnVxtWEPF11Zru8="
	},
	{
		"path": "assets/useTrackFollowInteractionEvent-nzg7qg13.js",
		"integrity": "sha256-ViSAx283yiNVC00vMLv7JRncH0JqA9l5bCfAoGUMjzI="
	},
	{
		"path": "assets/useTrackFriendInteractionEvent-lbshvafm.js",
		"integrity": "sha256-d2CCd3bOG7I6ovs8jRrW97MWVckrnppmBWh0PW1oglI="
	},
	{
		"path": "assets/useTrackPrivacyInteractionEvent-bjoxdxky.js",
		"integrity": "sha256-8gYyjhuiE46CPEcsix4Sla3rHkndYTXXjna60Bo/BYI="
	},
	{
		"path": "assets/useVirtualGridImageConstraints-ebaknf2s.js",
		"integrity": "sha256-QdhyJWDZJ/FOEE9/vn5vnnOZKrFoD8wbJeTSATnc3uQ="
	},
	{
		"path": "assets/useWebShare-6vkberi0.js",
		"integrity": "sha256-/iurQbhejYUbD7KVhCwENVai9SlGZa/Q7oSIzzWHx8Y="
	},
	{
		"path": "assets/useYButtonHandler-fu1lospy.js",
		"integrity": "sha256-5XiqEuIaquApq/+VpLvYnEhmGPqpgb/1fHkAHpGFF8o="
	},
	{
		"path": "assets/utils-dl8y1ehv.js",
		"integrity": "sha256-zO/6q9Q42WdVt0jjdkdske4W2cH30X01eiecXFlyf4M="
	},
	{
		"path": "assets/utils-lgzuat62.js",
		"integrity": "sha256-Kb2jj/pMTw/EAo7LquNJaOBTzYOFqZRA+iE8m3FDkn4="
	},
	{
		"path": "assets/utils-njknyvpy.js",
		"integrity": "sha256-G3W6fCRGOZVAN8hjW7hy59DA9UldDdn2G4jEEOQxIew="
	},
	{
		"path": "assets/vendor-misc-hfpbxrii.js",
		"integrity": "sha256-qvAorwHUjxMCoq4Y/w9YrD7RQVxHFhOjIE5O1RmB1Lg="
	},
	{
		"path": "assets/view-transitions-nqfd5e8u.css",
		"integrity": "sha256-Ybdu6L1Y0Ojwo2gCXYBOtTgsQtcmeI+jIJrV9HDPPKY="
	},
	{
		"path": "assets/violet-hapxvvaa.css",
		"integrity": "sha256-V4dVnw0WMQOCJ6i6060PQaiKnFO0FHKbzEWVmgR9154="
	},
	{
		"path": "assets/violet-mrzmmuc5.js",
		"integrity": "sha256-MS+KOzPlobV615Rx0thWCN5GlU9o95ENiP8Oc53/Gcc="
	},
	{
		"path": "assets/wasmvqe-h7o7ezt6.js",
		"integrity": "sha256-AUCepIr5kpd5esxk8fTqvKyqpEAkRluQQKvPggJeOls="
	},
	{
		"path": "assets/web-vitals-oawihxd1.js",
		"integrity": "sha256-e/aQ0P8tbYBtyqtljEuQJj7QI1V9ciPGWugf36AsyEU="
	},
	{
		"path": "assets/welcome-o23agywh.mp4",
		"integrity": "sha256-6rIE3eGE9ZFwR+XITy6RVZIqpOYR2AuNwf02tizTIeI="
	},
	{
		"path": "assets/win10-dark-nee292so.css",
		"integrity": "sha256-tPZOWlUxZGb3n1xerXDbmVb4+vvhfESRzRt8tWiAG5A="
	},
	{
		"path": "assets/win10-light-e5a5f6x1.css",
		"integrity": "sha256-Jm5IMwqj1gPytRdtXcRFTjMv9px3AEljlIME8pRRbjA="
	},
	{
		"path": "assets/win11-aquatic-k4g1k6b6.css",
		"integrity": "sha256-RHw6X7+W0j5Ed1tfKGHN6f/zigyLZSSemhWjE5yfblo="
	},
	{
		"path": "assets/win11-desert-br4n699g.css",
		"integrity": "sha256-A8XTfN2wBS9mAdh+CQH5cIONGhHtDsmS7TWajR6nU9s="
	},
	{
		"path": "assets/win11-dusk-m05d0ij7.css",
		"integrity": "sha256-+ID/cSB7tRbY0tnJ2CX+2clxReCtHp/zFwxkxR1a+Vc="
	},
	{
		"path": "assets/win11-night-sky-jcjo0c8y.css",
		"integrity": "sha256-2Po4uBCitIUl//CavtuJBo8gadk+1/xzR+g/UnoT3Vw="
	},
	{
		"path": "assets/withName-kzu6o9sk.js",
		"integrity": "sha256-SbMPduoVWjZgPAMwCK0wAatH+OWesFvTeX7x1Vqq1Gk="
	},
	{
		"path": "assets/workspace-leaf-files-mc5sghv7.js",
		"integrity": "sha256-o/zU5UGeHlWeGlJv5hA2uuphnvyff00KfL1yRa5ZfxY="
	},
	{
		"path": "assets/xbox-com-tvsetup-qr-gwzuqyhu.png",
		"integrity": "sha256-jZLAGgle0zWZzq3ReZcZp2Q/1NQ40nW7qizBs0Hs0mg="
	},
	{
		"path": "assets/xds-icons-d7khcnpi.js",
		"integrity": "sha256-WAawlinTI9f0U43tAFwQBfBOF3stA73VtdX/JXu6UoM="
	},
	{
		"path": "assets/xds-react-components-lks62tbl.js",
		"integrity": "sha256-4jLEJaoEwj63sRFNdNOdYRjt5YYehaFYi3IjyX0GMBw="
	},
	{
		"path": "assets/yellow-ez4hsdxs.js",
		"integrity": "sha256-1JWHtL+ddUXSCoNN7qew5pavygJETyR1POH5JYuj3qE="
	},
	{
		"path": "assets/yellow-ifmw6drk.css",
		"integrity": "sha256-yKYfJyArDuJlp7qFhqS2An5wx9EECuimpbEocHipKDU="
	},
	{
		"path": "_external/child-window/index.html",
		"integrity": "sha256-DYhGiCPiI3+wcG4I+yy6Py7AyU4hrAUS7HFPPQlYIHE="
	},
	{
		"path": "_external/init/index.html",
		"integrity": "sha256-vv358dDfCZrDWipM40jXbimK50+sRzpaTfhjqKRi6/E="
	}
];
//#endregion
//#region ../../node_modules/workbox-core/_version.js
try {
	self["workbox:core:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-core/models/messages/messageGenerator.js
var fallback = (code, ...args) => {
	let msg = code;
	if (args.length > 0) msg += ` :: ${JSON.stringify(args)}`;
	return msg;
};
var messageGenerator = fallback;
//#endregion
//#region ../../node_modules/workbox-core/_private/WorkboxError.js
/**
* Workbox errors should be thrown with this class.
* This allows use to ensure the type easily in tests,
* helps developers identify errors from workbox
* easily and allows use to optimise error
* messages correctly.
*
* @private
*/
var WorkboxError = class extends Error {
	/**
	*
	* @param {string} errorCode The error code that
	* identifies this particular error.
	* @param {Object=} details Any relevant arguments
	* that will help developers identify issues should
	* be added as a key on the context object.
	*/
	constructor(errorCode, details) {
		const message = messageGenerator(errorCode, details);
		super(message);
		this.name = errorCode;
		this.details = details;
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/getFriendlyURL.js
var getFriendlyURL = (url) => {
	return new URL(String(url), location.href).href.replace(new RegExp(`^${location.origin}`), "");
};
//#endregion
//#region ../../node_modules/workbox-cacheable-response/_version.js
try {
	self["workbox:cacheable-response:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-cacheable-response/CacheableResponse.js
/**
* This class allows you to set up rules determining what
* status codes and/or headers need to be present in order for a
* [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
* to be considered cacheable.
*
* @memberof workbox-cacheable-response
*/
var CacheableResponse = class {
	/**
	* To construct a new CacheableResponse instance you must provide at least
	* one of the `config` properties.
	*
	* If both `statuses` and `headers` are specified, then both conditions must
	* be met for the `Response` to be considered cacheable.
	*
	* @param {Object} config
	* @param {Array<number>} [config.statuses] One or more status codes that a
	* `Response` can have and be considered cacheable.
	* @param {Object<string,string>} [config.headers] A mapping of header names
	* and expected values that a `Response` can have and be considered cacheable.
	* If multiple headers are provided, only one needs to be present.
	*/
	constructor(config = {}) {
		this._statuses = config.statuses;
		this._headers = config.headers;
	}
	/**
	* Checks a response to see whether it's cacheable or not, based on this
	* object's configuration.
	*
	* @param {Response} response The response whose cacheability is being
	* checked.
	* @return {boolean} `true` if the `Response` is cacheable, and `false`
	* otherwise.
	*/
	isResponseCacheable(response) {
		let cacheable = true;
		if (this._statuses) cacheable = this._statuses.includes(response.status);
		if (this._headers && cacheable) cacheable = Object.keys(this._headers).some((headerName) => {
			return response.headers.get(headerName) === this._headers[headerName];
		});
		return cacheable;
	}
};
//#endregion
//#region ../../node_modules/workbox-cacheable-response/CacheableResponsePlugin.js
/**
* A class implementing the `cacheWillUpdate` lifecycle callback. This makes it
* easier to add in cacheability checks to requests made via Workbox's built-in
* strategies.
*
* @memberof workbox-cacheable-response
*/
var CacheableResponsePlugin = class {
	/**
	* To construct a new CacheableResponsePlugin instance you must provide at
	* least one of the `config` properties.
	*
	* If both `statuses` and `headers` are specified, then both conditions must
	* be met for the `Response` to be considered cacheable.
	*
	* @param {Object} config
	* @param {Array<number>} [config.statuses] One or more status codes that a
	* `Response` can have and be considered cacheable.
	* @param {Object<string,string>} [config.headers] A mapping of header names
	* and expected values that a `Response` can have and be considered cacheable.
	* If multiple headers are provided, only one needs to be present.
	*/
	constructor(config) {
		/**
		* @param {Object} options
		* @param {Response} options.response
		* @return {Response|null}
		* @private
		*/
		this.cacheWillUpdate = async ({ response }) => {
			if (this._cacheableResponse.isResponseCacheable(response)) return response;
			return null;
		};
		this._cacheableResponse = new CacheableResponse(config);
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/dontWaitFor.js
/**
* A helper function that prevents a promise from being flagged as unused.
*
* @private
**/
function dontWaitFor(promise) {
	promise.then(() => {});
}
//#endregion
//#region ../../node_modules/workbox-expiration/node_modules/idb/build/wrap-idb-value.js
var instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);
var idbProxyableTypes;
var cursorAdvanceMethods;
function getIdbProxyableTypes() {
	return idbProxyableTypes || (idbProxyableTypes = [
		IDBDatabase,
		IDBObjectStore,
		IDBIndex,
		IDBCursor,
		IDBTransaction
	]);
}
function getCursorAdvanceMethods() {
	return cursorAdvanceMethods || (cursorAdvanceMethods = [
		IDBCursor.prototype.advance,
		IDBCursor.prototype.continue,
		IDBCursor.prototype.continuePrimaryKey
	]);
}
var cursorRequestMap = /* @__PURE__ */ new WeakMap();
var transactionDoneMap = /* @__PURE__ */ new WeakMap();
var transactionStoreNamesMap = /* @__PURE__ */ new WeakMap();
var transformCache = /* @__PURE__ */ new WeakMap();
var reverseTransformCache = /* @__PURE__ */ new WeakMap();
function promisifyRequest(request) {
	const promise = new Promise((resolve, reject) => {
		const unlisten = () => {
			request.removeEventListener("success", success);
			request.removeEventListener("error", error);
		};
		const success = () => {
			resolve(wrap(request.result));
			unlisten();
		};
		const error = () => {
			reject(request.error);
			unlisten();
		};
		request.addEventListener("success", success);
		request.addEventListener("error", error);
	});
	promise.then((value) => {
		if (value instanceof IDBCursor) cursorRequestMap.set(value, request);
	}).catch(() => {});
	reverseTransformCache.set(promise, request);
	return promise;
}
function cacheDonePromiseForTransaction(tx) {
	if (transactionDoneMap.has(tx)) return;
	const done = new Promise((resolve, reject) => {
		const unlisten = () => {
			tx.removeEventListener("complete", complete);
			tx.removeEventListener("error", error);
			tx.removeEventListener("abort", error);
		};
		const complete = () => {
			resolve();
			unlisten();
		};
		const error = () => {
			reject(tx.error || new DOMException("AbortError", "AbortError"));
			unlisten();
		};
		tx.addEventListener("complete", complete);
		tx.addEventListener("error", error);
		tx.addEventListener("abort", error);
	});
	transactionDoneMap.set(tx, done);
}
var idbProxyTraps = {
	get(target, prop, receiver) {
		if (target instanceof IDBTransaction) {
			if (prop === "done") return transactionDoneMap.get(target);
			if (prop === "objectStoreNames") return target.objectStoreNames || transactionStoreNamesMap.get(target);
			if (prop === "store") return receiver.objectStoreNames[1] ? void 0 : receiver.objectStore(receiver.objectStoreNames[0]);
		}
		return wrap(target[prop]);
	},
	set(target, prop, value) {
		target[prop] = value;
		return true;
	},
	has(target, prop) {
		if (target instanceof IDBTransaction && (prop === "done" || prop === "store")) return true;
		return prop in target;
	}
};
function replaceTraps(callback) {
	idbProxyTraps = callback(idbProxyTraps);
}
function wrapFunction(func) {
	if (func === IDBDatabase.prototype.transaction && !("objectStoreNames" in IDBTransaction.prototype)) return function(storeNames, ...args) {
		const tx = func.call(unwrap(this), storeNames, ...args);
		transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);
		return wrap(tx);
	};
	if (getCursorAdvanceMethods().includes(func)) return function(...args) {
		func.apply(unwrap(this), args);
		return wrap(cursorRequestMap.get(this));
	};
	return function(...args) {
		return wrap(func.apply(unwrap(this), args));
	};
}
function transformCachableValue(value) {
	if (typeof value === "function") return wrapFunction(value);
	if (value instanceof IDBTransaction) cacheDonePromiseForTransaction(value);
	if (instanceOfAny(value, getIdbProxyableTypes())) return new Proxy(value, idbProxyTraps);
	return value;
}
function wrap(value) {
	if (value instanceof IDBRequest) return promisifyRequest(value);
	if (transformCache.has(value)) return transformCache.get(value);
	const newValue = transformCachableValue(value);
	if (newValue !== value) {
		transformCache.set(value, newValue);
		reverseTransformCache.set(newValue, value);
	}
	return newValue;
}
var unwrap = (value) => reverseTransformCache.get(value);
//#endregion
//#region ../../node_modules/workbox-expiration/node_modules/idb/build/index.js
/**
* Open a database.
*
* @param name Name of the database.
* @param version Schema version.
* @param callbacks Additional callbacks.
*/
function openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {
	const request = indexedDB.open(name, version);
	const openPromise = wrap(request);
	if (upgrade) request.addEventListener("upgradeneeded", (event) => {
		upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);
	});
	if (blocked) request.addEventListener("blocked", (event) => blocked(event.oldVersion, event.newVersion, event));
	openPromise.then((db) => {
		if (terminated) db.addEventListener("close", () => terminated());
		if (blocking) db.addEventListener("versionchange", (event) => blocking(event.oldVersion, event.newVersion, event));
	}).catch(() => {});
	return openPromise;
}
/**
* Delete a database.
*
* @param name Name of the database.
*/
function deleteDB(name, { blocked } = {}) {
	const request = indexedDB.deleteDatabase(name);
	if (blocked) request.addEventListener("blocked", (event) => blocked(event.oldVersion, event));
	return wrap(request).then(() => void 0);
}
var readMethods = [
	"get",
	"getKey",
	"getAll",
	"getAllKeys",
	"count"
];
var writeMethods = [
	"put",
	"add",
	"delete",
	"clear"
];
var cachedMethods = /* @__PURE__ */ new Map();
function getMethod(target, prop) {
	if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === "string")) return;
	if (cachedMethods.get(prop)) return cachedMethods.get(prop);
	const targetFuncName = prop.replace(/FromIndex$/, "");
	const useIndex = prop !== targetFuncName;
	const isWrite = writeMethods.includes(targetFuncName);
	if (!(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName))) return;
	const method = async function(storeName, ...args) {
		const tx = this.transaction(storeName, isWrite ? "readwrite" : "readonly");
		let target = tx.store;
		if (useIndex) target = target.index(args.shift());
		return (await Promise.all([target[targetFuncName](...args), isWrite && tx.done]))[0];
	};
	cachedMethods.set(prop, method);
	return method;
}
replaceTraps((oldTraps) => ({
	...oldTraps,
	get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),
	has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop)
}));
//#endregion
//#region ../../node_modules/workbox-expiration/_version.js
try {
	self["workbox:expiration:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-expiration/models/CacheTimestampsModel.js
var DB_NAME = "workbox-expiration";
var CACHE_OBJECT_STORE = "cache-entries";
var normalizeURL = (unNormalizedUrl) => {
	const url = new URL(unNormalizedUrl, location.href);
	url.hash = "";
	return url.href;
};
/**
* Returns the timestamp model.
*
* @private
*/
var CacheTimestampsModel = class {
	/**
	*
	* @param {string} cacheName
	*
	* @private
	*/
	constructor(cacheName) {
		this._db = null;
		this._cacheName = cacheName;
	}
	/**
	* Performs an upgrade of indexedDB.
	*
	* @param {IDBPDatabase<CacheDbSchema>} db
	*
	* @private
	*/
	_upgradeDb(db) {
		const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { keyPath: "id" });
		objStore.createIndex("cacheName", "cacheName", { unique: false });
		objStore.createIndex("timestamp", "timestamp", { unique: false });
	}
	/**
	* Performs an upgrade of indexedDB and deletes deprecated DBs.
	*
	* @param {IDBPDatabase<CacheDbSchema>} db
	*
	* @private
	*/
	_upgradeDbAndDeleteOldDbs(db) {
		this._upgradeDb(db);
		if (this._cacheName) deleteDB(this._cacheName);
	}
	/**
	* @param {string} url
	* @param {number} timestamp
	*
	* @private
	*/
	async setTimestamp(url, timestamp) {
		url = normalizeURL(url);
		const entry = {
			url,
			timestamp,
			cacheName: this._cacheName,
			id: this._getId(url)
		};
		const tx = (await this.getDb()).transaction(CACHE_OBJECT_STORE, "readwrite", { durability: "relaxed" });
		await tx.store.put(entry);
		await tx.done;
	}
	/**
	* Returns the timestamp stored for a given URL.
	*
	* @param {string} url
	* @return {number | undefined}
	*
	* @private
	*/
	async getTimestamp(url) {
		const entry = await (await this.getDb()).get(CACHE_OBJECT_STORE, this._getId(url));
		return entry === null || entry === void 0 ? void 0 : entry.timestamp;
	}
	/**
	* Iterates through all the entries in the object store (from newest to
	* oldest) and removes entries once either `maxCount` is reached or the
	* entry's timestamp is less than `minTimestamp`.
	*
	* @param {number} minTimestamp
	* @param {number} maxCount
	* @return {Array<string>}
	*
	* @private
	*/
	async expireEntries(minTimestamp, maxCount) {
		const db = await this.getDb();
		let cursor = await db.transaction(CACHE_OBJECT_STORE).store.index("timestamp").openCursor(null, "prev");
		const entriesToDelete = [];
		let entriesNotDeletedCount = 0;
		while (cursor) {
			const result = cursor.value;
			if (result.cacheName === this._cacheName) if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) entriesToDelete.push(cursor.value);
			else entriesNotDeletedCount++;
			cursor = await cursor.continue();
		}
		const urlsDeleted = [];
		for (const entry of entriesToDelete) {
			await db.delete(CACHE_OBJECT_STORE, entry.id);
			urlsDeleted.push(entry.url);
		}
		return urlsDeleted;
	}
	/**
	* Takes a URL and returns an ID that will be unique in the object store.
	*
	* @param {string} url
	* @return {string}
	*
	* @private
	*/
	_getId(url) {
		return this._cacheName + "|" + normalizeURL(url);
	}
	/**
	* Returns an open connection to the database.
	*
	* @private
	*/
	async getDb() {
		if (!this._db) this._db = await openDB(DB_NAME, 1, { upgrade: this._upgradeDbAndDeleteOldDbs.bind(this) });
		return this._db;
	}
};
//#endregion
//#region ../../node_modules/workbox-expiration/CacheExpiration.js
/**
* The `CacheExpiration` class allows you define an expiration and / or
* limit on the number of responses stored in a
* [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).
*
* @memberof workbox-expiration
*/
var CacheExpiration = class {
	/**
	* To construct a new CacheExpiration instance you must provide at least
	* one of the `config` properties.
	*
	* @param {string} cacheName Name of the cache to apply restrictions to.
	* @param {Object} config
	* @param {number} [config.maxEntries] The maximum number of entries to cache.
	* Entries used the least will be removed as the maximum is reached.
	* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
	* it's treated as stale and removed.
	* @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)
	* that will be used when calling `delete()` on the cache.
	*/
	constructor(cacheName, config = {}) {
		this._isRunning = false;
		this._rerunRequested = false;
		this._maxEntries = config.maxEntries;
		this._maxAgeSeconds = config.maxAgeSeconds;
		this._matchOptions = config.matchOptions;
		this._cacheName = cacheName;
		this._timestampModel = new CacheTimestampsModel(cacheName);
	}
	/**
	* Expires entries for the given cache and given criteria.
	*/
	async expireEntries() {
		if (this._isRunning) {
			this._rerunRequested = true;
			return;
		}
		this._isRunning = true;
		const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1e3 : 0;
		const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);
		const cache = await self.caches.open(this._cacheName);
		for (const url of urlsExpired) await cache.delete(url, this._matchOptions);
		this._isRunning = false;
		if (this._rerunRequested) {
			this._rerunRequested = false;
			dontWaitFor(this.expireEntries());
		}
	}
	/**
	* Update the timestamp for the given URL. This ensures the when
	* removing entries based on maximum entries, most recently used
	* is accurate or when expiring, the timestamp is up-to-date.
	*
	* @param {string} url
	*/
	async updateTimestamp(url) {
		await this._timestampModel.setTimestamp(url, Date.now());
	}
	/**
	* Can be used to check if a URL has expired or not before it's used.
	*
	* This requires a look up from IndexedDB, so can be slow.
	*
	* Note: This method will not remove the cached entry, call
	* `expireEntries()` to remove indexedDB and Cache entries.
	*
	* @param {string} url
	* @return {boolean}
	*/
	async isURLExpired(url) {
		if (!this._maxAgeSeconds) return false;
		else {
			const timestamp = await this._timestampModel.getTimestamp(url);
			const expireOlderThan = Date.now() - this._maxAgeSeconds * 1e3;
			return timestamp !== void 0 ? timestamp < expireOlderThan : true;
		}
	}
	/**
	* Removes the IndexedDB object store used to keep track of cache expiration
	* metadata.
	*/
	async delete() {
		this._rerunRequested = false;
		await this._timestampModel.expireEntries(Infinity);
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/cacheNames.js
var _cacheNameDetails = {
	googleAnalytics: "googleAnalytics",
	precache: "precache-v2",
	prefix: "workbox",
	runtime: "runtime",
	suffix: typeof registration !== "undefined" ? registration.scope : ""
};
var _createCacheName = (cacheName) => {
	return [
		_cacheNameDetails.prefix,
		cacheName,
		_cacheNameDetails.suffix
	].filter((value) => value && value.length > 0).join("-");
};
var eachCacheNameDetail = (fn) => {
	for (const key of Object.keys(_cacheNameDetails)) fn(key);
};
var cacheNames = {
	updateDetails: (details) => {
		eachCacheNameDetail((key) => {
			if (typeof details[key] === "string") _cacheNameDetails[key] = details[key];
		});
	},
	getGoogleAnalyticsName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);
	},
	getPrecacheName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.precache);
	},
	getPrefix: () => {
		return _cacheNameDetails.prefix;
	},
	getRuntimeName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.runtime);
	},
	getSuffix: () => {
		return _cacheNameDetails.suffix;
	}
};
//#endregion
//#region ../../node_modules/workbox-core/models/quotaErrorCallbacks.js
var quotaErrorCallbacks = /* @__PURE__ */ new Set();
//#endregion
//#region ../../node_modules/workbox-core/registerQuotaErrorCallback.js
/**
* Adds a function to the set of quotaErrorCallbacks that will be executed if
* there's a quota error.
*
* @param {Function} callback
* @memberof workbox-core
*/
function registerQuotaErrorCallback(callback) {
	quotaErrorCallbacks.add(callback);
}
//#endregion
//#region ../../node_modules/workbox-expiration/ExpirationPlugin.js
/**
* This plugin can be used in a `workbox-strategy` to regularly enforce a
* limit on the age and / or the number of cached requests.
*
* It can only be used with `workbox-strategy` instances that have a
* [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies).
* In other words, it can't be used to expire entries in strategy that uses the
* default runtime cache name.
*
* Whenever a cached response is used or updated, this plugin will look
* at the associated cache and remove any old or extra responses.
*
* When using `maxAgeSeconds`, responses may be used *once* after expiring
* because the expiration clean up will not have occurred until *after* the
* cached response has been used. If the response has a "Date" header, then
* a light weight expiration check is performed and the response will not be
* used immediately.
*
* When using `maxEntries`, the entry least-recently requested will be removed
* from the cache first.
*
* @memberof workbox-expiration
*/
var ExpirationPlugin = class {
	/**
	* @param {ExpirationPluginOptions} config
	* @param {number} [config.maxEntries] The maximum number of entries to cache.
	* Entries used the least will be removed as the maximum is reached.
	* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
	* it's treated as stale and removed.
	* @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)
	* that will be used when calling `delete()` on the cache.
	* @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to
	* automatic deletion if the available storage quota has been exceeded.
	*/
	constructor(config = {}) {
		/**
		* A "lifecycle" callback that will be triggered automatically by the
		* `workbox-strategies` handlers when a `Response` is about to be returned
		* from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to
		* the handler. It allows the `Response` to be inspected for freshness and
		* prevents it from being used if the `Response`'s `Date` header value is
		* older than the configured `maxAgeSeconds`.
		*
		* @param {Object} options
		* @param {string} options.cacheName Name of the cache the response is in.
		* @param {Response} options.cachedResponse The `Response` object that's been
		*     read from a cache and whose freshness should be checked.
		* @return {Response} Either the `cachedResponse`, if it's
		*     fresh, or `null` if the `Response` is older than `maxAgeSeconds`.
		*
		* @private
		*/
		this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => {
			if (!cachedResponse) return null;
			const isFresh = this._isResponseDateFresh(cachedResponse);
			const cacheExpiration = this._getCacheExpiration(cacheName);
			dontWaitFor(cacheExpiration.expireEntries());
			const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);
			if (event) try {
				event.waitUntil(updateTimestampDone);
			} catch (error) {}
			return isFresh ? cachedResponse : null;
		};
		/**
		* A "lifecycle" callback that will be triggered automatically by the
		* `workbox-strategies` handlers when an entry is added to a cache.
		*
		* @param {Object} options
		* @param {string} options.cacheName Name of the cache that was updated.
		* @param {string} options.request The Request for the cached entry.
		*
		* @private
		*/
		this.cacheDidUpdate = async ({ cacheName, request }) => {
			const cacheExpiration = this._getCacheExpiration(cacheName);
			await cacheExpiration.updateTimestamp(request.url);
			await cacheExpiration.expireEntries();
		};
		this._config = config;
		this._maxAgeSeconds = config.maxAgeSeconds;
		this._cacheExpirations = /* @__PURE__ */ new Map();
		if (config.purgeOnQuotaError) registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());
	}
	/**
	* A simple helper method to return a CacheExpiration instance for a given
	* cache name.
	*
	* @param {string} cacheName
	* @return {CacheExpiration}
	*
	* @private
	*/
	_getCacheExpiration(cacheName) {
		if (cacheName === cacheNames.getRuntimeName()) throw new WorkboxError("expire-custom-caches-only");
		let cacheExpiration = this._cacheExpirations.get(cacheName);
		if (!cacheExpiration) {
			cacheExpiration = new CacheExpiration(cacheName, this._config);
			this._cacheExpirations.set(cacheName, cacheExpiration);
		}
		return cacheExpiration;
	}
	/**
	* @param {Response} cachedResponse
	* @return {boolean}
	*
	* @private
	*/
	_isResponseDateFresh(cachedResponse) {
		if (!this._maxAgeSeconds) return true;
		const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);
		if (dateHeaderTimestamp === null) return true;
		return dateHeaderTimestamp >= Date.now() - this._maxAgeSeconds * 1e3;
	}
	/**
	* This method will extract the data header and parse it into a useful
	* value.
	*
	* @param {Response} cachedResponse
	* @return {number|null}
	*
	* @private
	*/
	_getDateHeaderTimestamp(cachedResponse) {
		if (!cachedResponse.headers.has("date")) return null;
		const dateHeader = cachedResponse.headers.get("date");
		const headerTime = new Date(dateHeader).getTime();
		if (isNaN(headerTime)) return null;
		return headerTime;
	}
	/**
	* This is a helper method that performs two operations:
	*
	* - Deletes *all* the underlying Cache instances associated with this plugin
	* instance, by calling caches.delete() on your behalf.
	* - Deletes the metadata from IndexedDB used to keep track of expiration
	* details for each Cache instance.
	*
	* When using cache expiration, calling this method is preferable to calling
	* `caches.delete()` directly, since this will ensure that the IndexedDB
	* metadata is also cleanly removed and open IndexedDB instances are deleted.
	*
	* Note that if you're *not* using cache expiration for a given cache, calling
	* `caches.delete()` and passing in the cache's name should be sufficient.
	* There is no Workbox-specific method needed for cleanup in that case.
	*/
	async deleteCacheAndMetadata() {
		for (const [cacheName, cacheExpiration] of this._cacheExpirations) {
			await self.caches.delete(cacheName);
			await cacheExpiration.delete();
		}
		this._cacheExpirations = /* @__PURE__ */ new Map();
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/_version.js
try {
	self["workbox:routing:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-routing/utils/normalizeHandler.js
/**
* @param {function()|Object} handler Either a function, or an object with a
* 'handle' method.
* @return {Object} An object with a handle method.
*
* @private
*/
var normalizeHandler = (handler) => {
	if (handler && typeof handler === "object") return handler;
	else return { handle: handler };
};
//#endregion
//#region ../../node_modules/workbox-routing/Route.js
/**
* A `Route` consists of a pair of callback functions, "match" and "handler".
* The "match" callback determine if a route should be used to "handle" a
* request by returning a non-falsy value if it can. The "handler" callback
* is called when there is a match and should return a Promise that resolves
* to a `Response`.
*
* @memberof workbox-routing
*/
var Route = class {
	/**
	* Constructor for Route class.
	*
	* @param {workbox-routing~matchCallback} match
	* A callback function that determines whether the route matches a given
	* `fetch` event by returning a non-falsy value.
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resolving to a Response.
	* @param {string} [method='GET'] The HTTP method to match the Route
	* against.
	*/
	constructor(match, handler, method = "GET") {
		this.handler = normalizeHandler(handler);
		this.match = match;
		this.method = method;
	}
	/**
	*
	* @param {workbox-routing-handlerCallback} handler A callback
	* function that returns a Promise resolving to a Response
	*/
	setCatchHandler(handler) {
		this.catchHandler = normalizeHandler(handler);
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/RegExpRoute.js
/**
* RegExpRoute makes it easy to create a regular expression based
* {@link workbox-routing.Route}.
*
* For same-origin requests the RegExp only needs to match part of the URL. For
* requests against third-party servers, you must define a RegExp that matches
* the start of the URL.
*
* @memberof workbox-routing
* @extends workbox-routing.Route
*/
var RegExpRoute = class extends Route {
	/**
	* If the regular expression contains
	* [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},
	* the captured values will be passed to the
	* {@link workbox-routing~handlerCallback} `params`
	* argument.
	*
	* @param {RegExp} regExp The regular expression to match against URLs.
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	* @param {string} [method='GET'] The HTTP method to match the Route
	* against.
	*/
	constructor(regExp, handler, method) {
		const match = ({ url }) => {
			const result = regExp.exec(url.href);
			if (!result) return;
			if (url.origin !== location.origin && result.index !== 0) return;
			return result.slice(1);
		};
		super(match, handler, method);
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/Router.js
/**
* The Router can be used to process a `FetchEvent` using one or more
* {@link workbox-routing.Route}, responding with a `Response` if
* a matching route exists.
*
* If no route matches a given a request, the Router will use a "default"
* handler if one is defined.
*
* Should the matching Route throw an error, the Router will use a "catch"
* handler if one is defined to gracefully deal with issues and respond with a
* Request.
*
* If a request matches multiple routes, the **earliest** registered route will
* be used to respond to the request.
*
* @memberof workbox-routing
*/
var Router = class {
	/**
	* Initializes a new Router.
	*/
	constructor() {
		this._routes = /* @__PURE__ */ new Map();
		this._defaultHandlerMap = /* @__PURE__ */ new Map();
	}
	/**
	* @return {Map<string, Array<workbox-routing.Route>>} routes A `Map` of HTTP
	* method name ('GET', etc.) to an array of all the corresponding `Route`
	* instances that are registered.
	*/
	get routes() {
		return this._routes;
	}
	/**
	* Adds a fetch event listener to respond to events when a route matches
	* the event's request.
	*/
	addFetchListener() {
		self.addEventListener("fetch", ((event) => {
			const { request } = event;
			const responsePromise = this.handleRequest({
				request,
				event
			});
			if (responsePromise) event.respondWith(responsePromise);
		}));
	}
	/**
	* Adds a message event listener for URLs to cache from the window.
	* This is useful to cache resources loaded on the page prior to when the
	* service worker started controlling it.
	*
	* The format of the message data sent from the window should be as follows.
	* Where the `urlsToCache` array may consist of URL strings or an array of
	* URL string + `requestInit` object (the same as you'd pass to `fetch()`).
	*
	* ```
	* {
	*   type: 'CACHE_URLS',
	*   payload: {
	*     urlsToCache: [
	*       './script1.js',
	*       './script2.js',
	*       ['./script3.js', {mode: 'no-cors'}],
	*     ],
	*   },
	* }
	* ```
	*/
	addCacheListener() {
		self.addEventListener("message", ((event) => {
			if (event.data && event.data.type === "CACHE_URLS") {
				const { payload } = event.data;
				const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {
					if (typeof entry === "string") entry = [entry];
					const request = new Request(...entry);
					return this.handleRequest({
						request,
						event
					});
				}));
				event.waitUntil(requestPromises);
				if (event.ports && event.ports[0]) requestPromises.then(() => event.ports[0].postMessage(true));
			}
		}));
	}
	/**
	* Apply the routing rules to a FetchEvent object to get a Response from an
	* appropriate Route's handler.
	*
	* @param {Object} options
	* @param {Request} options.request The request to handle.
	* @param {ExtendableEvent} options.event The event that triggered the
	*     request.
	* @return {Promise<Response>|undefined} A promise is returned if a
	*     registered route can handle the request. If there is no matching
	*     route and there's no `defaultHandler`, `undefined` is returned.
	*/
	handleRequest({ request, event }) {
		const url = new URL(request.url, location.href);
		if (!url.protocol.startsWith("http")) return;
		const sameOrigin = url.origin === location.origin;
		const { params, route } = this.findMatchingRoute({
			event,
			request,
			sameOrigin,
			url
		});
		let handler = route && route.handler;
		const method = request.method;
		if (!handler && this._defaultHandlerMap.has(method)) handler = this._defaultHandlerMap.get(method);
		if (!handler) return;
		let responsePromise;
		try {
			responsePromise = handler.handle({
				url,
				request,
				event,
				params
			});
		} catch (err) {
			responsePromise = Promise.reject(err);
		}
		const catchHandler = route && route.catchHandler;
		if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) responsePromise = responsePromise.catch(async (err) => {
			if (catchHandler) try {
				return await catchHandler.handle({
					url,
					request,
					event,
					params
				});
			} catch (catchErr) {
				if (catchErr instanceof Error) err = catchErr;
			}
			if (this._catchHandler) return this._catchHandler.handle({
				url,
				request,
				event
			});
			throw err;
		});
		return responsePromise;
	}
	/**
	* Checks a request and URL (and optionally an event) against the list of
	* registered routes, and if there's a match, returns the corresponding
	* route along with any params generated by the match.
	*
	* @param {Object} options
	* @param {URL} options.url
	* @param {boolean} options.sameOrigin The result of comparing `url.origin`
	*     against the current origin.
	* @param {Request} options.request The request to match.
	* @param {Event} options.event The corresponding event.
	* @return {Object} An object with `route` and `params` properties.
	*     They are populated if a matching route was found or `undefined`
	*     otherwise.
	*/
	findMatchingRoute({ url, sameOrigin, request, event }) {
		const routes = this._routes.get(request.method) || [];
		for (const route of routes) {
			let params;
			const matchResult = route.match({
				url,
				sameOrigin,
				request,
				event
			});
			if (matchResult) {
				params = matchResult;
				if (Array.isArray(params) && params.length === 0) params = void 0;
				else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) params = void 0;
				else if (typeof matchResult === "boolean") params = void 0;
				return {
					route,
					params
				};
			}
		}
		return {};
	}
	/**
	* Define a default `handler` that's called when no routes explicitly
	* match the incoming request.
	*
	* Each HTTP method ('GET', 'POST', etc.) gets its own default handler.
	*
	* Without a default handler, unmatched requests will go against the
	* network as if there were no service worker present.
	*
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	* @param {string} [method='GET'] The HTTP method to associate with this
	* default handler. Each method has its own default.
	*/
	setDefaultHandler(handler, method = "GET") {
		this._defaultHandlerMap.set(method, normalizeHandler(handler));
	}
	/**
	* If a Route throws an error while handling a request, this `handler`
	* will be called and given a chance to provide a response.
	*
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	*/
	setCatchHandler(handler) {
		this._catchHandler = normalizeHandler(handler);
	}
	/**
	* Registers a route with the router.
	*
	* @param {workbox-routing.Route} route The route to register.
	*/
	registerRoute(route) {
		if (!this._routes.has(route.method)) this._routes.set(route.method, []);
		this._routes.get(route.method).push(route);
	}
	/**
	* Unregisters a route with the router.
	*
	* @param {workbox-routing.Route} route The route to unregister.
	*/
	unregisterRoute(route) {
		if (!this._routes.has(route.method)) throw new WorkboxError("unregister-route-but-not-found-with-method", { method: route.method });
		const routeIndex = this._routes.get(route.method).indexOf(route);
		if (routeIndex > -1) this._routes.get(route.method).splice(routeIndex, 1);
		else throw new WorkboxError("unregister-route-route-not-registered");
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js
var defaultRouter;
/**
* Creates a new, singleton Router instance if one does not exist. If one
* does already exist, that instance is returned.
*
* @private
* @return {Router}
*/
var getOrCreateDefaultRouter = () => {
	if (!defaultRouter) {
		defaultRouter = new Router();
		defaultRouter.addFetchListener();
		defaultRouter.addCacheListener();
	}
	return defaultRouter;
};
//#endregion
//#region ../../node_modules/workbox-routing/registerRoute.js
/**
* Easily register a RegExp, string, or function with a caching
* strategy to a singleton Router instance.
*
* This method will generate a Route for you if needed and
* call {@link workbox-routing.Router#registerRoute}.
*
* @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture
* If the capture param is a `Route`, all other arguments will be ignored.
* @param {workbox-routing~handlerCallback} [handler] A callback
* function that returns a Promise resulting in a Response. This parameter
* is required if `capture` is not a `Route` object.
* @param {string} [method='GET'] The HTTP method to match the Route
* against.
* @return {workbox-routing.Route} The generated `Route`.
*
* @memberof workbox-routing
*/
function registerRoute(capture, handler, method) {
	let route;
	if (typeof capture === "string") {
		const captureUrl = new URL(capture, location.href);
		const matchCallback = ({ url }) => {
			return url.href === captureUrl.href;
		};
		route = new Route(matchCallback, handler, method);
	} else if (capture instanceof RegExp) route = new RegExpRoute(capture, handler, method);
	else if (typeof capture === "function") route = new Route(capture, handler, method);
	else if (capture instanceof Route) route = capture;
	else throw new WorkboxError("unsupported-route-type", {
		moduleName: "workbox-routing",
		funcName: "registerRoute",
		paramName: "capture"
	});
	getOrCreateDefaultRouter().registerRoute(route);
	return route;
}
//#endregion
//#region ../../node_modules/workbox-routing/setCatchHandler.js
/**
* If a Route throws an error while handling a request, this `handler`
* will be called and given a chance to provide a response.
*
* @param {workbox-routing~handlerCallback} handler A callback
* function that returns a Promise resulting in a Response.
*
* @memberof workbox-routing
*/
function setCatchHandler(handler) {
	getOrCreateDefaultRouter().setCatchHandler(handler);
}
//#endregion
//#region ../../node_modules/workbox-routing/setDefaultHandler.js
/**
* Define a default `handler` that's called when no routes explicitly
* match the incoming request.
*
* Without a default handler, unmatched requests will go against the
* network as if there were no service worker present.
*
* @param {workbox-routing~handlerCallback} handler A callback
* function that returns a Promise resulting in a Response.
*
* @memberof workbox-routing
*/
function setDefaultHandler(handler) {
	getOrCreateDefaultRouter().setDefaultHandler(handler);
}
//#endregion
//#region ../../node_modules/workbox-core/_private/cacheMatchIgnoreParams.js
function stripParams(fullURL, ignoreParams) {
	const strippedURL = new URL(fullURL);
	for (const param of ignoreParams) strippedURL.searchParams.delete(param);
	return strippedURL.href;
}
/**
* Matches an item in the cache, ignoring specific URL params. This is similar
* to the `ignoreSearch` option, but it allows you to ignore just specific
* params (while continuing to match on the others).
*
* @private
* @param {Cache} cache
* @param {Request} request
* @param {Object} matchOptions
* @param {Array<string>} ignoreParams
* @return {Promise<Response|undefined>}
*/
async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {
	const strippedRequestURL = stripParams(request.url, ignoreParams);
	if (request.url === strippedRequestURL) return cache.match(request, matchOptions);
	const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });
	const cacheKeys = await cache.keys(request, keysOptions);
	for (const cacheKey of cacheKeys) if (strippedRequestURL === stripParams(cacheKey.url, ignoreParams)) return cache.match(cacheKey, matchOptions);
}
//#endregion
//#region ../../node_modules/workbox-core/_private/Deferred.js
/**
* The Deferred class composes Promises in a way that allows for them to be
* resolved or rejected from outside the constructor. In most cases promises
* should be used directly, but Deferreds can be necessary when the logic to
* resolve a promise must be separate.
*
* @private
*/
var Deferred = class {
	/**
	* Creates a promise and exposes its resolve and reject functions as methods.
	*/
	constructor() {
		this.promise = new Promise((resolve, reject) => {
			this.resolve = resolve;
			this.reject = reject;
		});
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js
/**
* Runs all of the callback functions, one at a time sequentially, in the order
* in which they were registered.
*
* @memberof workbox-core
* @private
*/
async function executeQuotaErrorCallbacks() {
	for (const callback of quotaErrorCallbacks) await callback();
}
//#endregion
//#region ../../node_modules/workbox-core/_private/timeout.js
/**
* Returns a promise that resolves and the passed number of milliseconds.
* This utility is an async/await-friendly version of `setTimeout`.
*
* @param {number} ms
* @return {Promise}
* @private
*/
function timeout(ms) {
	return new Promise((resolve) => setTimeout(resolve, ms));
}
//#endregion
//#region ../../node_modules/workbox-strategies/_version.js
try {
	self["workbox:strategies:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-strategies/StrategyHandler.js
function toRequest(input) {
	return typeof input === "string" ? new Request(input) : input;
}
/**
* A class created every time a Strategy instance instance calls
* {@link workbox-strategies.Strategy~handle} or
* {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and
* cache actions around plugin callbacks and keeps track of when the strategy
* is "done" (i.e. all added `event.waitUntil()` promises have resolved).
*
* @memberof workbox-strategies
*/
var StrategyHandler = class {
	/**
	* Creates a new instance associated with the passed strategy and event
	* that's handling the request.
	*
	* The constructor also initializes the state that will be passed to each of
	* the plugins handling this request.
	*
	* @param {workbox-strategies.Strategy} strategy
	* @param {Object} options
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params] The return value from the
	*     {@link workbox-routing~matchCallback} (if applicable).
	*/
	constructor(strategy, options) {
		this._cacheKeys = {};
		Object.assign(this, options);
		this.event = options.event;
		this._strategy = strategy;
		this._handlerDeferred = new Deferred();
		this._extendLifetimePromises = [];
		this._plugins = [...strategy.plugins];
		this._pluginStateMap = /* @__PURE__ */ new Map();
		for (const plugin of this._plugins) this._pluginStateMap.set(plugin, {});
		this.event.waitUntil(this._handlerDeferred.promise);
	}
	/**
	* Fetches a given request (and invokes any applicable plugin callback
	* methods) using the `fetchOptions` (for non-navigation requests) and
	* `plugins` defined on the `Strategy` object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - `requestWillFetch()`
	* - `fetchDidSucceed()`
	* - `fetchDidFail()`
	*
	* @param {Request|string} input The URL or request to fetch.
	* @return {Promise<Response>}
	*/
	async fetch(input) {
		const { event } = this;
		let request = toRequest(input);
		if (request.mode === "navigate" && event instanceof FetchEvent && event.preloadResponse) {
			const possiblePreloadResponse = await event.preloadResponse;
			if (possiblePreloadResponse) return possiblePreloadResponse;
		}
		const originalRequest = this.hasCallback("fetchDidFail") ? request.clone() : null;
		try {
			for (const cb of this.iterateCallbacks("requestWillFetch")) request = await cb({
				request: request.clone(),
				event
			});
		} catch (err) {
			if (err instanceof Error) throw new WorkboxError("plugin-error-request-will-fetch", { thrownErrorMessage: err.message });
		}
		const pluginFilteredRequest = request.clone();
		try {
			let fetchResponse;
			fetchResponse = await fetch(request, request.mode === "navigate" ? void 0 : this._strategy.fetchOptions);
			for (const callback of this.iterateCallbacks("fetchDidSucceed")) fetchResponse = await callback({
				event,
				request: pluginFilteredRequest,
				response: fetchResponse
			});
			return fetchResponse;
		} catch (error) {
			if (originalRequest) await this.runCallbacks("fetchDidFail", {
				error,
				event,
				originalRequest: originalRequest.clone(),
				request: pluginFilteredRequest.clone()
			});
			throw error;
		}
	}
	/**
	* Calls `this.fetch()` and (in the background) runs `this.cachePut()` on
	* the response generated by `this.fetch()`.
	*
	* The call to `this.cachePut()` automatically invokes `this.waitUntil()`,
	* so you do not have to manually call `waitUntil()` on the event.
	*
	* @param {Request|string} input The request or URL to fetch and cache.
	* @return {Promise<Response>}
	*/
	async fetchAndCachePut(input) {
		const response = await this.fetch(input);
		const responseClone = response.clone();
		this.waitUntil(this.cachePut(input, responseClone));
		return response;
	}
	/**
	* Matches a request from the cache (and invokes any applicable plugin
	* callback methods) using the `cacheName`, `matchOptions`, and `plugins`
	* defined on the strategy object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - cacheKeyWillBeUsed()
	* - cachedResponseWillBeUsed()
	*
	* @param {Request|string} key The Request or URL to use as the cache key.
	* @return {Promise<Response|undefined>} A matching response, if found.
	*/
	async cacheMatch(key) {
		const request = toRequest(key);
		let cachedResponse;
		const { cacheName, matchOptions } = this._strategy;
		const effectiveRequest = await this.getCacheKey(request, "read");
		const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });
		cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);
		for (const callback of this.iterateCallbacks("cachedResponseWillBeUsed")) cachedResponse = await callback({
			cacheName,
			matchOptions,
			cachedResponse,
			request: effectiveRequest,
			event: this.event
		}) || void 0;
		return cachedResponse;
	}
	/**
	* Puts a request/response pair in the cache (and invokes any applicable
	* plugin callback methods) using the `cacheName` and `plugins` defined on
	* the strategy object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - cacheKeyWillBeUsed()
	* - cacheWillUpdate()
	* - cacheDidUpdate()
	*
	* @param {Request|string} key The request or URL to use as the cache key.
	* @param {Response} response The response to cache.
	* @return {Promise<boolean>} `false` if a cacheWillUpdate caused the response
	* not be cached, and `true` otherwise.
	*/
	async cachePut(key, response) {
		const request = toRequest(key);
		await timeout(0);
		const effectiveRequest = await this.getCacheKey(request, "write");
		if (!response) throw new WorkboxError("cache-put-with-no-response", { url: getFriendlyURL(effectiveRequest.url) });
		const responseToCache = await this._ensureResponseSafeToCache(response);
		if (!responseToCache) return false;
		const { cacheName, matchOptions } = this._strategy;
		const cache = await self.caches.open(cacheName);
		const hasCacheUpdateCallback = this.hasCallback("cacheDidUpdate");
		const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(cache, effectiveRequest.clone(), ["__WB_REVISION__"], matchOptions) : null;
		try {
			await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache);
		} catch (error) {
			if (error instanceof Error) {
				if (error.name === "QuotaExceededError") await executeQuotaErrorCallbacks();
				throw error;
			}
		}
		for (const callback of this.iterateCallbacks("cacheDidUpdate")) await callback({
			cacheName,
			oldResponse,
			newResponse: responseToCache.clone(),
			request: effectiveRequest,
			event: this.event
		});
		return true;
	}
	/**
	* Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and
	* executes any of those callbacks found in sequence. The final `Request`
	* object returned by the last plugin is treated as the cache key for cache
	* reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have
	* been registered, the passed request is returned unmodified
	*
	* @param {Request} request
	* @param {string} mode
	* @return {Promise<Request>}
	*/
	async getCacheKey(request, mode) {
		const key = `${request.url} | ${mode}`;
		if (!this._cacheKeys[key]) {
			let effectiveRequest = request;
			for (const callback of this.iterateCallbacks("cacheKeyWillBeUsed")) effectiveRequest = toRequest(await callback({
				mode,
				request: effectiveRequest,
				event: this.event,
				params: this.params
			}));
			this._cacheKeys[key] = effectiveRequest;
		}
		return this._cacheKeys[key];
	}
	/**
	* Returns true if the strategy has at least one plugin with the given
	* callback.
	*
	* @param {string} name The name of the callback to check for.
	* @return {boolean}
	*/
	hasCallback(name) {
		for (const plugin of this._strategy.plugins) if (name in plugin) return true;
		return false;
	}
	/**
	* Runs all plugin callbacks matching the given name, in order, passing the
	* given param object (merged ith the current plugin state) as the only
	* argument.
	*
	* Note: since this method runs all plugins, it's not suitable for cases
	* where the return value of a callback needs to be applied prior to calling
	* the next callback. See
	* {@link workbox-strategies.StrategyHandler#iterateCallbacks}
	* below for how to handle that case.
	*
	* @param {string} name The name of the callback to run within each plugin.
	* @param {Object} param The object to pass as the first (and only) param
	*     when executing each callback. This object will be merged with the
	*     current plugin state prior to callback execution.
	*/
	async runCallbacks(name, param) {
		for (const callback of this.iterateCallbacks(name)) await callback(param);
	}
	/**
	* Accepts a callback and returns an iterable of matching plugin callbacks,
	* where each callback is wrapped with the current handler state (i.e. when
	* you call each callback, whatever object parameter you pass it will
	* be merged with the plugin's current state).
	*
	* @param {string} name The name fo the callback to run
	* @return {Array<Function>}
	*/
	*iterateCallbacks(name) {
		for (const plugin of this._strategy.plugins) if (typeof plugin[name] === "function") {
			const state = this._pluginStateMap.get(plugin);
			const statefulCallback = (param) => {
				const statefulParam = Object.assign(Object.assign({}, param), { state });
				return plugin[name](statefulParam);
			};
			yield statefulCallback;
		}
	}
	/**
	* Adds a promise to the
	* [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}
	* of the event event associated with the request being handled (usually a
	* `FetchEvent`).
	*
	* Note: you can await
	* {@link workbox-strategies.StrategyHandler~doneWaiting}
	* to know when all added promises have settled.
	*
	* @param {Promise} promise A promise to add to the extend lifetime promises
	*     of the event that triggered the request.
	*/
	waitUntil(promise) {
		this._extendLifetimePromises.push(promise);
		return promise;
	}
	/**
	* Returns a promise that resolves once all promises passed to
	* {@link workbox-strategies.StrategyHandler~waitUntil}
	* have settled.
	*
	* Note: any work done after `doneWaiting()` settles should be manually
	* passed to an event's `waitUntil()` method (not this handler's
	* `waitUntil()` method), otherwise the service worker thread my be killed
	* prior to your work completing.
	*/
	async doneWaiting() {
		let promise;
		while (promise = this._extendLifetimePromises.shift()) await promise;
	}
	/**
	* Stops running the strategy and immediately resolves any pending
	* `waitUntil()` promises.
	*/
	destroy() {
		this._handlerDeferred.resolve(null);
	}
	/**
	* This method will call cacheWillUpdate on the available plugins (or use
	* status === 200) to determine if the Response is safe and valid to cache.
	*
	* @param {Request} options.request
	* @param {Response} options.response
	* @return {Promise<Response|undefined>}
	*
	* @private
	*/
	async _ensureResponseSafeToCache(response) {
		let responseToCache = response;
		let pluginsUsed = false;
		for (const callback of this.iterateCallbacks("cacheWillUpdate")) {
			responseToCache = await callback({
				request: this.request,
				response: responseToCache,
				event: this.event
			}) || void 0;
			pluginsUsed = true;
			if (!responseToCache) break;
		}
		if (!pluginsUsed) {
			if (responseToCache && responseToCache.status !== 200) responseToCache = void 0;
		}
		return responseToCache;
	}
};
//#endregion
//#region ../../node_modules/workbox-strategies/Strategy.js
/**
* An abstract base class that all other strategy classes must extend from:
*
* @memberof workbox-strategies
*/
var Strategy = class {
	/**
	* Creates a new instance of the strategy and sets all documented option
	* properties as public instance properties.
	*
	* Note: if a custom strategy class extends the base Strategy class and does
	* not need more than these properties, it does not need to define its own
	* constructor.
	*
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to the cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] The
	* [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}
	* for any `cache.match()` or `cache.put()` calls made by this strategy.
	*/
	constructor(options = {}) {
		/**
		* Cache name to store and retrieve
		* requests. Defaults to the cache names provided by
		* {@link workbox-core.cacheNames}.
		*
		* @type {string}
		*/
		this.cacheName = cacheNames.getRuntimeName(options.cacheName);
		/**
		* The list
		* [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
		* used by this strategy.
		*
		* @type {Array<Object>}
		*/
		this.plugins = options.plugins || [];
		/**
		* Values passed along to the
		* [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}
		* of all fetch() requests made by this strategy.
		*
		* @type {Object}
		*/
		this.fetchOptions = options.fetchOptions;
		/**
		* The
		* [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}
		* for any `cache.match()` or `cache.put()` calls made by this strategy.
		*
		* @type {Object}
		*/
		this.matchOptions = options.matchOptions;
	}
	/**
	* Perform a request strategy and returns a `Promise` that will resolve with
	* a `Response`, invoking all relevant plugin callbacks.
	*
	* When a strategy instance is registered with a Workbox
	* {@link workbox-routing.Route}, this method is automatically
	* called when the route matches.
	*
	* Alternatively, this method can be used in a standalone `FetchEvent`
	* listener by passing it to `event.respondWith()`.
	*
	* @param {FetchEvent|Object} options A `FetchEvent` or an object with the
	*     properties listed below.
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params]
	*/
	handle(options) {
		const [responseDone] = this.handleAll(options);
		return responseDone;
	}
	/**
	* Similar to {@link workbox-strategies.Strategy~handle}, but
	* instead of just returning a `Promise` that resolves to a `Response` it
	* it will return an tuple of `[response, done]` promises, where the former
	* (`response`) is equivalent to what `handle()` returns, and the latter is a
	* Promise that will resolve once any promises that were added to
	* `event.waitUntil()` as part of performing the strategy have completed.
	*
	* You can await the `done` promise to ensure any extra work performed by
	* the strategy (usually caching responses) completes successfully.
	*
	* @param {FetchEvent|Object} options A `FetchEvent` or an object with the
	*     properties listed below.
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params]
	* @return {Array<Promise>} A tuple of [response, done]
	*     promises that can be used to determine when the response resolves as
	*     well as when the handler has completed all its work.
	*/
	handleAll(options) {
		if (options instanceof FetchEvent) options = {
			event: options,
			request: options.request
		};
		const event = options.event;
		const request = typeof options.request === "string" ? new Request(options.request) : options.request;
		const params = "params" in options ? options.params : void 0;
		const handler = new StrategyHandler(this, {
			event,
			request,
			params
		});
		const responseDone = this._getResponse(handler, request, event);
		return [responseDone, this._awaitComplete(responseDone, handler, request, event)];
	}
	async _getResponse(handler, request, event) {
		await handler.runCallbacks("handlerWillStart", {
			event,
			request
		});
		let response = void 0;
		try {
			response = await this._handle(request, handler);
			if (!response || response.type === "error") throw new WorkboxError("no-response", { url: request.url });
		} catch (error) {
			if (error instanceof Error) for (const callback of handler.iterateCallbacks("handlerDidError")) {
				response = await callback({
					error,
					event,
					request
				});
				if (response) break;
			}
			if (!response) throw error;
		}
		for (const callback of handler.iterateCallbacks("handlerWillRespond")) response = await callback({
			event,
			request,
			response
		});
		return response;
	}
	async _awaitComplete(responseDone, handler, request, event) {
		let response;
		let error;
		try {
			response = await responseDone;
		} catch (error) {}
		try {
			await handler.runCallbacks("handlerDidRespond", {
				event,
				request,
				response
			});
			await handler.doneWaiting();
		} catch (waitUntilError) {
			if (waitUntilError instanceof Error) error = waitUntilError;
		}
		await handler.runCallbacks("handlerDidComplete", {
			event,
			request,
			response,
			error
		});
		handler.destroy();
		if (error) throw error;
	}
};
/**
* Classes extending the `Strategy` based class should implement this method,
* and leverage the {@link workbox-strategies.StrategyHandler}
* arg to perform all fetching and cache logic, which will ensure all relevant
* cache, cache options, fetch options and plugins are used (per the current
* strategy instance).
*
* @name _handle
* @instance
* @abstract
* @function
* @param {Request} request
* @param {workbox-strategies.StrategyHandler} handler
* @return {Promise<Response>}
*
* @memberof workbox-strategies.Strategy
*/
//#endregion
//#region ../../node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js
var cacheOkAndOpaquePlugin = { cacheWillUpdate: async ({ response }) => {
	if (response.status === 200 || response.status === 0) return response;
	return null;
} };
//#endregion
//#region ../../node_modules/workbox-strategies/NetworkFirst.js
/**
* An implementation of a
* [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache)
* request strategy.
*
* By default, this strategy will cache responses with a 200 status code as
* well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).
* Opaque responses are are cross-origin requests where the response doesn't
* support [CORS](https://enable-cors.org/).
*
* If the network request fails, and there is no cache match, this will throw
* a `WorkboxError` exception.
*
* @extends workbox-strategies.Strategy
* @memberof workbox-strategies
*/
var NetworkFirst = class extends Strategy {
	/**
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)
	* @param {number} [options.networkTimeoutSeconds] If set, any network requests
	* that fail to respond within the timeout will fallback to the cache.
	*
	* This option can be used to combat
	* "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}"
	* scenarios.
	*/
	constructor(options = {}) {
		super(options);
		if (!this.plugins.some((p) => "cacheWillUpdate" in p)) this.plugins.unshift(cacheOkAndOpaquePlugin);
		this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;
	}
	/**
	* @private
	* @param {Request|string} request A request to run this strategy for.
	* @param {workbox-strategies.StrategyHandler} handler The event that
	*     triggered the request.
	* @return {Promise<Response>}
	*/
	async _handle(request, handler) {
		const logs = [];
		const promises = [];
		let timeoutId;
		if (this._networkTimeoutSeconds) {
			const { id, promise } = this._getTimeoutPromise({
				request,
				logs,
				handler
			});
			timeoutId = id;
			promises.push(promise);
		}
		const networkPromise = this._getNetworkPromise({
			timeoutId,
			request,
			logs,
			handler
		});
		promises.push(networkPromise);
		const response = await handler.waitUntil((async () => {
			return await handler.waitUntil(Promise.race(promises)) || await networkPromise;
		})());
		if (!response) throw new WorkboxError("no-response", { url: request.url });
		return response;
	}
	/**
	* @param {Object} options
	* @param {Request} options.request
	* @param {Array} options.logs A reference to the logs array
	* @param {Event} options.event
	* @return {Promise<Response>}
	*
	* @private
	*/
	_getTimeoutPromise({ request, logs, handler }) {
		let timeoutId;
		return {
			promise: new Promise((resolve) => {
				const onNetworkTimeout = async () => {
					resolve(await handler.cacheMatch(request));
				};
				timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1e3);
			}),
			id: timeoutId
		};
	}
	/**
	* @param {Object} options
	* @param {number|undefined} options.timeoutId
	* @param {Request} options.request
	* @param {Array} options.logs A reference to the logs Array.
	* @param {Event} options.event
	* @return {Promise<Response>}
	*
	* @private
	*/
	async _getNetworkPromise({ timeoutId, request, logs, handler }) {
		let error;
		let response;
		try {
			response = await handler.fetchAndCachePut(request);
		} catch (fetchError) {
			if (fetchError instanceof Error) error = fetchError;
		}
		if (timeoutId) clearTimeout(timeoutId);
		if (error || !response) response = await handler.cacheMatch(request);
		return response;
	}
};
//#endregion
//#region ../../node_modules/workbox-strategies/StaleWhileRevalidate.js
/**
* An implementation of a
* [stale-while-revalidate](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#stale-while-revalidate)
* request strategy.
*
* Resources are requested from both the cache and the network in parallel.
* The strategy will respond with the cached version if available, otherwise
* wait for the network response. The cache is updated with the network response
* with each successful request.
*
* By default, this strategy will cache responses with a 200 status code as
* well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).
* Opaque responses are cross-origin requests where the response doesn't
* support [CORS](https://enable-cors.org/).
*
* If the network request fails, and there is no cache match, this will throw
* a `WorkboxError` exception.
*
* @extends workbox-strategies.Strategy
* @memberof workbox-strategies
*/
var StaleWhileRevalidate = class extends Strategy {
	/**
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)
	*/
	constructor(options = {}) {
		super(options);
		if (!this.plugins.some((p) => "cacheWillUpdate" in p)) this.plugins.unshift(cacheOkAndOpaquePlugin);
	}
	/**
	* @private
	* @param {Request|string} request A request to run this strategy for.
	* @param {workbox-strategies.StrategyHandler} handler The event that
	*     triggered the request.
	* @return {Promise<Response>}
	*/
	async _handle(request, handler) {
		const fetchAndCachePromise = handler.fetchAndCachePut(request).catch(() => {});
		handler.waitUntil(fetchAndCachePromise);
		let response = await handler.cacheMatch(request);
		let error;
		if (response) {} else try {
			response = await fetchAndCachePromise;
		} catch (err) {
			if (err instanceof Error) error = err;
		}
		if (!response) throw new WorkboxError("no-response", {
			url: request.url,
			error
		});
		return response;
	}
};
//#endregion
//#region src/worker/storage.ts
var databaseName = "play-xbox-service-worker";
var logStoreName = "logs";
var settingsStoreName = "settings";
var database = null;
async function initializeStorage() {
	return new Promise((resolve, reject) => {
		const request = indexedDB.open(databaseName, 5);
		request.onerror = () => reject(request.error);
		request.onsuccess = () => {
			database = request.result;
			if (!database.objectStoreNames.contains(logStoreName) || !database.objectStoreNames.contains(settingsStoreName)) {
				reject(/* @__PURE__ */ new Error(`Object stores ${logStoreName} or ${settingsStoreName} not found`));
				return;
			}
			resolve();
		};
		request.onupgradeneeded = (event) => {
			const db = event.target.result;
			if (!db.objectStoreNames.contains(logStoreName)) db.createObjectStore(logStoreName, { autoIncrement: true });
			if (db.objectStoreNames.contains(settingsStoreName)) db.deleteObjectStore(settingsStoreName);
			db.createObjectStore(settingsStoreName, { keyPath: "key" });
		};
	});
}
/**
* Stores the installed worker version
* @param version Worker version to store
* @returns Promise that resolves when version is stored
*/
async function storeInstalledWorkerVersion(version) {
	return setSetting("installedWorkerVersion", version);
}
/**
* Stores the active worker version
* @param version Worker version to store
* @returns Promise that resolves when version is stored
*/
async function storeActiveWorkerVersion(version) {
	return setSetting("activeWorkerVersion", version);
}
/**
* Stores saved install data
* @param data InstallData to store
* @returns Promise that resolves when data is stored
*/
async function storeInstallData(data) {
	return setSetting("installData", data);
}
/**
* Grab saved install data
* @returns Promise that resolves with InstallData or undefined if not found
*/
async function getInstallData() {
	return getSetting("installData", void 0);
}
/**
* Get all stored logs and delete them from the database
* @returns Promise that resolves with array of log entries
*/
async function getLogs() {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const store = database.transaction([logStoreName], "readwrite").objectStore(logStoreName);
		const getRequest = store.getAll();
		getRequest.onerror = () => reject(getRequest.error);
		getRequest.onsuccess = () => {
			const logs = getRequest.result;
			const clearRequest = store.clear();
			clearRequest.onerror = () => {
				console.warn("SW: Failed to clear logs after retrieval:", clearRequest.error);
				resolve(logs);
			};
			clearRequest.onsuccess = () => resolve(logs);
		};
	});
}
/**
* Clear all stored logs
*/
async function clearLogs() {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([logStoreName], "readwrite").objectStore(logStoreName).clear();
		request.onerror = () => reject(request.error);
		request.onsuccess = () => resolve();
	});
}
/**
* Prune the specified number of oldest log entries
* @param store The object store to prune
* @param toDelete Number of entries to delete
*/
async function pruneOldLogs(store, toDelete) {
	return new Promise((resolve, reject) => {
		let deleted = 0;
		const cursorRequest = store.openCursor();
		cursorRequest.onsuccess = (event) => {
			const cursor = event.target.result;
			if (cursor && deleted < toDelete) {
				const deleteRequest = cursor.delete();
				deleteRequest.onsuccess = () => {
					deleted++;
					cursor.continue();
				};
				deleteRequest.onerror = () => reject(deleteRequest.error);
			} else resolve();
		};
		cursorRequest.onerror = () => reject(cursorRequest.error);
	});
}
async function storeLog(log, maxEntries) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	const store = database.transaction([logStoreName], "readwrite").objectStore(logStoreName);
	const count = await new Promise((resolve, reject) => {
		const request = store.count();
		request.onsuccess = () => resolve(request.result);
		request.onerror = () => reject(request.error);
	});
	try {
		if (count >= maxEntries) await pruneOldLogs(store, count - maxEntries + 1);
	} catch (error) {
		console.error("SW: Failed to prune old logs:", error);
		return;
	}
	return new Promise((resolve, reject) => {
		const request = store.add(log);
		request.onsuccess = () => resolve();
		request.onerror = () => reject(request.error);
	});
}
/**
* Generic getter for a setting by key
* @param key The setting key (e.g., 'verboseLogging')
* @param defaultValue The value to return if not found
* @returns Promise that resolves with the setting value or default
*/
async function getSetting(key, defaultValue) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([settingsStoreName], "readonly").objectStore(settingsStoreName).get(key);
		request.onsuccess = () => {
			const data = request.result;
			if (typeof defaultValue === "boolean" && typeof data?.value === "string") resolve(data.value.toLowerCase() === "true");
			else resolve(data?.value ?? defaultValue);
		};
		request.onerror = () => reject(request.error);
	});
}
/**
* Generic setter for a setting by key
* @param key The setting key (e.g., 'verboseLogging')
* @param value The value to store
* @returns Promise that resolves when stored
*/
async function setSetting(key, value) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([settingsStoreName], "readwrite").objectStore(settingsStoreName).put({
			key,
			value
		});
		request.onsuccess = () => resolve();
		request.onerror = () => reject(request.error);
	});
}
/**
* Check if verbose logging is enabled
* @returns Promise that resolves with true if verbose logging is enabled, false otherwise
*/
async function isVerboseLoggingEnabled() {
	return getSetting("verboseLogging", false);
}
/**
* Set verbose logging enabled state
* @param isEnabled Whether verbose logging should be enabled
* @returns Promise that resolves when the setting is stored
*/
async function storeVerboseLogging(isEnabled) {
	return setSetting("verboseLogging", isEnabled);
}
/**
* Sets a value indicating that the app is in native offline mode.
* This is used to indicate that certain behaviors may need to change when offline.
* @returns Promise that resolves when stored
*/
async function setIsNativeOfflineMode(isNativeOfflineMode) {
	return setSetting("isNativeOfflineMode", isNativeOfflineMode);
}
/**
* Gets the setting indicating whether the app is in native offline mode.
* @returns Promise that resolves with true if the app is in native offline mode, false otherwise
*/
async function getIsNativeOfflineMode() {
	return getSetting("isNativeOfflineMode", false);
}
//#endregion
//#region \0@oxc-project+runtime@0.124.0/helpers/typeof.js
function _typeof(o) {
	"@babel/helpers - typeof";
	return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
		return typeof o;
	} : function(o) {
		return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
	}, _typeof(o);
}
//#endregion
//#region \0@oxc-project+runtime@0.124.0/helpers/toPrimitive.js
function toPrimitive(t, r) {
	if ("object" != _typeof(t) || !t) return t;
	var e = t[Symbol.toPrimitive];
	if (void 0 !== e) {
		var i = e.call(t, r || "default");
		if ("object" != _typeof(i)) return i;
		throw new TypeError("@@toPrimitive must return a primitive value.");
	}
	return ("string" === r ? String : Number)(t);
}
//#endregion
//#region \0@oxc-project+runtime@0.124.0/helpers/toPropertyKey.js
function toPropertyKey(t) {
	var i = toPrimitive(t, "string");
	return "symbol" == _typeof(i) ? i : i + "";
}
//#endregion
//#region \0@oxc-project+runtime@0.124.0/helpers/defineProperty.js
function _defineProperty(e, r, t) {
	return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
		value: t,
		enumerable: !0,
		configurable: !0,
		writable: !0
	}) : e[r] = t, e;
}
//#endregion
//#region src/worker/Logger.ts
var LoggerImpl = class {
	constructor() {
		_defineProperty(this, "MAX_LOG_ENTRIES", 250);
		_defineProperty(this, "MAX_LOG_LENGTH", 1e3);
		_defineProperty(this, "MAX_MESSAGE_LENGTH", 500);
		_defineProperty(this, "clients", void 0);
		_defineProperty(this, "verboseLoggingEnabled", void 0);
		_defineProperty(this, "hasLoggedInitialization", false);
		this.reset();
	}
	/**
	* Log information messages
	* @param args First arg is the message, remaining are context
	*/
	async info(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("info", message, ...contextArgs)) console.info("SW_FALLBACK", ...args);
		this.storeLog("info", args).catch((error) => {
			console.error("Failed to store info log:", error);
		});
	}
	/**
	* Log warning messages
	* @param args First arg is the message, remaining are context
	*/
	async warn(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("warn", message, ...contextArgs)) console.warn("SW_FALLBACK", ...args);
		this.storeLog("warn", args).catch((error) => {
			console.error("SW: Failed to store warning log:", error);
		});
	}
	/**
	* Log error messages
	* @param args First arg is the message, remaining are context
	*/
	async error(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("error", message, ...contextArgs)) console.error("SW_FALLBACK", ...args);
		this.storeLog("error", args).catch((error) => {
			console.error("SW: Failed to store error log:", error);
		});
	}
	/**
	* Log debug messages
	* @param args First arg is the message, remaining are context
	*/
	async debug(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("debug", message, ...contextArgs)) console.debug("SW_FALLBACK", ...args);
		this.storeLog("debug", args).catch((error) => {
			console.error("SW: Failed to store debug log:", error);
		});
	}
	/**
	* Toggle verbose logging on/off.  Useful for debugging the ServiceWorker, as many of the per-request logs
	* are logged at this level and are dropped unless verbose logging is explicitly enabled. The setting is
	* persisted in IndexedDB to survive ServiceWorker restarts.
	* @param enable True to enable verbose logging, false to disable
	*/
	async setVerboseLogging(enable) {
		this.verboseLoggingEnabled = enable;
		await storeVerboseLogging(enable);
		await this.reset();
	}
	/**
	* Log verbose messages.  These messages are completely dropped unless verbose logging is enabled.
	* Can be enabled in the devtools console via window.__SW_MANAGER__.toggleVerboseLogging(true).
	* @param args First arg is the message, remaining are context
	*/
	async verbose(...args) {
		if (this.verboseLoggingEnabled === true) console.debug("WORKER_VERBOSE: ", ...args);
	}
	/**
	* Get all stored logs and delete them from the database
	* @returns Promise that resolves with array of log entries
	*/
	async getLogs() {
		return getLogs();
	}
	/**
	* Clear all stored logs
	*/
	async clearLogs() {
		return clearLogs();
	}
	/**
	* Refreshes the logger state by re-querying clients and settings.
	* Should be called on ServiceWorker startup and whenever clients may have changed (e.g., on message from a client).
	*/
	async reset() {
		const oldClientCount = this.clients?.length ?? 0;
		const oldVerboseLoggingEnabled = this.verboseLoggingEnabled;
		this.clients = await self.clients.matchAll({
			type: "window",
			includeUncontrolled: true
		});
		this.verboseLoggingEnabled = await isVerboseLoggingEnabled();
		if (!this.hasLoggedInitialization || this.clients?.length !== oldClientCount || this.verboseLoggingEnabled !== oldVerboseLoggingEnabled) {
			console.info(`SW: Logger initialized. Verbose logging is ${this.verboseLoggingEnabled ? "ENABLED" : "DISABLED"}, clients count: ${this.clients.length}`);
			this.hasLoggedInitialization = true;
		}
	}
	postLog(level, message, ...args) {
		if (!this.clients || this.clients.length === 0) return false;
		const logMessage = {
			type: "SW_LOG",
			payload: {
				level,
				message,
				args
			}
		};
		for (const client of this.clients) client.postMessage(logMessage);
		return true;
	}
	/**
	* Store a log entry in IndexedDB and prune old entries if necessary
	*/
	async storeLog(level, args) {
		const message = args.length > 0 ? args[0] : "";
		let context = args.slice(1);
		let serializedMessage;
		try {
			serializedMessage = typeof message === "string" ? message : JSON.stringify(message);
		} catch (error) {
			console.warn("SW: Failed to serialize log message, using fallback:", error);
			serializedMessage = "[Unserializable message]";
		}
		if (serializedMessage.length > this.MAX_MESSAGE_LENGTH) {
			console.warn(`SW: Log message too long (${serializedMessage}), truncating to ${this.MAX_MESSAGE_LENGTH}`);
			serializedMessage = `${serializedMessage.slice(0, this.MAX_MESSAGE_LENGTH - 3)}...`;
		}
		let serializedContext;
		try {
			serializedContext = JSON.stringify(context);
		} catch (error) {
			console.warn("SW: Failed to serialize log context, using fallback:", error);
			serializedContext = "[]";
			context = [];
		}
		if (serializedMessage.length + serializedContext.length > this.MAX_LOG_LENGTH) {
			const contextMaxLength = this.MAX_LOG_LENGTH - serializedMessage.length - 3;
			console.warn(`SW: Log context too long (${serializedContext.length} chars), truncating to ${contextMaxLength}`);
			serializedContext = `${serializedContext.slice(0, Math.max(0, contextMaxLength))}...`;
			try {
				context = JSON.parse(serializedContext);
			} catch (error) {
				console.warn("SW: Failed to parse truncated context, using fallback:", error);
				context = ["Truncated context"];
			}
		}
		const logEntry = {
			timestamp: Date.now(),
			level,
			message: serializedMessage,
			context
		};
		try {
			await storeLog(logEntry, this.MAX_LOG_ENTRIES).catch((error) => {
				console.error("SW: Failed to store log entry:", error, JSON.stringify(logEntry));
			});
		} catch (error) {
			console.error("SW: Failed to store log:", error, JSON.stringify(logEntry));
		}
	}
};
var logger = new LoggerImpl();
//#endregion
//#region src/worker/utils.ts
/**
* Checks whether the given url string is for the current origin.
*/
function isSameOriginRequest(url) {
	return url.origin === self.location.origin;
}
/**
* Checks if an error response was rendered by our React Router app (vs upstream infrastructure).
*
* Detection: Checks for the `X-Play-Xbox-Error: 1` header set by entry.server.tsx on error
* responses (4xx, 5xx). This header is unique to Play Xbox error pages and will not be present
* on error responses from upstream infrastructure (Azure App Service, CDNs, proxies, AAD auth
* pages, etc.).
*
* @param response - The error response to check.
* @returns `true` if the error was rendered by Play Xbox, `false` otherwise.
*/
function isAppRenderedErrorResponse(response) {
	return response.headers.get("x-play-xbox-error") === "1";
}
/**
* Gets the trailing file extension from a path.
* Expects paths using forward slashes.
*/
function getFileExtension(path) {
	const filenameIdx = path.lastIndexOf("/") + 1;
	const dotIdx = path.indexOf(".", filenameIdx);
	return dotIdx > -1 ? path.substring(dotIdx) : "";
}
/**
* Returns true if a path is for an HTML or API route rather than
* a normal asset file.
*/
function isRoutePath(path) {
	const ext = getFileExtension(path);
	return ext === "" || ext === ".html";
}
/**
* Trims off trailing slashes and index.html to get to
* the path that the web server will actually make a resource
* available at for fetching.
*
* NOTE: Expects the input to be just the path portion of a URL, e.g. '/foo/bar.html'.
* Do not include query params.
*/
function getResourceWebPath(path) {
	if (path.endsWith("/") && path !== "/") return path.substring(0, path.length - 1);
	if (path.endsWith("/index.html")) return path.substring(0, path.length - 11);
	if (path.endsWith(".html")) return path.substring(0, path.length - 5);
	return path;
}
/**
* Fetches a resource with retry logic.
* Retries the fetch request up to `maxAttempts` times if it fails.
* If all attempts fail, it returns the last response.
*
* @param maxAttempts - The maximum number of attempts to fetch the resource.
* @param url - The URL of the resource to fetch.
* @param init - Optional RequestInit object for the fetch request.
* @returns A Promise that resolves to the Response object.
*/
async function fetchWithRetry(maxAttempts, url, init) {
	if (maxAttempts < 1) throw new Error("maxAttempts must be at least 1");
	if (!url.href || url.protocol !== "https:") throw new Error(`Invalid URL: ${url.href}`);
	const method = init.method?.toUpperCase();
	if (method && method !== "GET") throw new Error(`fetchWithRetry only supports GET requests, got ${method}`);
	let attempt = 1;
	const baseDelay = 100;
	while (attempt <= maxAttempts) {
		try {
			const response = await fetch(url, init);
			if (response.ok) {
				if (attempt > 1) logger.debug(`successfully fetched ${url.href} on attempt ${attempt}`);
				return response;
			}
			if (response.status >= 500 && response.status < 600 && attempt < maxAttempts) logger.warn(`failed response for ${url.href} on attempt ${attempt} - retrying...`, {
				status: response.status,
				statusText: response.statusText
			});
			else {
				logger.error(`failed response for ${url.href} on attempt ${attempt} - returning failed response`, {
					status: response.status,
					statusText: response.statusText
				});
				return response;
			}
		} catch (e) {
			logger.warn(`network error fetching ${url.href} on attempt ${attempt}`, {
				error: e.message,
				type: e.name
			});
			if (attempt === maxAttempts) throw e;
		}
		const delay = baseDelay * Math.pow(2, attempt - 1) * (1 + Math.random() * .1);
		logger.warn(`Retrying ${url.href} in ${delay}ms (attempt ${attempt + 1}/${maxAttempts})`);
		await new Promise((resolve) => setTimeout(resolve, delay));
		attempt++;
	}
	throw new Error("Unexpected error in fetchWithRetry");
}
function bytesToMB(bytes) {
	return (bytes / 1024 / 1024).toFixed(1);
}
//#endregion
//#region src/worker/AppInstallCache.ts
var FETCH_RETRIES = 3;
/**
* Manages a cache of resource files needed for the app to run.
*/
var AppInstallCache = class {
	/**
	* Creates the cache wrapper
	* @param cacheName Name of the Cache database to store data in
	* @param assets List of relative paths to resources
	*/
	constructor(cacheName, assets) {
		_defineProperty(this, "cacheName", void 0);
		_defineProperty(this, "assets", void 0);
		_defineProperty(this, "assetsByWebPath", void 0);
		_defineProperty(this, "isNativeOfflineMode", void 0);
		this.cacheName = cacheName;
		this.assets = [];
		this.assetsByWebPath = /* @__PURE__ */ new Map();
		for (const asset of assets) {
			const url = new URL(getResourceWebPath(asset.path), self.location.href);
			const isRoute = isRoutePath(asset.path);
			const assetInfo = {
				isRoute,
				diskPath: asset.path,
				webPath: url.pathname,
				absoluteUrl: url,
				integrity: isRoute ? void 0 : asset.integrity,
				cacheKey: isRoute ? `${url.href}?__CACHEKEY__=${asset.integrity}` : url.href
			};
			this.assets.push(assetInfo);
			this.assetsByWebPath.set(assetInfo.webPath, assetInfo);
		}
	}
	async cacheNavigationResponse(requestUrl, response, extendableEvent) {
		const webPath = getResourceWebPath(requestUrl.pathname);
		const assetInfo = this.assetsByWebPath.get(webPath);
		if (assetInfo?.isRoute) {
			const cache = await caches.open(this.cacheName);
			await this.cacheResponse(cache, assetInfo.cacheKey, response, extendableEvent);
		} else logger.warn(`cacheNavigationResponse: received navigation response for url ${requestUrl.href} which does not match any known route webPath in the manifest; ignoring.`);
	}
	/**
	* Looks up an app asset in the cache only (never performs a network fetch).
	*
	* @param request - Same-origin request to look up.
	* @returns Cached response if present, otherwise undefined.
	*/
	async tryGetCachedAsset(request) {
		const url = new URL(request.url);
		if (url.origin !== self.location.origin) {
			logger.debug(`tryGetCachedAsset: ignoring cross-origin request: ${request.url}`);
			return;
		}
		const cache = await caches.open(this.cacheName);
		let cachedResponse = await cache.match(request);
		if (cachedResponse) {
			logger.verbose(`tryGetCachedAsset: cache hit - ${request.url}`);
			return cachedResponse;
		}
		if (request.mode === "navigate") {
			const webPath = getResourceWebPath(url.pathname);
			const assetInfo = this.assetsByWebPath.get(webPath);
			if (assetInfo?.isRoute) {
				cachedResponse = await cache.match(assetInfo.cacheKey);
				if (cachedResponse) {
					logger.verbose(`tryGetCachedAsset: cache hit (route with __CACHEKEY__): ${request.url} -> ${assetInfo.cacheKey}`);
					return cachedResponse;
				}
			}
		}
		logger.verbose(`tryGetCachedAsset: cache miss - ${request.url}`);
	}
	/**
	* Handles a same-origin request for an app asset.
	* Always checks the cache first for offline support.
	* Falls back to special __CACHEKEY__ lookup for routes, since they don't have a hash in the file name.
	* For forward compatibility, allows runtime fetching of new/untracked assets so we can properly cache
	* requested assets before a new SW is installed/active. When the new SW does activate, it will walk its
	* manifest and clean up any assets that aren't in the new manifest, so we won't end up with stale cached
	* assets from old SW versions.
	*
	* @param options - Workbox route handler options (contains request + event)
	* @param appVersion - Current app version
	* @returns Response if we handled it, undefined otherwise
	*/
	async fetchAndCacheAsset(options) {
		const { request, event } = options;
		const url = new URL(request.url);
		if (url.origin !== self.location.origin) {
			const msg = `fetchAndCacheAsset: blocking cross-origin request: ${request.url}`;
			logger.error(msg);
			throw new Error(msg);
		}
		const cachedResponse = await this.tryGetCachedAsset(request);
		if (cachedResponse) return cachedResponse;
		const cache = await caches.open(this.cacheName);
		const webPath = getResourceWebPath(url.pathname);
		const assetInfo = this.assetsByWebPath.get(webPath);
		if (assetInfo) return this.doTrackedFetchAndCache(assetInfo, cache, FETCH_RETRIES, event);
		if (!(request.mode === "navigate" || request.destination === "script" || request.destination === "style" || /\.(js|css|json|html?|jsx|tsx|svg|png|jpe?g|gif|webp|avif|woff2?|ttf|otf|eot|ico|webmanifest)$/i.test(url.pathname) || url.pathname.includes(".chunk.") || url.pathname.includes(".module."))) {
			logger.warn(`fetchAndCacheAsset: not handling unrecognized/untracked request, doesn't appear to be an app asset: ${request.url}`);
			return;
		}
		logger.verbose(`fetchAndCacheAsset: fetching/caching unrecognized/untracked app asset: ${request.url}`);
		return this.doUntrackedFetchAndCache(request, cache, event);
	}
	/**
	* Remove all resources from the cache that are not in the current asset list
	*/
	async cleanup() {
		try {
			const cache = await caches.open(this.cacheName);
			const newKeys = new Set(this.assets.map((asset) => asset.cacheKey));
			const oldRequestKeys = await cache.keys();
			const oldRequestKeyCount = oldRequestKeys.length;
			const newKeysCount = newKeys.size;
			let itemsRemoved = 0;
			let itemsReused = 0;
			for (const oldRequestKey of oldRequestKeys) {
				const oldUrl = oldRequestKey.url;
				if (newKeys.has(oldUrl)) {
					itemsReused++;
					continue;
				}
				if (oldUrl.includes("__CACHEKEY__=")) {
					const url = new URL(oldUrl);
					url.searchParams.delete("__CACHEKEY__");
					const oldBaseUrl = url.toString();
					const newVersion = Array.from(newKeys).find((newKey) => {
						if (newKey.includes("__CACHEKEY__=")) {
							const newUrl = new URL(newKey);
							newUrl.searchParams.delete("__CACHEKEY__");
							return newUrl.toString() === oldBaseUrl;
						}
						return false;
					});
					if (newVersion && newVersion !== oldUrl) {
						try {
							logger.verbose(`asset cache cleanup - deleting stale '__CACHEKEY__' url - old:${oldUrl}, keeping new:${newVersion}`);
							await cache.delete(oldRequestKey);
							itemsRemoved++;
						} catch (error) {
							logger.error(`cleanup [${this.cacheName}]: failed to delete ${oldUrl}`, { error });
						}
						continue;
					}
				}
				try {
					logger.verbose(`asset cache cleanup - deleting old asset for url: ${oldUrl}`);
					await cache.delete(oldRequestKey);
					itemsRemoved++;
				} catch (error) {
					logger.error(`cleanup [${this.cacheName}]: failed to delete ${oldUrl}`, { error });
				}
			}
			logger.debug(`cleanup [${this.cacheName}]: old cache size:${oldRequestKeyCount}, new asset count:${newKeysCount}, assets deleted:${itemsRemoved}, assets reused:${itemsReused}`);
		} catch (error) {
			logger.error(`cleanup [${this.cacheName}]: failed to perform cleanup`, { error });
		}
	}
	/**
	* Fetch and cache all assets in the install cache.
	*/
	async fetchAndCacheAll() {
		const cache = await caches.open(this.cacheName);
		const maxConcurrent = 20;
		let lastProgressLog = 0;
		const progressIntervalMs = 5e3;
		await this.concurrentFetch(this.assets, maxConcurrent, async (asset, index, attempt) => {
			if (await cache.match(asset.cacheKey)) {
				logger.verbose(`Using cached asset #${index} ${attempt > 1 ? `(retry ${attempt}):` : ":"} ${asset.absoluteUrl}`);
				return;
			}
			await this.doTrackedFetchAndCache(asset, cache);
		}, {
			maxRetries: FETCH_RETRIES,
			baseDelayMs: 1500,
			onProgress: (done, total, failed, attempt) => {
				const now = Date.now();
				const isFinal = done + failed === total;
				const timeSinceLastLog = now - lastProgressLog;
				if (timeSinceLastLog >= progressIntervalMs || isFinal && timeSinceLastLog > 2e3) {
					lastProgressLog = now;
					const percent = total > 0 ? Math.round(done / total * 100) : 0;
					const attemptInfo = typeof attempt === "number" && attempt > 1 ? ` (attempt ${attempt})` : "";
					const failedInfo = failed > 0 ? ` - ${failed} failed` : "";
					logger.debug(`Install: ${done}/${total} (${percent}%)${failedInfo}${attemptInfo}`);
				}
			},
			onRetry: (asset, index, attempt, err, previousError) => {
				logger.warn(`Retry ${attempt} for asset #${index}: ${asset.absoluteUrl} - ${err.message} ${previousError ? `(previous: ${previousError.message})` : ""}`);
			}
		});
	}
	/**
	* Concurrently processes an array of items with a fixed concurrency limit,
	* automatic retries with exponential backoff + jitter, and smart permanent failure detection.
	*
	* Features:
	* - Keeps exactly `concurrency` requests in flight at all times
	* - Retries only failed items in waves (massively faster than per-item retry)
	* - Detects permanent 404/410 failures and skips retries
	* - Full progress reporting with accurate "failed" count
	* - Graceful handling of any error type
	* - All-or-nothing: rejects only when all retries are exhausted or permanent failures occur
	*
	* Perfect for Service Worker precaching on low-end devices like Smart TVs.
	*/
	async concurrentFetch(items, concurrency, fetcher, options) {
		const total = items.length;
		let completed = 0;
		let failedItems = [];
		const maxRetries = options?.maxRetries ?? 3;
		const baseDelayMs = options?.baseDelayMs ?? 1e3;
		let aborted = false;
		const report = (attempt) => {
			const currentlyFailed = failedItems.length;
			options?.onProgress?.(completed, total, currentlyFailed, attempt);
		};
		report(1);
		for (let attempt = 1; attempt <= maxRetries; attempt++) {
			if (attempt === 1) failedItems = items.map((item, index) => ({
				item,
				index,
				error: null
			}));
			if (failedItems.length === 0) {
				report(attempt);
				return;
			}
			const currentBatch = [...failedItems];
			failedItems = [];
			completed = total - currentBatch.length;
			report(attempt);
			let active = 0;
			let i = 0;
			const next = async () => {
				if (i >= currentBatch.length) {
					if (active === 0 && failedItems.length > 0 && attempt < maxRetries) {
						if (aborted) return;
						const delay = baseDelayMs * Math.pow(2, attempt - 1) * (1 + Math.random() * .1);
						logger.warn(`Retry wave ${attempt + 1}/${maxRetries} starting in ${Math.round(delay)}ms for ${failedItems.length} assets...`);
						await new Promise((r) => setTimeout(r, delay));
						if (aborted) return;
						await next();
					}
					return;
				}
				const { item, index, error: previousError } = currentBatch[i++];
				active++;
				try {
					await fetcher(item, index, attempt);
					completed++;
					report(attempt);
				} catch (error) {
					const errorMsg = error instanceof Error ? error.message : String(error);
					if (errorMsg.startsWith("PERMANENT:404:") || errorMsg.startsWith("PERMANENT:410:")) {
						logger.error(`Permanent failure - asset gone: ${item.absoluteUrl}`);
						completed++;
						report(attempt);
						return;
					}
					options?.onRetry?.(item, index, attempt, error, previousError);
					logger.warn(`Asset #${index} failed (attempt ${attempt}/${maxRetries}) - will retry`, error);
					failedItems.push({
						item,
						index,
						error
					});
				} finally {
					active--;
					next();
				}
			};
			for (let j = 0; j < Math.min(concurrency, currentBatch.length); j++) next();
			while (active > 0 || i < currentBatch.length) await new Promise((r) => setTimeout(r, 10));
			if (failedItems.length === 0) {
				report(attempt);
				return;
			}
		}
		aborted = true;
		throw new Error(`Precaching failed: ${failedItems.length} asset(s) failed after ${maxRetries} attempt(s):\n${failedItems.map((f) => `  #${f.index} ${f.item.absoluteUrl} → ${f.error instanceof Error ? f.error.message : f.error}`).join("\n")}`);
	}
	async updateIsNativeOfflineMode(localAppVersion) {
		if (this.isNativeOfflineMode !== void 0) return;
		this.isNativeOfflineMode = localAppVersion !== null;
		await setIsNativeOfflineMode(this.isNativeOfflineMode);
		logger.info(`AppAssetCache - isNativeOfflineMode:${this.isNativeOfflineMode}.`);
	}
	/**
	* Caches a Response, using `extendableEvent.waitUntil()` when possible.
	*
	* - With an event: returns immediately (response goes to the browser instantly; caching happens in background).
	* - Without an event: awaits the cache write (required for correctness outside fetch/install/activate handlers).
	*
	* Call this with `await` - the function handles the performance difference internally.
	*/
	async cacheResponse(cache, cacheKey, response, extendableEvent) {
		const clone = response.clone();
		const localAppVersion = response.headers.get("x-local-app-version");
		await this.updateIsNativeOfflineMode(localAppVersion);
		const cachePromise = async () => {
			try {
				await cache.put(cacheKey, clone);
			} catch (error) {
				logger.debug(`cacheResponse - (deferred) fetch succeeded, but failed to cache asset: ${cacheKey}.`);
				throw error;
			}
		};
		if (extendableEvent) {
			extendableEvent.waitUntil(cachePromise());
			return;
		} else await cachePromise();
	}
	/**
	* Fetches and caches a *tracked* app asset (one that exists in the current ServiceWorker's asset manifest).
	*
	* This is the core path used during both:
	* - Precaching at install time (native clients)
	* - Runtime fetch of known/tracked assets when the Service Worker is controlling the page (web browsers)
	*
	* Performs integrity checking (for non-route assets), version header validation (for routes served by native clients,
	* since they don't have a hash in the file name), and performs retries on transient network errors.
	* Defers the cache write when possible to minimize response latency.
	*
	* @param {AssetInfo} asset - Metadata about the asset from the build manifest.
	* @param {Cache} cache - Already-opened Cache instance (app asset cache).
	* @param {string} appVersion - Expected app version string. Used to validate route responses in native clients.
	* @param {number} [retries] - Number of retry attempts on transient failures (default: 1). Permanent errors (404/410) are not retried.
	* @param {ExtendableEvent} [extendableEvent] - The fetch/install event. If provided, cache.put() is deferred
	*                                              via event.waitUntil() so the response can be returned immediately,
	*                                              reducing perceived latency by 30–80ms per request.
	*
	* @returns {Promise<Response>} The successful network response (cloned and cached in background if event provided).
	* @throws {Error} If fetch fails permanently (404, 410, version mismatch, etc.) or after all retries.
	*
	* @private
	*/
	async doTrackedFetchAndCache(asset, cache, retries, extendableEvent) {
		logger.debug(`doTrackedFetchAndCache - fetching asset: ${asset.absoluteUrl} with integrity: ${asset.integrity} and retries: ${retries}`);
		const response = await fetchWithRetry(retries ?? 1, asset.absoluteUrl, {
			cache: "no-cache",
			integrity: asset.integrity,
			headers: { "Accept-Encoding": "identity" }
		});
		if (!response.ok) {
			const status = response.status;
			if (status === 404 || status === 410) {
				const msg = `Permanent failure - asset no longer exists: ${asset.absoluteUrl} (HTTP ${status})`;
				logger.error(msg);
				throw new Error(`PERMANENT:${status}:${asset.absoluteUrl}`);
			}
			const msg = `Fetch failed: ${asset.absoluteUrl} (HTTP ${status})`;
			logger.error(msg);
			throw new Error(msg);
		}
		try {
			await this.cacheResponse(cache, asset.cacheKey, response, extendableEvent);
			logger.verbose(`doTrackedFetchAndCache - fetched and cached asset: ${asset.absoluteUrl}`);
			return response;
		} catch (error) {
			logger.debug(`doTrackedFetchAndCache - fetch succeeded, but failed to cache asset: ${asset.absoluteUrl}.`);
			throw error;
		}
	}
	/**
	* Fetches an untracked same-origin app asset (e.g. a new chunk from a newer app version than this ServiceWorker)
	* and caches it in the app asset cache.
	*
	* This ensures that when the old Service Worker is still controlling the page, but a new app version is running,
	* newly-introduced assets are still cached and immediately available to the waiting/new Service Worker upon activation.
	*
	* @param {Request} request - The original fetch request for the asset.
	* @param {Cache} cache - Open Cache instance (must be the app asset cache).
	* @param {ExtendableEvent} [event] - Optional fetch event. If provided, the cache.put()
	*                                    operation is deferred via event.waitUntil() to avoid
	*                                    blocking the response, reducing latency significantly.
	* @returns {Promise<Response>} The network response (cached in background if event provided).
	* @throws {Error} If the network response is not ok (status < 200 || >= 300).
	*
	* @private
	*/
	async doUntrackedFetchAndCache(request, cache, extendableEvent) {
		logger.debug(`doUntrackedFetchAndCache - fetching untracked asset: ${request.url}`);
		const response = await fetchWithRetry(FETCH_RETRIES, new URL(request.url), { cache: "no-cache" });
		if (!response.ok) throw new Error(`Runtime fetch failed ${response.status}: ${request.url}`);
		try {
			await this.cacheResponse(cache, request.url, response, extendableEvent);
			logger.verbose(`doUntrackedFetchAndCache - fetched and cached asset: ${request.url}`);
			return response;
		} catch (error) {
			logger.debug(`doUntrackedFetchAndCache - fetch succeeded, but failed to cache untracked asset: ${request.url}.`);
			throw error;
		}
	}
};
/**
* Combines base styles with button styles for a complete fallback page stylesheet.
*/
var FULL_STYLES = `
    body {
        margin: 0;
        height: 100vh;
        background: #141414;
        color: #fff;
        font-family: system-ui, sans-serif;
        display: flex;
        align-items: center;
        justify-content: center;
        text-align: center;
    }
    .container {
        max-width: 420px;
        padding: 2rem;
    }
    h1 {
        font-size: 1.5rem;
        font-weight: 600;
        margin: 0 0 1rem 0;
    }
    p {
        font-size: 1.125rem;
        line-height: 1.5;
        opacity: 0.9;
        margin: 0;
    }

    button {
        margin-top: 2rem;
        padding: 0.75rem 1.5rem;
        font-size: 1rem;
        background: #107c10;
        color: white;
        border: none;
        border-radius: 4px;
        cursor: pointer;
    }
    button:hover {
        background: #0e6b0b;
    }
    button:focus {
        outline: 2px solid #fff;
        outline-offset: 2px;
    }
`;
//#endregion
//#region src/worker/html/errorFallback.ts
/**
* Human-readable error messages for common HTTP status codes.
* Used to provide context to users when an error occurs.
*/
var ERROR_MESSAGES = {
	400: {
		title: "Bad Request",
		description: "The request could not be understood by the server."
	},
	401: {
		title: "Sign In Required",
		description: "You need to sign in to access this page."
	},
	403: {
		title: "Access Denied",
		description: "You don't have permission to access this page."
	},
	404: {
		title: "Page Not Found",
		description: "The page you're looking for doesn't exist."
	},
	408: {
		title: "Request Timeout",
		description: "The request took too long to complete."
	},
	422: {
		title: "Request Error",
		description: "The request could not be processed."
	},
	429: {
		title: "Too Many Requests",
		description: "Please wait a moment and try again."
	},
	500: {
		title: "Server Error",
		description: "The server encountered an unexpected error."
	},
	502: {
		title: "Service Unavailable",
		description: "The service is temporarily unavailable. Please try again."
	},
	503: {
		title: "Service Unavailable",
		description: "The service is temporarily unavailable. Please try again."
	},
	504: {
		title: "Gateway Timeout",
		description: "The request took too long to complete."
	}
};
/** Default error message for unrecognized status codes. */
var DEFAULT_ERROR = {
	title: "Something Went Wrong",
	description: "An unexpected error occurred."
};
/**
* Generates a self-contained error fallback HTML page.
*
* This page is served when:
* - An intentional HTTP error (4xx) occurs from upstream (not the React app)
* - No cached content is available to serve instead
*
* The page provides:
* - A human-readable error message based on the status code
* - A button that performs a full browser navigation to `/_external/init`
* - `/_external/init` then performs SPA navigation to the sanitized `redirectUri`
* - If already on `/_external/init`, the button performs a full page reload
*
* - Has no external dependencies - renders even if zero assets are cached.
* - Uses CSP meta tag and addEventListener for defense-in-depth security.
*
* @param statusCode - The HTTP status code that triggered the error.
* @param failedUrl - The URL that failed to load, used for redirect after recovery.
* @returns A complete HTML document string.
*/
function createNavigationErrorFallbackHtml(statusCode, failedUrl) {
	const error = ERROR_MESSAGES[statusCode] ?? DEFAULT_ERROR;
	let safeRedirectUrl;
	let isAlreadyOnInit = false;
	try {
		const parsedUrl = new URL(failedUrl, self.location.origin);
		const isSameOrigin = parsedUrl.origin === self.location.origin;
		isAlreadyOnInit = parsedUrl.pathname === "/_external/init";
		if (isSameOrigin) {
			const safeRedirectUri = getSafeInternalRedirectUri(parsedUrl.pathname + parsedUrl.search + parsedUrl.hash, "/");
			safeRedirectUrl = `/_external/init?redirectUri=${encodeURIComponent(safeRedirectUri)}`;
		} else safeRedirectUrl = "/_external/init";
	} catch {
		safeRedirectUrl = "/_external/init";
	}
	const safeEncodedUrl = JSON.stringify(safeRedirectUrl);
	const buttonText = isAlreadyOnInit ? "Reload" : "Try Again";
	return `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <title>Play Xbox - ${error.title}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>${FULL_STYLES}</style>
</head>
<body>
    <div class="container">
        <h1>${error.title}</h1>
        <p>${error.description}</p>
        <button id="retryButton">${buttonText}</button>
    </div>
    <script>
        document.getElementById('retryButton').addEventListener('click', function() {
            ${isAlreadyOnInit ? "location.reload();" : `location.href = ${safeEncodedUrl};`}
        });
    <\/script>
</body>
</html>`.trim();
}
//#endregion
//#region src/worker/html/nativeOfflineModeBootstrapperFallback.ts
var NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM = "__sw_nav_bootstrap_retry";
/**
* If the fetch failed, we could be trying to load from disk from within a ServiceWorker that's unable to send intercepted requests
* to the native app, because the native app may not be on our origin yet. In those cases, it looks like the WebView doesn't receive
* WebResourceRequested events until the first successful navigation to our origin, which means the ServiceWorker can't proxy requests
* to disk until that happens! This issue has been reported to the WebView2 team, but in the meantime, we'll work around it.
*
* To work around this, if we get a 5xx error on the initial navigation request while in 'native offline mode', then we can assume
* that this is the issue. When detected, we serve the a lightweight bootstrapping page directly from the ServiceWorker to 'move' the WebView
* to our origin. Once on our origin, the bootstrapping page immediately calls location.replace(request.url), allowing the ServiceWorker's
* fetch requests to be intercepted by the native Sdk to load the file from disk.
* Uses CSP meta tag for defense-in-depth security.
*/
async function tryCreateNativeOfflineModeBootstrapperResponse(url, status) {
	if (url.searchParams.has(NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM)) {
		logger.warn(`Navigation contains retry param, skipping bootstrap response for url=${url.href} to avoid infinite retry loop`);
		return;
	}
	if (await getIsNativeOfflineMode() && (!status || status >= 500)) {
		logger.debug(`Navigation returning offline mode bootstrap-on-origin response for url=${url.href}`);
		const retryUrl = new URL(url.href);
		retryUrl.searchParams.set(NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM, "1");
		const html = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Loading…</title>
    <style>${FULL_STYLES}</style>
</head>
<body>
    <script>
        location.replace(${JSON.stringify(retryUrl.toString())});
    <\/script>
</body>
</html>`.trim();
		return new Response(html, {
			status: 200,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "no-store"
			}
		});
	}
}
//#endregion
//#region src/worker/html/offlineFallback.ts
/**
* Self-contained offline fallback HTML page.
*
* Rendered when the user is offline and no cached content is available.
* Has no external dependencies - renders even if zero assets are cached.
* Uses CSP meta tag and addEventListener for defense-in-depth security.
*/
var OFFLINE_FALLBACK_HTML = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <title>Play Xbox - Offline</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>${FULL_STYLES}</style>
</head>
<body>
    <div class="container">
        <h1>You're offline</h1>
        <p>Check your internet connection and try again.</p>
        <button id="retryButton">Retry</button>
    </div>
    <script>
        document.getElementById('retryButton').addEventListener('click', function() {
            location.reload();
        });
    <\/script>
</body>
</html>`.trim();
//#endregion
//#region src/worker/entry.worker.ts
var APP_VERSION = "7cb7229b97f-072c479d";
var APP_WCF_VERSION_STRING = "18.9.26050803";
/** Cache name for core app assets (HTML, JS, CSS, etc.). */
var APP_CACHE_KEY = "play-app-cache";
/** Cache name for React Router route manifests. */
var MANIFEST_CACHE_KEY = "play-manifest-cache";
/** Cache name for dynamic images (CDN, product images, etc.) with non-opaque responses. */
var IMAGE_CACHE_KEY = "play-image-cache";
/** Cache name for opaque (no-cors) image responses — tightly constrained due to ~7 MB per-entry browser estimation padding. */
var OPAQUE_IMAGE_CACHE_KEY = "play-opaque-image-cache";
/** Cache name for Game Pass SIGL data. */
var SIGL_CACHE_KEY = "play-sigl-cache";
var NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS = 500;
var NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS = 1e3;
var NAVIGATION_NETWORK_TIMEOUT_WEB_MS = 5e3;
var NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS = 6e4;
var IMAGE_PLACEHOLDER = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
var LOCAL_DEV_HOSTNAME = "local.play.xbox.com";
var installPromise = null;
var IS_NATIVE_CLIENT = new URLSearchParams(self.location.search).get("nativeHost") === "true";
var appAssetCache = new AppInstallCache(APP_CACHE_KEY, assets);
self.addEventListener("unhandledrejection", (event) => {
	logger.error(`Unhandled rejection in SW ${APP_VERSION}:`, event.reason);
	event.preventDefault();
});
/**
* Determines the network timeout to use for same-origin navigations.
*/
var getNavigationNetworkTimeoutMs = async (requestUrl) => {
	if (await getIsNativeOfflineMode()) {
		logger.verbose(`Native client loading assets from disk, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS;
	}
	if (self.navigator.onLine === false) {
		logger.verbose(`Client is offline, skipping network request for ${requestUrl.href}`);
		return 0;
	}
	if (requestUrl.hostname === LOCAL_DEV_HOSTNAME) {
		logger.verbose(`Local dev server detected, using extended navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS;
	}
	if (IS_NATIVE_CLIENT) {
		logger.verbose(`Native client detected, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS;
	}
	logger.debug(`Default navigation path detected, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_WEB_MS}ms for request to ${requestUrl.href}`);
	return NAVIGATION_NETWORK_TIMEOUT_WEB_MS;
};
/**
* Performs a navigation request with a specified network timeout, and appropriate handling for different scenarios (e.g., native local asset loading).
*/
var fetchNavigationWithTimeout = async (request, timeoutMs) => {
	const requestUrl = new URL(request.url);
	const startTime = Date.now();
	logger.debug(`Navigation fetch request begin url=${requestUrl.href} mode=${request.mode} destination=${request.destination} method=${request.method} native=${IS_NATIVE_CLIENT} timeoutMs=${timeoutMs}`);
	const controller = new AbortController();
	const timeoutId = setTimeout(() => {
		logger.debug(`Navigation fetch request timed out after ${timeoutMs}ms, aborting fetch for ${request.url}`);
		controller.abort();
	}, timeoutMs);
	try {
		const response = await fetch(request, {
			redirect: "manual",
			cache: "no-cache",
			signal: controller.signal
		});
		logger.debug(`Navigation fetch request completed status=${response.status} type=${response.type} elapsedMs=${Date.now() - startTime} url=${requestUrl.href}`);
		return response;
	} catch (error) {
		logger.debug(`Navigation fetch request threw an exception elapsedMs=${Date.now() - startTime} url=${requestUrl.href} error=${error instanceof Error ? `${error.name}:${error.message}` : String(error)}`);
		throw error;
	} finally {
		clearTimeout(timeoutId);
	}
};
/**
* Sends a message to all clients controlled by this ServiceWorker.
*/
var sendMessage = async (message) => {
	const clients = await self.clients.matchAll({ includeUncontrolled: true });
	logger.debug(`sending ${message.type} message to ${clients.length} clients`);
	for (const client of clients) client.postMessage(message);
};
var tryInstallWebApplication = async () => {
	if (installPromise) return installPromise;
	installPromise = (async () => {
		try {
			if ((await getInstallData())?.appVersion === APP_VERSION) {
				logger.info(`Web app version ${APP_VERSION} already installed.`);
				return;
			}
			sendMessage({
				type: "SW_INSTALL_APP_STARTED",
				payload: { appVersion: APP_VERSION }
			});
			await appAssetCache.fetchAndCacheAll();
			logger.info(`successfully installed/cached web app assets`);
			try {
				logger.info(`storing install data - appVersion:${APP_VERSION}, webAppWcfVersion:${APP_WCF_VERSION_STRING}`);
				await storeInstallData({
					appVersion: APP_VERSION,
					webAppWcfVersion: APP_WCF_VERSION_STRING
				});
			} catch (error) {
				logger.error(`failed to store install data: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
			}
			sendMessage({
				type: "SW_INSTALL_APP_SUCCEEDED",
				payload: { appVersion: APP_VERSION }
			});
		} catch (error) {
			const msg = `failed to install - asset fetch error: ${error instanceof Error ? error.message : "Unknown error"}`;
			logger.error(msg);
			sendMessage({
				type: "SW_INSTALL_APP_FAILED",
				payload: {
					message: msg,
					appVersion: APP_VERSION
				}
			});
			throw error;
		} finally {
			installPromise = null;
		}
	})();
	return installPromise;
};
self.addEventListener("install", (e) => {
	e.waitUntil((async () => {
		logger.info(`worker 'install' for AppVersion:${APP_VERSION}`);
		await storeInstalledWorkerVersion(APP_VERSION);
	})());
});
self.addEventListener("activate", (e) => {
	e.waitUntil((async () => {
		try {
			logger.info(`worker 'activate' - claiming all clients for AppVersion:${APP_VERSION}, webAppWcfVersion:${APP_WCF_VERSION_STRING}`);
			await self.clients.claim();
		} catch (error) {
			logger.warn(`failed to claim clients during activate: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
		} finally {
			await storeActiveWorkerVersion(APP_VERSION);
		}
		if ((await getInstallData())?.appVersion !== APP_VERSION) {
			logger.info(`worker 'activate' - sending SW_INSTALL_APP_PENDING to defer app installation.`);
			sendMessage({
				type: "SW_INSTALL_APP_PENDING",
				payload: { appVersion: APP_VERSION }
			});
		} else logger.info(`worker 'activate' - app version ${APP_VERSION} already installed, no pending install`);
		try {
			logger.info(`activating - cleaning up old app assets`);
			appAssetCache.cleanup();
		} catch (error) {
			logger.warn(`failed to clean up assets from previous ServiceWorker instance:`, error);
		}
	})());
});
/**
* Simple, reusable Workbox strategy logging plugin.
* Logs cache hits and misses for requests handled by Workbox strategies.
* Only logs if 'verbose' logging is enabled (via swManager.toggleVerboseLogging(true)).
*/
var RequestLogPlugin = class {
	constructor(name) {
		_defineProperty(this, "name", void 0);
		this.name = name;
	}
	async cachedResponseWillBeUsed({ request, cachedResponse }) {
		if (cachedResponse) {
			const size = cachedResponse.headers.get("content-length") ?? "?";
			logger.verbose(`${this.name} cache hit: ${request.url}, size: ${size}`);
			return cachedResponse;
		}
		logger.verbose(`${this.name} cache miss: ${request.url}`);
		return cachedResponse;
	}
	async cacheDidUpdate({ request, newResponse }) {
		const size = newResponse.headers.get("content-length") ?? "?";
		logger.verbose(`${this.name} cache write: ${request.url}, type: ${newResponse?.type ?? "?"}, size: ${size}`);
	}
};
/**
* First route handler that we register with workbox-routing - gives us first crack at handling requests
* by checking our app asset cache. If not handled by the cache, we fall back to a default fetch for any request
* that made it to this route handler, as workbox-routing doesn't let you defer to another route handler from within a route handler.
*/
var appAssetHandler = async (options) => {
	const url = new URL(options.request.url);
	if (url.href.startsWith(`https://${self.location.host}/__manifest`)) {
		const pathsParam = url.searchParams.get("paths");
		if (pathsParam) try {
			const decodedPaths = decodeURIComponent(pathsParam);
			url.searchParams.set("paths", decodedPaths);
		} catch {}
		const normalizedRequest = new Request(url.toString(), options.request);
		return await new NetworkFirst({
			cacheName: MANIFEST_CACHE_KEY,
			networkTimeoutSeconds: 3,
			plugins: [
				new RequestLogPlugin("RouteManifest"),
				new ExpirationPlugin({
					maxEntries: 100,
					maxAgeSeconds: 3600 * 24 * 30,
					purgeOnQuotaError: true
				}),
				new CacheableResponsePlugin({ statuses: [200] })
			]
		}).handle({
			...options,
			request: normalizedRequest
		});
	}
	const response = await appAssetCache.fetchAndCacheAsset(options);
	if (response) return response;
	logger.debug(`appAssetHandler performing default fetch for untracked request: ${url.href}`);
	return fetch(options.request);
};
/**
* Handles non-ok navigation responses (4xx, 5xx errors).
*
* Strategy:
* - For app-rendered errors: Return as-is to preserve React Router ErrorBoundary UI
* - For recoverable upstream errors (5xx, 408, 429): Try serving cached content first
* - For other upstream errors: Serve contextual fallback page with recovery options
*
* @param response - The error response from the server.
* @param request - The original navigation request.
* @returns The appropriate response to serve to the user.
*/
async function handleNavigationErrorResponse(response, request) {
	if (isAppRenderedErrorResponse(response)) {
		logger.debug(`App-rendered ${response.status} error for ${request.url} - returning as-is`);
		return response;
	}
	if (response.status === 404) {
		logger.info(`Received 404 for navigation request ${request.url}, throwing to catch handler for shared offline fallback handling`);
		throw new Error(`Received 404 for navigation request ${request.url}`);
	}
	if (response.status >= 500 || response.status === 408 || response.status === 429) {
		const cachedResponse = await appAssetCache.tryGetCachedAsset(request);
		if (cachedResponse) {
			logger.info(`Served cached content for failed navigation request ${response.status} error: ${request.url}`);
			return cachedResponse;
		} else logger.debug(`No cached content available for failed navigation request ${response.status} error: ${request.url}`);
	}
	logger.info(`Upstream ${response.status} error for ${request.url} - serving error fallback`);
	return new Response(createNavigationErrorFallbackHtml(response.status, request.url), {
		status: response.status,
		headers: {
			"Content-Type": "text/html; charset=utf-8",
			"Cache-Control": "no-store"
		}
	});
}
/**
* Cache-only navigation fallback used by offline/failed-network branches.
*
* Why cache-only?
* - These branches are entered after we've already decided the network is unavailable/unreliable.
* - Issuing another fetch here only adds latency and can trigger duplicate failing requests.
*/
async function resolveNavigationFromCacheOrOfflineFallback(request) {
	const cachedResponse = await appAssetCache.tryGetCachedAsset(request);
	if (cachedResponse) {
		logger.info(`Served cached navigation fallback for ${request.url}`);
		return cachedResponse;
	}
	logger.info(`No cached navigation fallback for ${request.url} - serving offline fallback page`);
	return new Response(OFFLINE_FALLBACK_HTML, {
		headers: {
			"Content-Type": "text/html; charset=utf-8",
			"Cache-Control": "no-store"
		},
		status: 503
	});
}
registerRoute(({ url, request }) => {
	return isSameOriginRequest(url) && request.mode === "navigate";
}, async (options) => {
	const { request, event } = options;
	const url = new URL(request.url);
	const networkTimeoutMs = await getNavigationNetworkTimeoutMs(url);
	logger.info(`Handling navigation request for ${request.url} with network timeout of ${networkTimeoutMs}ms`);
	if (url.pathname === "/auth/msa/blank.html" || url.pathname === "/auth/blank.html") {
		logger.info(`Serving blank.html for MSAL redirect URI: ${url}`);
		return new Response("<!DOCTYPE html>", {
			status: 200,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "public, max-age=31536000, immutable",
				Expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1e3).toUTCString()
			}
		});
	}
	if (networkTimeoutMs <= 0 && !await getIsNativeOfflineMode()) {
		logger.info(`Navigation network fetch skipped due to zero timeout, falling back to cache immediately: ${request.url}`);
		return resolveNavigationFromCacheOrOfflineFallback(request);
	}
	try {
		const response = await fetchNavigationWithTimeout(request, networkTimeoutMs);
		const nativeOfflineBootstrapResponse = await tryCreateNativeOfflineModeBootstrapperResponse(url, response.status);
		if (nativeOfflineBootstrapResponse) return nativeOfflineBootstrapResponse;
		if (response.type === "opaqueredirect") {
			logger.info(`Navigation opaque redirect for ${request.url} -> passing through to browser`);
			return response;
		}
		if (response.status >= 300 && response.status < 400) {
			logger.info(`Navigation redirect (${response.status}) for ${request.url} -> passing through to browser`);
			return response;
		}
		if (response.ok) {
			await appAssetCache.cacheNavigationResponse(url, response, event);
			return response;
		}
		return handleNavigationErrorResponse(response, request);
	} catch (error) {
		const nativeOfflineBootstrapResponse = await tryCreateNativeOfflineModeBootstrapperResponse(url);
		if (nativeOfflineBootstrapResponse) return nativeOfflineBootstrapResponse;
		logger.debug(`Navigation network request failed, trying cache fallback: ${error instanceof Error ? error.message : "Unknown"}`);
		return resolveNavigationFromCacheOrOfflineFallback(request);
	}
}, "GET");
registerRoute(({ url, request }) => {
	return isSameOriginRequest(url) && request.mode !== "navigate";
}, appAssetHandler, "GET");
/**
* Reusable plugin to skip caching oversized images (strict 4 MB limit).
* - Fast path: Responses with Content-Length header (zero overhead)
* - Slow path: Chunked responses - streaming byte counter required (exact cached size, low memory, early abort)
* - Never caches if size check fails or if body size can't be measured
*/
var ImageSizePlugin = class {
	constructor(maxSizeBytes = 4 * 1024 * 1024) {
		_defineProperty(this, "maxSizeBytes", void 0);
		this.maxSizeBytes = maxSizeBytes;
	}
	async cacheWillUpdate({ response, request }) {
		if (!response) return null;
		if (response.type === "opaque") {
			logger.warn(`Unexpected opaque response for ${request.url} — unable to validate size, so disallowing caching`);
			return null;
		}
		const contentLength = response.headers.get("content-length");
		if (contentLength) {
			const size = parseInt(contentLength, 10);
			if (!isNaN(size) && size > this.maxSizeBytes) {
				logger.info(`Skipping caching of oversized image in response: ${request.url} — ${bytesToMB(size)} MB`);
				return null;
			}
			return response;
		}
		if (!response.body) {
			logger.warn(`Image response has no body for ${request.url} — skipping cache`);
			return null;
		}
		try {
			const reader = response.clone().body.getReader();
			let size = 0;
			while (true) {
				const { done, value } = await reader.read();
				if (done) break;
				size += value.length;
				if (size > this.maxSizeBytes) {
					logger.info(`Skipping caching of oversized image in opaque response: ${request.url} — exceeded ${this.maxSizeBytes} bytes`);
					await reader.cancel(new DOMException("Image size limit exceeded", "QuotaExceededError"));
					return null;
				}
			}
			return response;
		} catch (err) {
			logger.warn(`Failed to measure image size for ${request.url} — skipping cache`, err);
			return null;
		}
	}
};
/**
* Rejects stale opaque cached responses when the incoming request uses CORS mode.
* During the transition from no-cors to cors image fetches (via crossOrigin="anonymous"),
* existing opaque cache entries would cause browser-level network errors if served for
* cors-mode requests (per Fetch spec §24.1). This plugin forces a network fetch instead,
* allowing StaleWhileRevalidate's background revalidation to replace the entry with a
* proper CORS response.
*/
var OpaqueCorsGuardPlugin = class {
	async cachedResponseWillBeUsed({ cachedResponse, request }) {
		if (cachedResponse?.type === "opaque" && request.mode === "cors") {
			logger.verbose(`Rejecting opaque cached response for CORS request: ${request.url}`);
			return null;
		}
		return cachedResponse ?? null;
	}
};
/** Primary strategy for CORS images — non-opaque, real file sizes. */
var corsImageStrategy = new StaleWhileRevalidate({
	cacheName: IMAGE_CACHE_KEY,
	plugins: [
		new OpaqueCorsGuardPlugin(),
		new RequestLogPlugin("Image"),
		new CacheableResponsePlugin({ statuses: [200] }),
		new ImageSizePlugin(),
		new ExpirationPlugin({
			maxEntries: 1e3,
			maxAgeSeconds: 3600 * 24 * 30,
			purgeOnQuotaError: true
		})
	]
});
/** Constrained strategy for opaque images — each padded to ~7 MB by browsers. */
var opaqueImageStrategy = new StaleWhileRevalidate({
	cacheName: OPAQUE_IMAGE_CACHE_KEY,
	plugins: [
		new RequestLogPlugin("OpaqueImage"),
		new CacheableResponsePlugin({ statuses: [0, 200] }),
		new ExpirationPlugin({
			maxEntries: 50,
			maxAgeSeconds: 3600 * 24 * 7,
			purgeOnQuotaError: true
		})
	]
});
/**
* Handle requests for dynamic images (e.g., PDP images) with tiered L2 caches.
* CORS images (from crossOrigin="anonymous") go to the primary cache with generous limits.
* Opaque images (from CSS background-image or non-CORS CDNs) go to a constrained cache
* to prevent ~7 MB per-entry browser estimates from incorrectly reporting excessive disk space consumption.
*/
registerRoute(({ request }) => request.destination === "image" || /\.(ico|jpg|jpeg|png|gif|svg|webp|avif)(\?.*)?$/i.test(request.url), async (options) => {
	try {
		return await (options.request.mode === "cors" ? corsImageStrategy : opaqueImageStrategy).handle(options);
	} catch (err) {
		logger.warn(`Image fetch failed completely -> serving placeholder: ${options.request.url}`, err);
		return new Response(IMAGE_PLACEHOLDER, {
			status: 200,
			headers: {
				"Content-Type": "image/png",
				"Cache-Control": "public, max-age=31536000, immutable",
				"Content-Length": "68"
			}
		});
	}
});
/**
* Default handler if none of the registered handlers match the request.
*/
setDefaultHandler(async ({ event, request, url }) => {
	if (url.href.startsWith("https://catalog.gamepass.com/sigls/")) return await new NetworkFirst({
		cacheName: SIGL_CACHE_KEY,
		networkTimeoutSeconds: 3,
		plugins: [
			new RequestLogPlugin("Sigl"),
			new ExpirationPlugin({
				maxEntries: 500,
				maxAgeSeconds: 3600 * 24 * 30,
				purgeOnQuotaError: true
			}),
			new CacheableResponsePlugin({ statuses: [200] })
		]
	}).handle({
		event,
		request
	});
	logger.debug(`default handler issuing cross-origin request:${url.href} (destination: ${request.destination}, mode: ${request.mode})`);
	return fetch(request);
});
/**
* Error handler called if exceptions are thrown from any route handler.
*/
setCatchHandler((({ request, url }) => {
	if (isSameOriginRequest(url) && request.mode === "navigate") if (url.pathname === "/_external/init") {
		logger.error(`/_external/init failed to load - serving built-in error page for ${url}.`);
		const status = 404;
		return new Response(createNavigationErrorFallbackHtml(status, request.url), {
			status,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "no-store"
			}
		});
	} else {
		const safeRedirectUri = getSafeInternalRedirectUri(url.pathname + url.search + url.hash, "/");
		const urlToRedirect = `/_external/init?redirectUri=${encodeURIComponent(safeRedirectUri)}`;
		logger.info(`Redirecting failed navigation request to ${urlToRedirect} for ${url}, so we can SPA nav to the requested url from there.`);
		return Response.redirect(urlToRedirect, 302);
	}
	logger.error(`request failed: ${url}, request.mode: ${request.mode}`);
	return Response.error();
}));
/**
* Quick type guard to check if the message data is a typed message.
* This is used to ensure that the message data has a 'type' property of type string,
* which is a common pattern for typed messages in ServiceWorkers, to avoid processing
* messages that are not intended for this ServiceWorker.
*/
function isTypedMessageData(e) {
	return typeof e === "object" && !!e && "type" in e && typeof e.type === "string";
}
self.addEventListener("message", async (e) => {
	if (!isTypedMessageData(e.data)) {
		logger.warn(`received unexpected message: ${JSON.stringify(e.data)}.`);
		return;
	}
	logger.info(`worker received app message: ${e.data.type}.`);
	switch (e.data.type) {
		case "SW_SKIP_WAITING":
			logger.info(`received 'SW_SKIP_WAITING' - calling self.skipWaiting().`);
			self.skipWaiting();
			break;
		case "SW_GET_VERSION":
			await logger.reset();
			e.ports[0].postMessage({
				type: "SW_VERSION_RESPONSE",
				payload: APP_VERSION
			});
			break;
		case "SW_GET_INSTALLED_APP_VERSION":
			try {
				const installData = await getInstallData();
				logger.info(`retrieved installed app version: ${installData?.appVersion ?? "none"}`);
				e.ports[0].postMessage({
					type: "SW_INSTALLED_APP_VERSION_RESPONSE",
					payload: installData?.appVersion
				});
			} catch (error) {
				logger.error(`error retrieving installed app version: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
			}
			break;
		case "SW_INSTALL_APP":
			try {
				logger.info(`received SW_INSTALL_APP message - performing asset pre-caching for AppVersion:${APP_VERSION}`);
				const locale = e.data.payload.locale;
				await tryInstallWebApplication(locale);
				await appAssetCache.cleanup();
				logger.info(`successfully completed SW_INSTALL_APP for AppVersion:${APP_VERSION}`);
				e.ports[0].postMessage({
					type: "SW_INSTALL_APP_RESPONSE",
					payload: { appVersion: APP_VERSION }
				});
			} catch (error) {
				logger.error(`error during SW_INSTALL_APP handling: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
				e.ports[0].postMessage({
					type: "SW_INSTALL_APP_RESPONSE",
					payload: {
						appVersion: APP_VERSION,
						errorMessage: error instanceof Error ? error.message : JSON.stringify(error)
					}
				});
			}
			break;
		case "SW_ENABLE_VERBOSE_LOGGING":
			try {
				logger.info(`received SW_ENABLE_VERBOSE_LOGGING message - setting verbose logging to: ${e.data.payload}`);
				await logger.setVerboseLogging(e.data.payload);
				e.ports[0].postMessage({
					type: "SW_ENABLE_VERBOSE_LOGGING_RESPONSE",
					payload: {}
				});
			} catch (error) {
				logger.error(`error during SW_ENABLE_VERBOSE_LOGGING handling: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
				e.ports[0].postMessage({
					type: "SW_ENABLE_VERBOSE_LOGGING_RESPONSE",
					payload: { errorMessage: error instanceof Error ? error.message : JSON.stringify(error) }
				});
			}
			break;
		default:
			logger.warn(`received unrecognized message type: ${e.data.type}.`, { event: e });
			break;
	}
});
//#endregion
