1'use strict'; 2const MANIFEST = 'flutter-app-manifest'; 3const TEMP = 'flutter-temp-cache'; 4const CACHE_NAME = 'flutter-app-cache'; 5 6const RESOURCES = {"flutter_bootstrap.js": "ff3d4680223d40b6a85f8285e7e26fc9", 7"version.json": "060e8a75ac899cdbb6a035eaf93bef29", 8"index.html": "8754858cede284d5862e8050f4b61e35", 9"/": "8754858cede284d5862e8050f4b61e35", 10"main.dart.js": "4a3cafe44d6b8487ca6afc2a88222eb3", 11"flutter.js": "f393d3c16b631f36852323de8e583132", 12"favicon.png": "5dcef449791fa27946b3d35ad8803796", 13"icons/Icon-192.png": "ac9a721a12bbc803b44f645561ecb1e1", 14"icons/Icon-maskable-192.png": "c457ef57daa1d16f64b27b786ec2ea3c", 15"icons/Icon-maskable-512.png": "301a7604d45b3e739efc881eb04896ea", 16"icons/Icon-512.png": "96e752610906ba2a93c65f8abe1645f1", 17"manifest.json": "74e2ac9eec4a4e05bbd473d01c65f90a", 18"assets/AssetManifest.json": "5c1dd77cf4001a8e62de94ccab78cd95", 19"assets/NOTICES": "78f2215fce18386c8da2f15e6af54eb2", 20"assets/FontManifest.json": "79dab6247392cdedecc891cae86ed008", 21"assets/AssetManifest.bin.json": "0a8609f4fd2978fa7333f9097892037a", 22"assets/packages/line_icons/lib/assets/fonts/LineIcons.ttf": "bcaf3ba974cf7900b3c158ca593f4971", 23"assets/packages/cupertino_icons/assets/CupertinoIcons.ttf": "02e60df0f84dca58a1f7d9f671c67a95", 24"assets/packages/fluttertoast/assets/toastify.js": "56e2c9cedd97f10e7e5f1cebd85d53e3", 25"assets/packages/fluttertoast/assets/toastify.css": "a85675050054f179444bc5ad70ffc635", 26"assets/shaders/ink_sparkle.frag": "ecc85a2e95f5e9f53123dcaf8cb9b6ce", 27"assets/AssetManifest.bin": "74a1863a51ff105ea372ba662c32d572", 28"assets/fonts/MaterialIcons-Regular.otf": "4dffb0eaf7dda141f79d42eec179e531", 29"assets/assets/images/icon.png": "53952333f849fc2fafef4e8184feed74", 30"assets/assets/fonts/Muli-Medium.ttf": "683362f36187ad8be18692df9c1cf81e", 31"assets/assets/fonts/Muli-Bold.ttf": "077ceb9111e90dea3fc3923fe71805a1", 32"assets/assets/fonts/Muli-SemiBold.ttf": "2f64b5b99b8dc9d36387f334a6921da7", 33"assets/assets/fonts/Muli-Light.ttf": "923c071b6b7ddaebd0c20d00fa805701", 34"assets/assets/fonts/Muli-Regular.ttf": "328d557958b18b54b3bddb3a4a36215a", 35"canvaskit/skwasm.js": "694fda5704053957c2594de355805228", 36"canvaskit/skwasm.js.symbols": "262f4827a1317abb59d71d6c587a93e2", 37"canvaskit/canvaskit.js.symbols": "48c83a2ce573d9692e8d970e288d75f7", 38"canvaskit/skwasm.wasm": "9f0c0c02b82a910d12ce0543ec130e60", 39"canvaskit/chromium/canvaskit.js.symbols": "a012ed99ccba193cf96bb2643003f6fc", 40"canvaskit/chromium/canvaskit.js": "671c6b4f8fcc199dcc551c7bb125f239", 41"canvaskit/chromium/canvaskit.wasm": "b1ac05b29c127d86df4bcfbf50dd902a", 42"canvaskit/canvaskit.js": "66177750aff65a66cb07bb44b8c6422b",
43"canvaskit/canvaskit.wasm": "1f237a213d7370cf95f443d896176460", 44"canvaskit/skwasm.worker.js": "89990e8c92bcb123999aa81f7e203b1c"}; 45// The application shell files that are downloaded before a service worker can 46// start. 47const CORE = ["main.dart.js", 48"index.html", 49"flutter_bootstrap.js", 50"assets/AssetManifest.bin.json", 51"assets/FontManifest.json"]; 52 53// During install, the TEMP cache is populated with the application shell files. 54self.addEventListener("install", (event) => { 55 self.skipWaiting(); 56 return event.waitUntil( 57 caches.open(TEMP).then((cache) => { 58 return cache.addAll( 59 CORE.map((value) => new Request(value, {'cache': 'reload'}))); 60 }) 61 ); 62}); 63// During activate, the cache is populated with the temp files downloaded in 64// install. If this service worker is upgrading from one with a saved 65// MANIFEST, then use this to retain unchanged resource files. 66self.addEventListener("activate", function(event) { 67 return event.waitUntil(async function() { 68 try { 69 var contentCache = await caches.open(CACHE_NAME); 70 var tempCache = await caches.open(TEMP); 71 var manifestCache = await caches.open(MANIFEST); 72 var manifest = await manifestCache.match('manifest'); 73 // When there is no prior manifest, clear the entire cache. 74 if (!manifest) { 75 await caches.delete(CACHE_NAME); 76 contentCache = await caches.open(CACHE_NAME); 77 for (var request of await tempCache.keys()) { 78 var response = await tempCache.match(request); 79 await contentCache.put(request, response); 80 } 81 await caches.delete(TEMP); 82 // Save the manifest to make future upgrades efficient. 83 await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES))); 84 // Claim client to enable caching on first launch 85 self.clients.claim(); 86 return; 87 } 88 var oldManifest = await manifest.json(); 89 var origin = self.location.origin; 90 for (var request of await contentCache.keys()) { 91 var key = request.url.substring(origin.length + 1); 92 if (key == "") { 93 key = "/"; 94 } 95 // If a resource from the old manifest is not in the new cache, or if 96 // the MD5 sum has changed, delete it. Otherwise the resource is left 97 // in the cache and can be reused by the new service worker. 98 if (!RESOURCES[key] || RESOURCES[key] != oldManifest[key]) { 99 await contentCache.delete(request); 100 } 101 } 102 // Populate the cache with the app shell TEMP files, potentially overwriting 103 // cache files preserved above. 104 for (var request of await tempCache.keys()) { 105 var response = await tempCache.match(request); 106 await contentCache.put(request, response); 107 } 108 await caches.delete(TEMP); 109 // Save the manifest to make future upgrades efficient. 110 await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES))); 111 // Claim client to enable caching on first launch 112 self.clients.claim(); 113 return; 114 } catch (err) { 115 // On an unhandled exception the state of the cache cannot be guaranteed. 116 console.error('Failed to upgrade service worker: ' + err); 117 await caches.delete(CACHE_NAME); 118 await caches.delete(TEMP); 119 await caches.delete(MANIFEST); 120 } 121 }()); 122}); 123// The fetch handler redirects requests for RESOURCE files to the service 124// worker cache. 125self.addEventListener("fetch", (event) => { 126 if (event.request.method !== 'GET') { 127 return; 128 } 129 var origin = self.location.origin; 130 var key = event.request.url.substring(origin.length + 1); 131 // Redirect URLs to the index.html 132 if (key.indexOf('?v=') != -1) { 133 key = key.split('?v=')[0]; 134 } 135 if (event.request.url == origin || event.request.url.startsWith(origin + '/#') || key == '') { 136 key = '/'; 137 } 138 // If the URL is not the RESOURCE list then return to signal that the 139 // browser should take over. 140 if (!RESOURCES[key]) { 141 return; 142 } 143 // If the URL is the index.html, perform an online-first request. 144 if (key == '/') { 145 return onlineFirst(event); 146 } 147 event.respondWith(caches.open(CACHE_NAME) 148 .then((cache) => { 149 return cache.match(event.request).then((response) => { 150 // Either respond with the cached resource, or perform a fetch and 151 // lazily populate the cache only if the resource was successfully fetched. 152 return response || fetch(event.request).then((response) => { 153 if (response && Boolean(response.ok)) { 154 cache.put(event.request, response.clone()); 155 } 156 return response; 157 }); 158 }) 159 }) 160 ); 161}); 162self.addEventListener('message', (event) => { 163 // SkipWaiting can be used to immediately activate a waiting service worker. 164 // This will also require a page refresh triggered by the main worker. 165 if (event.data === 'skipWaiting') {
166 self.skipWaiting(); 167 return; 168 } 169 if (event.data === 'downloadOffline') { 170 downloadOffline(); 171 return; 172 } 173}); 174// Download offline will check the RESOURCES for all files not in the cache 175// and populate them. 176async function downloadOffline() { 177 var resources = []; 178 var contentCache = await caches.open(CACHE_NAME); 179 var currentContent = {}; 180 for (var request of await contentCache.keys()) { 181 var key = request.url.substring(origin.length + 1); 182 if (key == "") { 183 key = "/"; 184 } 185 currentContent[key] = true; 186 } 187 for (var resourceKey of Object.keys(RESOURCES)) { 188 if (!currentContent[resourceKey]) { 189 resources.push(resourceKey); 190 } 191 } 192 return contentCache.addAll(resources); 193} 194// Attempt to download the resource online before falling back to 195// the offline cache. 196function onlineFirst(event) { 197 return event.respondWith( 198 fetch(event.request).then((response) => { 199 return caches.open(CACHE_NAME).then((cache) => { 200 cache.put(event.request, response.clone()); 201 return response; 202 }); 203 }).catch((error) => { 204 return caches.open(CACHE_NAME).then((cache) => { 205 return cache.match(event.request).then((response) => { 206 if (response != null) { 207 return response; 208 } 209 throw error; 210 }); 211 }); 212 }) 213 ); 214}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.