Repository: GoogleChrome/lighthouse
Pull request #10097 (2019-12-11 20:52:32)

core(lantern): add edges from initiatorRequest when there are duplicate records
This PR fixes some missing edges in the lantern simulation graph where a network record won't depend on its `initiatorRequest` if there are multiple records for the initiator. In practice I think this mainly affects cases where a script is prefetched which in turn causes multiple records and prevents connections to its initiated requests.

I fixed this by:
  1. In `network-recorder.js`: make sure that `initiatorRequest` points to the proper script request, not the prefetch record.
  2. In `page-dependency-graph.js`: fall back to the initiator request (when present) rather than the root node if the parent candidate is ambiguous.

The main changes to lantern are:

```
Metric                    p50 (% Error)        p90 (% Error)        p95 (% Error)       
optimisticFCP             16.9% ↔  0.0%        45.0% ↓  2.8%        54.0% ↓↓ 7.5%       
pessimisticFCP            16.4% ↔  0.2%        47.8% ↓  1.9%        73.6% ↔  0.0%       
roughEstimateOfFCP        16.2% ↔  0.0%        45.0% ↓  2.6%        61.0% ↔  0.0%       
optimisticFMP             18.1% ↔  0.0%        50.9% ↓  2.3%        62.5% ↓  4.8%       
pessimisticFMP            17.6% ↑  0.8%        52.9% ↔  0.0%        69.5% ↓  5.7%       
roughEstimateOfFMP        16.4% ↔  0.0%        49.6% ↔  0.2%        57.7% ↔  0.2%       
optimisticTTFCPUI         22.2% ↔  0.0%        62.0% ↑  4.3%        92.1% ↑  4.3%       
pessimisticTTFCPUI        20.7% ↓  0.5%        73.2% ↔  0.0%        122.4% ↓  3.6%      
roughEstimateOfTTFCPUI    22.2% ↑  0.9%        54.5% ↑  0.8%        92.1% ↑↑ 17.1%      
optimisticTTI             28.9% ↓  1.3%        56.7% ↓  1.6%        63.4% ↓  3.0%       
pessimisticTTI            20.6% ↔  0.1%        79.9% ↔  0.0%        135.3% ↔  1.3%      
roughEstimateOfTTI        23.3% ↔  0.0%        58.5% ↑  2.2%        110.3% ↑  1.4%      
optimisticSI              65.0% ↔  0.0%        83.7% ↔  0.0%        90.9% ↔  0.0%       
pessimisticSI             44.8% ↔  0.0%        84.4% ↔  0.0%        89.7% ↔  0.0%       
roughEstimateOfSI         36.0% ↑  1.1%        75.0% ↔  0.0%        82.9% ↔  0.2%       
optimisticLCP             NaN% ↓  NaN%         NaN% ↓  NaN%         NaN% ↓  NaN%        
pessimisticLCP            NaN% ↓  NaN%         NaN% ↓  NaN%         NaN% ↓  NaN%        
roughEstimateOfLCP        NaN% ↓  NaN%         NaN% ↓  NaN%         NaN% ↓  NaN%        

 ------- Fixes Summary -------
FCP on http://www.cnet.com/ - 3046 (real) 2859 (cur) 2162 (prev)
FCP on http://www.rakuten.ne.jp/ - 6988 (real) 3941 (cur) 2750 (prev)
TTFCPUI on http://www.metrolyrics.com/ - 27321 (real) 34647 (cur) 39302 (prev)
TTFCPUI on http://www.4399.com/ - 5413 (real) 4229 (cur) 3585 (prev)

 ------- Regression Summary -------
TTFCPUI on http://www.deviantart.com/ - 11309 (real) 21719 (cur) 9961 (prev)
SI on http://www.pdfqueen.com/ - 2421 (real) 3428 (cur) 2730 (prev)
TTFCPUI on http://www.pdfqueen.com/ - 3698 (real) 4727 (cur) 3803 (prev)
TTI on http://www.pdfqueen.com/ - 3698 (real) 4820 (cur) 3953 (prev)

 ------- Bucket Summary -------
Good:      242   ↓  3
OK:        185   ↑  6
Bad:       67    ↓  3

 ------- % Error Summary -------
p50:       27.4% ↑  0.3%
p90:       35.0% ↓↓ 17.9%
p95:       37.7% ↓↓ 37.3%
```

In pubads audits we duct taped this issue with https://github.com/googleads/publisher-ads-lighthouse-plugin/pull/174.

warrengm: Thinking this a bit more, I think this can be generalized a bit further (for example, when iframes are prefetched) by making sure that lighthouse doesn't choose prefetch request as initiators (in network-recorder.js or adding links to frames in page-dependency-graph.js)
warrengm: I updated the code for setting initiator request to be a bit more similar to how network edges are set in the page dependency graph. I think it's a bit cleaner than having two maps.
patrickhulce: will unfortunately need a rebase now, sorry!
warrengm: Hi @patrickhulce, I think this is ready to merge now!

I didn't notice that my branch was behind master and then went on some travels--but I made time to finish it up today.

patrickhulce: oh btw @warrengm you've got to update https://github.com/GoogleChrome/lighthouse/blob/master/lighthouse-core/test/fixtures/lantern-master-accuracy.json now too to get the lantern data tests to pass to match the expectations, nice accuracy improvements! :)
patrickhulce: friendly ping on the two last little comments on this, would love to land before 6.0 final :)
googlebot: All (the pull request submitter and all commit authors) CLAs are signed, **but** one or more commits were authored or co-authored by someone other than the pull request submitter.

We need to confirm that all authors are ok with their commits being contributed to this project.  Please have them confirm that by leaving a comment that contains only `@googlebot I consent.` in this pull request.

*Note to project maintainer:* There may be cases where the author cannot leave a comment, or the comment is not properly detected as consent.  In those cases, you can manually confirm consent of the commit author(s), and set the `cla` label to `yes` (if enabled on your project).

ℹ️ **Googlers: [Go here](https://goto.google.com/prinfo/https%3A%2F%2Fgithub.com%2FGoogleChrome%2Flighthouse%2Fpull%2F10097) for more info**.

<!-- need_author_consent -->
patrickhulce: @googlebot I consent.
googlebot: CLAs look good, thanks!

ℹ️ **Googlers: [Go here](https://goto.google.com/prinfo/https%3A%2F%2Fgithub.com%2FGoogleChrome%2Flighthouse%2Fpull%2F10097) for more info**.

<!-- ok -->

Patch:
diff --git a/lighthouse-core/computed/page-dependency-graph.js b/lighthouse-core/computed/page-dependency-graph.js
index c20a4c13b..ed0298b7a 100644
--- a/lighthouse-core/computed/page-dependency-graph.js
+++ b/lighthouse-core/computed/page-dependency-graph.js
@@ -139,21 +139,27 @@ class PageDependencyGraph {
   }
 
   /**
-   * @param {Node} rootNode
+   * @param {NetworkNode} rootNode
    * @param {NetworkNodeOutput} networkNodeOutput
    */
   static linkNetworkNodes(rootNode, networkNodeOutput) {
     networkNodeOutput.nodes.forEach(node => {
+      const directInitiatorRequest = node.record.initiatorRequest || rootNode.record;
+      const directInitiatorNode =
+        networkNodeOutput.idToNodeMap.get(directInitiatorRequest.requestId) || rootNode;
       const initiators = PageDependencyGraph.getNetworkInitiators(node.record);
       if (initiators.length) {
         initiators.forEach(initiator => {
-          const parentCandidates = networkNodeOutput.urlToNodeMap.get(initiator) || [rootNode];
-          // Only add the initiator relationship if the initiator is unambiguous
-          const parent = parentCandidates.length === 1 ? parentCandidates[0] : rootNode;
-          node.addDependency(parent);
+          const parentCandidates = networkNodeOutput.urlToNodeMap.get(initiator) || [];
+          // Only add the edge if the parent is unambiguous with valid timing.
+          if (parentCandidates.length === 1 && parentCandidates[0].startTime <= node.startTime) {
+            node.addDependency(parentCandidates[0]);
+          } else {
+            directInitiatorNode.addDependent(node);
+          }
         });
-      } else if (node !== rootNode) {
-        rootNode.addDependent(node);
+      } else if (node !== directInitiatorNode) {
+        directInitiatorNode.addDependent(node);
       }
 
       if (!node.record.redirects) return;
diff --git a/lighthouse-core/lib/network-recorder.js b/lighthouse-core/lib/network-recorder.js
index 6a83ccf86..d071b0000 100644
--- a/lighthouse-core/lib/network-recorder.js
+++ b/lighthouse-core/lib/network-recorder.js
@@ -327,6 +327,42 @@ class NetworkRecorder extends EventEmitter {
     return request;
   }
 
+  /**
+   * @param {NetworkRequest} record The record to find the initiator of
+   * @param {Map<string, NetworkRequest[]>} recordsByURL
+   * @return {NetworkRequest|null}
+   * @private
+   */
+  static _chooseInitiator(record, recordsByURL) {
+    if (record.redirectSource) {
+      return record.redirectSource;
+    }
+    const stackFrames = (record.initiator.stack && record.initiator.stack.callFrames) || [];
+    const initiatorURL = record.initiator.url || (stackFrames[0] && stackFrames[0].url);
+
+    let candidates = recordsByURL.get(initiatorURL) || [];
+    // The initiator must come before the initiated request.
+    candidates = candidates.filter(cand => cand.responseReceivedTime <= record.startTime);
+    if (candidates.length > 1) {
+      // Disambiguate based on resource type. Prefetch requests have type 'Other' and cannot
+      // initiate requests, so we drop them here.
+      const nonPrefetchCandidates = candidates.filter(
+          cand => cand.resourceType !== NetworkRequest.TYPES.Other);
+      if (nonPrefetchCandidates.length) {
+        candidates = nonPrefetchCandidates;
+      }
+    }
+    if (candidates.length > 1) {
+      // Disambiguate based on frame. It's likely that the initiator comes from the same frame.
+      const sameFrameCandidates = candidates.filter(cand => cand.frameId === record.frameId);
+      if (sameFrameCandidates.length) {
+        candidates = sameFrameCandidates;
+      }
+    }
+
+    return candidates.length ? candidates[0] : null;
+  }
+
   /**
    * Construct network records from a log of devtools protocol messages.
    * @param {LH.DevtoolsLog} devtoolsLog
@@ -340,20 +376,17 @@ class NetworkRecorder extends EventEmitter {
     // get out the list of records & filter out invalid records
     const records = networkRecorder.getRecords().filter(record => record.isValid);
 
-    // create a map of all the records by URL to link up initiator
+    /** @type {Map<string, NetworkRequest[]>} */
     const recordsByURL = new Map();
     for (const record of records) {
-      if (recordsByURL.has(record.url)) continue;
-      recordsByURL.set(record.url, record);
+      const records = recordsByURL.get(record.url) || [];
+      records.push(record);
+      recordsByURL.set(record.url, records);
     }
 
     // set the initiator and redirects array
     for (const record of records) {
-      const stackFrames = (record.initiator.stack && record.initiator.stack.callFrames) || [];
-      const initiatorURL = record.initiator.url || (stackFrames[0] && stackFrames[0].url);
-      // If we were redirected to this request, our initiator is that redirect, otherwise, it's the
-      // initiator provided by the protocol. See https://github.com/GoogleChrome/lighthouse/pull/7352/
-      const initiator = record.redirectSource || recordsByURL.get(initiatorURL);
+      const initiator = NetworkRecorder._chooseInitiator(record, recordsByURL);
       if (initiator) {
         record.setInitiatorRequest(initiator);
       }


Test patch:
diff --git a/lighthouse-core/test/computed/page-dependency-graph-test.js b/lighthouse-core/test/computed/page-dependency-graph-test.js
index 74dc96029..f26fe6640 100644
--- a/lighthouse-core/test/computed/page-dependency-graph-test.js
+++ b/lighthouse-core/test/computed/page-dependency-graph-test.js
@@ -483,6 +483,57 @@ describe('PageDependencyGraph computed artifact:', () => {
       assert.deepEqual(nodes[3].getDependencies(), [nodes[1], nodes[2]]);
     });
 
+    it('should link up script initiators only when timing is valid', () => {
+      const request1 = createRequest(1, '1', 0);
+      const request2 = createRequest(2, '2', 500);
+      const request3 = createRequest(3, '3', 500);
+      const request4 = createRequest(4, '4', 20);
+      request4.initiator = {
+        type: 'script',
+        stack: {callFrames: [{url: '2'}], parent: {parent: {callFrames: [{url: '3'}]}}},
+      };
+      const networkRecords = [request1, request2, request3, request4];
+
+      addTaskEvents(0, 0, []);
+
+      const graph = PageDependencyGraph.createGraph(traceOfTab, networkRecords);
+      const nodes = [];
+      graph.traverse(node => nodes.push(node));
+
+      assert.equal(nodes.length, 4);
+      assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
+      assert.deepEqual(nodes[0].getDependencies(), []);
+      assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
+      assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
+      assert.deepEqual(nodes[3].getDependencies(), [nodes[0]]);
+    });
+
+    it('should link up script initiators with prefetch requests', () => {
+      const request1 = createRequest(1, 'a.com/1', 0);
+      const request2Prefetch = createRequest(2, 'a.com/js', 5);
+      const request2Fetch = createRequest(3, 'a.com/js', 10);
+      const request3 = createRequest(4, 'a.com/4', 20);
+      request3.initiator = {
+        type: 'script',
+        stack: {callFrames: [{url: 'a.com/js'}], parent: {parent: {callFrames: [{url: 'js'}]}}},
+      };
+      request3.initiatorRequest = request2Fetch;
+      const networkRecords = [request1, request2Prefetch, request2Fetch, request3];
+
+      addTaskEvents(0, 0, []);
+
+      const graph = PageDependencyGraph.createGraph(traceOfTab, networkRecords);
+      const nodes = [];
+      graph.traverse(node => nodes.push(node));
+
+      assert.equal(nodes.length, 4);
+      assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
+      assert.deepEqual(nodes[0].getDependencies(), []);
+      assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
+      assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
+      assert.deepEqual(nodes[3].getDependencies(), [nodes[2]]);
+    });
+
     it('should throw when root node is not related to main document', () => {
       const request1 = createRequest(1, '1', 0, null, NetworkRequest.TYPES.Other);
       const request2 = createRequest(2, '2', 5, null, NetworkRequest.TYPES.Document);
diff --git a/lighthouse-core/test/fixtures/lantern-master-accuracy.json b/lighthouse-core/test/fixtures/lantern-master-accuracy.json
index dfcfef02a..b51fb1ad8 100644
--- a/lighthouse-core/test/fixtures/lantern-master-accuracy.json
+++ b/lighthouse-core/test/fixtures/lantern-master-accuracy.json
@@ -5,28 +5,28 @@
     "p95": 0.5795269168026101
   },
   "roughEstimateOfFMP": {
-    "p50": 0.3129196884233145,
+    "p50": 0.3114278173660596,
     "p90": 0.5385564466378778,
     "p95": 0.6641924269472893
   },
   "roughEstimateOfSI": {
     "p50": 0.27011225444340503,
     "p90": 0.6267744048918978,
-    "p95": 0.9847542003733665
+    "p95": 0.9915404288805824
   },
   "roughEstimateOfTTFCPUI": {
-    "p50": 0.307951137444225,
-    "p90": 0.6159518516510329,
-    "p95": 0.7404564989707104
+    "p50": 0.2951503181917928,
+    "p90": 0.6422540616604836,
+    "p95": 0.9250387487670847
   },
   "roughEstimateOfTTI": {
-    "p50": 0.3131914893617021,
+    "p50": 0.31149493746277546,
     "p90": 0.6774419418835337,
     "p95": 0.7467400959317818
   },
   "roughEstimateOfLCP": {
-    "p50": 0.2813953488372093,
-    "p90": 0.9142573930282505,
+    "p50": 0.30685920577617326,
+    "p90": 0.9659546061415221,
     "p95": 1.6544450025113009
   }
 }
\ No newline at end of file
diff --git a/lighthouse-core/test/fixtures/lantern-master-computed-values.json b/lighthouse-core/test/fixtures/lantern-master-computed-values.json
index 9694780ce..ebf716481 100644
--- a/lighthouse-core/test/fixtures/lantern-master-computed-values.json
+++ b/lighthouse-core/test/fixtures/lantern-master-computed-values.json
@@ -5,76 +5,76 @@
     {"url": "https://birdsarentreal.com", "roughEstimateOfFCP": 2929, "optimisticFCP": 2929, "pessimisticFCP": 2929, "roughEstimateOfFMP": 3566, "optimisticFMP": 3250, "pessimisticFMP": 3882, "roughEstimateOfTTI": 12336, "optimisticTTI": 11452, "pessimisticTTI": 13221, "roughEstimateOfTTFCPUI": 11452, "optimisticTTFCPUI": 11452, "pessimisticTTFCPUI": 13221, "roughEstimateOfSI": 5653, "optimisticSI": 1323, "pessimisticSI": 6232, "roughEstimateOfEIL": 341, "optimisticEIL": 427, "pessimisticEIL": 427, "roughEstimateOfLCP": 9472, "optimisticLCP": 9259, "pessimisticLCP": 9684},
     {"url": "https://depositfiles.com/", "roughEstimateOfFCP": 5353, "optimisticFCP": 5353, "pessimisticFCP": 5353, "roughEstimateOfFMP": 5741, "optimisticFMP": 5353, "pessimisticFMP": 6129, "roughEstimateOfTTI": 6237, "optimisticTTI": 6109, "pessimisticTTI": 6364, "roughEstimateOfTTFCPUI": 6109, "optimisticTTFCPUI": 6109, "pessimisticTTFCPUI": 6364, "roughEstimateOfSI": 7733, "optimisticSI": 2787, "pessimisticSI": 6280, "roughEstimateOfEIL": 17, "optimisticEIL": 16, "pessimisticEIL": 26, "roughEstimateOfLCP": 6289, "optimisticLCP": 6289, "pessimisticLCP": 6289},
     {"url": "https://en-maktoob.yahoo.com/?p=xa", "roughEstimateOfFCP": 1350, "optimisticFCP": 1350, "pessimisticFCP": 1350, "roughEstimateOfFMP": 1366, "optimisticFMP": 1350, "pessimisticFMP": 1383, "roughEstimateOfTTI": 5777, "optimisticTTI": 5051, "pessimisticTTI": 6504, "roughEstimateOfTTFCPUI": 5051, "optimisticTTFCPUI": 5051, "pessimisticTTFCPUI": 6504, "roughEstimateOfSI": 3692, "optimisticSI": 1039, "pessimisticSI": 3828, "roughEstimateOfEIL": 86, "optimisticEIL": 108, "pessimisticEIL": 108, "roughEstimateOfLCP": 7885, "optimisticLCP": 7885, "pessimisticLCP": 7885},
-    {"url": "https://en.softonic.com", "roughEstimateOfFCP": 2119, "optimisticFCP": 2119, "pessimisticFCP": 2119, "roughEstimateOfFMP": 2119, "optimisticFMP": 2119, "pessimisticFMP": 2119, "roughEstimateOfTTI": 32834, "optimisticTTI": 27238, "pessimisticTTI": 38431, "roughEstimateOfTTFCPUI": 27238, "optimisticTTFCPUI": 27238, "pessimisticTTFCPUI": 35980, "roughEstimateOfSI": 13094, "optimisticSI": 3067, "pessimisticSI": 13923, "roughEstimateOfEIL": 403, "optimisticEIL": 504, "pessimisticEIL": 504, "roughEstimateOfLCP": 4084, "optimisticLCP": 4084, "pessimisticLCP": 4084},
+    {"url": "https://en.softonic.com", "roughEstimateOfFCP": 2119, "optimisticFCP": 2119, "pessimisticFCP": 2119, "roughEstimateOfFMP": 2488, "optimisticFMP": 2119, "pessimisticFMP": 2857, "roughEstimateOfTTI": 33636, "optimisticTTI": 27651, "pessimisticTTI": 39620, "roughEstimateOfTTFCPUI": 27651, "optimisticTTFCPUI": 27651, "pessimisticTTFCPUI": 37169, "roughEstimateOfSI": 13962, "optimisticSI": 3067, "pessimisticSI": 15258, "roughEstimateOfEIL": 408, "optimisticEIL": 510, "pessimisticEIL": 510, "roughEstimateOfLCP": 4248, "optimisticLCP": 4248, "pessimisticLCP": 4248},
     {"url": "https://gm.58.com/glsanfrancisco-sl/", "roughEstimateOfFCP": 2860, "optimisticFCP": 2860, "pessimisticFCP": 2860, "roughEstimateOfFMP": 2860, "optimisticFMP": 2860, "pessimisticFMP": 2860, "roughEstimateOfTTI": 3894, "optimisticTTI": 3526, "pessimisticTTI": 4261, "roughEstimateOfTTFCPUI": 3526, "optimisticTTFCPUI": 3526, "pessimisticTTFCPUI": 4261, "roughEstimateOfSI": 4286, "optimisticSI": 1762, "pessimisticSI": 3184, "roughEstimateOfEIL": 24, "optimisticEIL": 30, "pessimisticEIL": 30, "roughEstimateOfLCP": 5013, "optimisticLCP": 5013, "pessimisticLCP": 5013},
-    {"url": "https://m.facebook.com/", "roughEstimateOfFCP": 2407, "optimisticFCP": 2407, "pessimisticFCP": 2407, "roughEstimateOfFMP": 2407, "optimisticFMP": 2407, "pessimisticFMP": 2407, "roughEstimateOfTTI": 5081, "optimisticTTI": 4668, "pessimisticTTI": 5494, "roughEstimateOfTTFCPUI": 4668, "optimisticTTFCPUI": 4668, "pessimisticTTFCPUI": 5494, "roughEstimateOfSI": 2566, "optimisticSI": 479, "pessimisticSI": 3300, "roughEstimateOfEIL": 80, "optimisticEIL": 100, "pessimisticEIL": 100, "roughEstimateOfLCP": 3680, "optimisticLCP": 3680, "pessimisticLCP": 3680},
-    {"url": "https://m.hexun.com/", "roughEstimateOfFCP": 3929, "optimisticFCP": 3929, "pessimisticFCP": 3929, "roughEstimateOfFMP": 3929, "optimisticFMP": 3929, "pessimisticFMP": 3929, "roughEstimateOfTTI": 13424, "optimisticTTI": 9461, "pessimisticTTI": 17387, "roughEstimateOfTTFCPUI": 9461, "optimisticTTFCPUI": 9461, "pessimisticTTFCPUI": 9760, "roughEstimateOfSI": 10878, "optimisticSI": 3631, "pessimisticSI": 9298, "roughEstimateOfEIL": 52, "optimisticEIL": 65, "pessimisticEIL": 65, "roughEstimateOfLCP": 6735, "optimisticLCP": 6735, "pessimisticLCP": 6735},
+    {"url": "https://m.facebook.com/", "roughEstimateOfFCP": 2407, "optimisticFCP": 2407, "pessimisticFCP": 2407, "roughEstimateOfFMP": 2407, "optimisticFMP": 2407, "pessimisticFMP": 2407, "roughEstimateOfTTI": 4868, "optimisticTTI": 4393, "pessimisticTTI": 5343, "roughEstimateOfTTFCPUI": 4393, "optimisticTTFCPUI": 4393, "pessimisticTTFCPUI": 5343, "roughEstimateOfSI": 2440, "optimisticSI": 479, "pessimisticSI": 3107, "roughEstimateOfEIL": 80, "optimisticEIL": 100, "pessimisticEIL": 100, "roughEstimateOfLCP": 3680, "optimisticLCP": 3680, "pessimisticLCP": 3680},
+    {"url": "https://m.hexun.com/", "roughEstimateOfFCP": 3929, "optimisticFCP": 3929, "pessimisticFCP": 3929, "roughEstimateOfFMP": 3929, "optimisticFMP": 3929, "pessimisticFMP": 3929, "roughEstimateOfTTI": 13487, "optimisticTTI": 9636, "pessimisticTTI": 17338, "roughEstimateOfTTFCPUI": 9636, "optimisticTTFCPUI": 9636, "pessimisticTTFCPUI": 9760, "roughEstimateOfSI": 10869, "optimisticSI": 3631, "pessimisticSI": 9284, "roughEstimateOfEIL": 52, "optimisticEIL": 65, "pessimisticEIL": 65, "roughEstimateOfLCP": 6735, "optimisticLCP": 6735, "pessimisticLCP": 6735},
     {"url": "https://m.mop.com/", "roughEstimateOfFCP": 2609, "optimisticFCP": 2609, "pessimisticFCP": 2609, "roughEstimateOfFMP": 2609, "optimisticFMP": 2609, "pessimisticFMP": 2609, "roughEstimateOfTTI": 4824, "optimisticTTI": 4313, "pessimisticTTI": 5336, "roughEstimateOfTTFCPUI": 4313, "optimisticTTFCPUI": 4313, "pessimisticTTFCPUI": 5336, "roughEstimateOfSI": 5409, "optimisticSI": 2399, "pessimisticSI": 3538, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 3598, "optimisticLCP": 3509, "pessimisticLCP": 3687},
     {"url": "https://m.sogou.com/", "roughEstimateOfFCP": 2149, "optimisticFCP": 2149, "pessimisticFCP": 2149, "roughEstimateOfFMP": 3074, "optimisticFMP": 2149, "pessimisticFMP": 3999, "roughEstimateOfTTI": 4624, "optimisticTTI": 4491, "pessimisticTTI": 4756, "roughEstimateOfTTFCPUI": 4491, "optimisticTTFCPUI": 4491, "pessimisticTTFCPUI": 8946, "roughEstimateOfSI": 8381, "optimisticSI": 4734, "pessimisticSI": 3082, "roughEstimateOfEIL": 148, "optimisticEIL": 185, "pessimisticEIL": 185, "roughEstimateOfLCP": 5506, "optimisticLCP": 5374, "pessimisticLCP": 5638},
     {"url": "https://m.youdao.com/", "roughEstimateOfFCP": 1497, "optimisticFCP": 1497, "pessimisticFCP": 1497, "roughEstimateOfFMP": 1497, "optimisticFMP": 1497, "pessimisticFMP": 1497, "roughEstimateOfTTI": 2081, "optimisticTTI": 1497, "pessimisticTTI": 2664, "roughEstimateOfTTFCPUI": 1497, "optimisticTTFCPUI": 1497, "pessimisticTTFCPUI": 2664, "roughEstimateOfSI": 2371, "optimisticSI": 1152, "pessimisticSI": 1552, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 2304, "optimisticLCP": 2304, "pessimisticLCP": 2304},
-    {"url": "https://mail.ru/", "roughEstimateOfFCP": 3560, "optimisticFCP": 3560, "pessimisticFCP": 3560, "roughEstimateOfFMP": 3560, "optimisticFMP": 3560, "pessimisticFMP": 3560, "roughEstimateOfTTI": 24840, "optimisticTTI": 18364, "pessimisticTTI": 31317, "roughEstimateOfTTFCPUI": 16613, "optimisticTTFCPUI": 16613, "pessimisticTTFCPUI": 11661, "roughEstimateOfSI": 9747, "optimisticSI": 2087, "pessimisticSI": 10884, "roughEstimateOfEIL": 163, "optimisticEIL": 204, "pessimisticEIL": 204, "roughEstimateOfLCP": 6315, "optimisticLCP": 6315, "pessimisticLCP": 6315},
+    {"url": "https://mail.ru/", "roughEstimateOfFCP": 3560, "optimisticFCP": 3560, "pessimisticFCP": 3560, "roughEstimateOfFMP": 3560, "optimisticFMP": 3560, "pessimisticFMP": 3560, "roughEstimateOfTTI": 25796, "optimisticTTI": 19345, "pessimisticTTI": 32248, "roughEstimateOfTTFCPUI": 19345, "optimisticTTFCPUI": 19345, "pessimisticTTFCPUI": 21942, "roughEstimateOfSI": 10123, "optimisticSI": 2087, "pessimisticSI": 11463, "roughEstimateOfEIL": 137, "optimisticEIL": 172, "pessimisticEIL": 172, "roughEstimateOfLCP": 12236, "optimisticLCP": 12236, "pessimisticLCP": 12236},
     {"url": "https://mobile.twitter.com/", "roughEstimateOfFCP": 1071, "optimisticFCP": 1071, "pessimisticFCP": 1071, "roughEstimateOfFMP": 4967, "optimisticFMP": 4771, "pessimisticFMP": 5163, "roughEstimateOfTTI": 8743, "optimisticTTI": 8582, "pessimisticTTI": 8903, "roughEstimateOfTTFCPUI": 8582, "optimisticTTFCPUI": 8582, "pessimisticTTFCPUI": 8903, "roughEstimateOfSI": 4529, "optimisticSI": 1283, "pessimisticSI": 4590, "roughEstimateOfEIL": 569, "optimisticEIL": 699, "pessimisticEIL": 724, "roughEstimateOfLCP": 8823, "optimisticLCP": 8743, "pessimisticLCP": 8903},
     {"url": "https://noclip.website/", "roughEstimateOfFCP": 14373, "optimisticFCP": 14373, "pessimisticFCP": 14373, "roughEstimateOfFMP": 14373, "optimisticFMP": 14373, "pessimisticFMP": 14373, "roughEstimateOfTTI": 14812, "optimisticTTI": 14725, "pessimisticTTI": 14900, "roughEstimateOfTTFCPUI": 14373, "optimisticTTFCPUI": 2782, "pessimisticTTFCPUI": 2932, "roughEstimateOfSI": 14373, "optimisticSI": 606, "pessimisticSI": 14373, "roughEstimateOfEIL": 190, "optimisticEIL": 237, "pessimisticEIL": 237, "roughEstimateOfLCP": 14900, "optimisticLCP": 14900, "pessimisticLCP": 14900},
     {"url": "https://noclip.website/#bk/01;ZNCA8Ac%7d%7b15_%28S%7bMfXPk;;zm%28[o$K3YC;u%5e~P3%7duru4~L~W9l%7d&a79MC%7d=m$v*_8!_6DhC=", "roughEstimateOfFCP": 14235, "optimisticFCP": 14235, "pessimisticFCP": 14235, "roughEstimateOfFMP": 14235, "optimisticFMP": 14235, "pessimisticFMP": 14235, "roughEstimateOfTTI": 14852, "optimisticTTI": 14764, "pessimisticTTI": 14940, "roughEstimateOfTTFCPUI": 14235, "optimisticTTFCPUI": 2766, "pessimisticTTFCPUI": 2916, "roughEstimateOfSI": 14235, "optimisticSI": 584, "pessimisticSI": 14235, "roughEstimateOfEIL": 182, "optimisticEIL": 228, "pessimisticEIL": 228, "roughEstimateOfLCP": 14940, "optimisticLCP": 14940, "pessimisticLCP": 14940},
     {"url": "https://sfbay.craigslist.org/", "roughEstimateOfFCP": 1668, "optimisticFCP": 1668, "pessimisticFCP": 1668, "roughEstimateOfFMP": 2653, "optimisticFMP": 2653, "pessimisticFMP": 2653, "roughEstimateOfTTI": 2803, "optimisticTTI": 2653, "pessimisticTTI": 2953, "roughEstimateOfTTFCPUI": 2653, "optimisticTTFCPUI": 2653, "pessimisticTTFCPUI": 2953, "roughEstimateOfSI": 1778, "optimisticSI": 482, "pessimisticSI": 2083, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 1972, "optimisticLCP": 1968, "pessimisticLCP": 1976},
     {"url": "https://stripe.com/docs", "roughEstimateOfFCP": 3420, "optimisticFCP": 3420, "pessimisticFCP": 3420, "roughEstimateOfFMP": 3420, "optimisticFMP": 3420, "pessimisticFMP": 3420, "roughEstimateOfTTI": 6644, "optimisticTTI": 6024, "pessimisticTTI": 7264, "roughEstimateOfTTFCPUI": 6024, "optimisticTTFCPUI": 6024, "pessimisticTTFCPUI": 7264, "roughEstimateOfSI": 4769, "optimisticSI": 1830, "pessimisticSI": 3780, "roughEstimateOfEIL": 157, "optimisticEIL": 197, "pessimisticEIL": 197, "roughEstimateOfLCP": 5478, "optimisticLCP": 5401, "pessimisticLCP": 5555},
     {"url": "https://wap.sogou.com/", "roughEstimateOfFCP": 2173, "optimisticFCP": 2173, "pessimisticFCP": 2173, "roughEstimateOfFMP": 2992, "optimisticFMP": 2173, "pessimisticFMP": 3812, "roughEstimateOfTTI": 7019, "optimisticTTI": 6022, "pessimisticTTI": 8016, "roughEstimateOfTTFCPUI": 6022, "optimisticTTFCPUI": 6022, "pessimisticTTFCPUI": 8016, "roughEstimateOfSI": 9462, "optimisticSI": 4895, "pessimisticSI": 4399, "roughEstimateOfEIL": 174, "optimisticEIL": 218, "pessimisticEIL": 218, "roughEstimateOfLCP": 5325, "optimisticLCP": 5080, "pessimisticLCP": 5570},
-    {"url": "https://weather.com/", "roughEstimateOfFCP": 3887, "optimisticFCP": 3700, "pessimisticFCP": 4073, "roughEstimateOfFMP": 3887, "optimisticFMP": 3700, "pessimisticFMP": 4073, "roughEstimateOfTTI": 26415, "optimisticTTI": 21962, "pessimisticTTI": 30868, "roughEstimateOfTTFCPUI": 21962, "optimisticTTFCPUI": 21962, "pessimisticTTFCPUI": 30868, "roughEstimateOfSI": 15585, "optimisticSI": 1582, "pessimisticSI": 20953, "roughEstimateOfEIL": 637, "optimisticEIL": 796, "pessimisticEIL": 796, "roughEstimateOfLCP": 5032, "optimisticLCP": 5032, "pessimisticLCP": 5032},
+    {"url": "https://weather.com/", "roughEstimateOfFCP": 3887, "optimisticFCP": 3700, "pessimisticFCP": 4073, "roughEstimateOfFMP": 3887, "optimisticFMP": 3700, "pessimisticFMP": 4073, "roughEstimateOfTTI": 26759, "optimisticTTI": 22028, "pessimisticTTI": 31491, "roughEstimateOfTTFCPUI": 22028, "optimisticTTFCPUI": 22028, "pessimisticTTFCPUI": 25975, "roughEstimateOfSI": 14752, "optimisticSI": 1582, "pessimisticSI": 19671, "roughEstimateOfEIL": 637, "optimisticEIL": 796, "pessimisticEIL": 796, "roughEstimateOfLCP": 5032, "optimisticLCP": 5032, "pessimisticLCP": 5032},
     {"url": "https://www.4shared.com/", "roughEstimateOfFCP": 3639, "optimisticFCP": 3639, "pessimisticFCP": 3639, "roughEstimateOfFMP": 3877, "optimisticFMP": 3639, "pessimisticFMP": 4115, "roughEstimateOfTTI": 6486, "optimisticTTI": 5713, "pessimisticTTI": 7258, "roughEstimateOfTTFCPUI": 5713, "optimisticTTFCPUI": 5713, "pessimisticTTFCPUI": 7258, "roughEstimateOfSI": 4275, "optimisticSI": 819, "pessimisticSI": 5198, "roughEstimateOfEIL": 71, "optimisticEIL": 89, "pessimisticEIL": 89, "roughEstimateOfLCP": 4764, "optimisticLCP": 4764, "pessimisticLCP": 4764},
-    {"url": "https://www.56.com/", "roughEstimateOfFCP": 2818, "optimisticFCP": 2640, "pessimisticFCP": 2996, "roughEstimateOfFMP": 2818, "optimisticFMP": 2640, "pessimisticFMP": 2996, "roughEstimateOfTTI": 23751, "optimisticTTI": 4021, "pessimisticTTI": 43481, "roughEstimateOfTTFCPUI": 4021, "optimisticTTFCPUI": 4021, "pessimisticTTFCPUI": 2396, "roughEstimateOfSI": 20367, "optimisticSI": 5195, "pessimisticSI": 20529, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 33546, "optimisticLCP": 33546, "pessimisticLCP": 33546},
+    {"url": "https://www.56.com/", "roughEstimateOfFCP": 2818, "optimisticFCP": 2640, "pessimisticFCP": 2996, "roughEstimateOfFMP": 2818, "optimisticFMP": 2640, "pessimisticFMP": 2996, "roughEstimateOfTTI": 23676, "optimisticTTI": 3870, "pessimisticTTI": 43481, "roughEstimateOfTTFCPUI": 3870, "optimisticTTFCPUI": 3870, "pessimisticTTFCPUI": 2396, "roughEstimateOfSI": 20367, "optimisticSI": 5195, "pessimisticSI": 20529, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 33546, "optimisticLCP": 33546, "pessimisticLCP": 33546},
     {"url": "https://www.addthis.com/", "roughEstimateOfFCP": 2262, "optimisticFCP": 2262, "pessimisticFCP": 2262, "roughEstimateOfFMP": 2262, "optimisticFMP": 2262, "pessimisticFMP": 2262, "roughEstimateOfTTI": 8557, "optimisticTTI": 8348, "pessimisticTTI": 8765, "roughEstimateOfTTFCPUI": 8348, "optimisticTTFCPUI": 8348, "pessimisticTTFCPUI": 8765, "roughEstimateOfSI": 4794, "optimisticSI": 1375, "pessimisticSI": 4798, "roughEstimateOfEIL": 129, "optimisticEIL": 162, "pessimisticEIL": 162, "roughEstimateOfLCP": 2992, "optimisticLCP": 2965, "pessimisticLCP": 3018},
     {"url": "https://www.alexa.com/", "roughEstimateOfFCP": 3980, "optimisticFCP": 3980, "pessimisticFCP": 3980, "roughEstimateOfFMP": 4650, "optimisticFMP": 4336, "pessimisticFMP": 4964, "roughEstimateOfTTI": 15388, "optimisticTTI": 10911, "pessimisticTTI": 19865, "roughEstimateOfTTFCPUI": 10911, "optimisticTTFCPUI": 10911, "pessimisticTTFCPUI": 19865, "roughEstimateOfSI": 7976, "optimisticSI": 2373, "pessimisticSI": 7544, "roughEstimateOfEIL": 249, "optimisticEIL": 311, "pessimisticEIL": 311, "roughEstimateOfLCP": 8955, "optimisticLCP": 8955, "pessimisticLCP": 8955},
-    {"url": "https://www.amazon.co.jp/", "roughEstimateOfFCP": 2927, "optimisticFCP": 2927, "pessimisticFCP": 2927, "roughEstimateOfFMP": 4059, "optimisticFMP": 2927, "pessimisticFMP": 5192, "roughEstimateOfTTI": 9757, "optimisticTTI": 6987, "pessimisticTTI": 12527, "roughEstimateOfTTFCPUI": 6987, "optimisticTTFCPUI": 6987, "pessimisticTTFCPUI": 12527, "roughEstimateOfSI": 5011, "optimisticSI": 1079, "pessimisticSI": 5770, "roughEstimateOfEIL": 83, "optimisticEIL": 104, "pessimisticEIL": 104, "roughEstimateOfLCP": 6710, "optimisticLCP": 6538, "pessimisticLCP": 6882},
-    {"url": "https://www.att.com/", "roughEstimateOfFCP": 5750, "optimisticFCP": 5298, "pessimisticFCP": 6201, "roughEstimateOfFMP": 6069, "optimisticFMP": 5298, "pessimisticFMP": 6840, "roughEstimateOfTTI": 29217, "optimisticTTI": 25041, "pessimisticTTI": 33393, "roughEstimateOfTTFCPUI": 25041, "optimisticTTFCPUI": 25041, "pessimisticTTFCPUI": 30312, "roughEstimateOfSI": 10138, "optimisticSI": 1858, "pessimisticSI": 11979, "roughEstimateOfEIL": 1332, "optimisticEIL": 1665, "pessimisticEIL": 1665, "roughEstimateOfLCP": 13596, "optimisticLCP": 13596, "pessimisticLCP": 13596},
+    {"url": "https://www.amazon.co.jp/", "roughEstimateOfFCP": 2927, "optimisticFCP": 2927, "pessimisticFCP": 2927, "roughEstimateOfFMP": 4059, "optimisticFMP": 2927, "pessimisticFMP": 5192, "roughEstimateOfTTI": 9757, "optimisticTTI": 6815, "pessimisticTTI": 12699, "roughEstimateOfTTFCPUI": 6815, "optimisticTTFCPUI": 6815, "pessimisticTTFCPUI": 11493, "roughEstimateOfSI": 4985, "optimisticSI": 1079, "pessimisticSI": 5729, "roughEstimateOfEIL": 83, "optimisticEIL": 104, "pessimisticEIL": 104, "roughEstimateOfLCP": 6710, "optimisticLCP": 6538, "pessimisticLCP": 6882},
+    {"url": "https://www.att.com/", "roughEstimateOfFCP": 5750, "optimisticFCP": 5298, "pessimisticFCP": 6201, "roughEstimateOfFMP": 6069, "optimisticFMP": 5298, "pessimisticFMP": 6840, "roughEstimateOfTTI": 30103, "optimisticTTI": 25883, "pessimisticTTI": 34324, "roughEstimateOfTTFCPUI": 25883, "optimisticTTFCPUI": 25883, "pessimisticTTFCPUI": 30614, "roughEstimateOfSI": 9503, "optimisticSI": 1858, "pessimisticSI": 11003, "roughEstimateOfEIL": 1332, "optimisticEIL": 1665, "pessimisticEIL": 1665, "roughEstimateOfLCP": 13596, "optimisticLCP": 13596, "pessimisticLCP": 13596},
     {"url": "https://www.bing.com/", "roughEstimateOfFCP": 962, "optimisticFCP": 962, "pessimisticFCP": 962, "roughEstimateOfFMP": 1331, "optimisticFMP": 962, "pessimisticFMP": 1700, "roughEstimateOfTTI": 2731, "optimisticTTI": 2348, "pessimisticTTI": 3115, "roughEstimateOfTTFCPUI": 2348, "optimisticTTFCPUI": 2348, "pessimisticTTFCPUI": 3115, "roughEstimateOfSI": 1564, "optimisticSI": 467, "pessimisticSI": 1786, "roughEstimateOfEIL": 24, "optimisticEIL": 16, "pessimisticEIL": 43, "roughEstimateOfLCP": 2033, "optimisticLCP": 1958, "pessimisticLCP": 2108},
     {"url": "https://www.blogger.com/about/", "roughEstimateOfFCP": 1528, "optimisticFCP": 1528, "pessimisticFCP": 1528, "roughEstimateOfFMP": 1908, "optimisticFMP": 1683, "pessimisticFMP": 2133, "roughEstimateOfTTI": 2029, "optimisticTTI": 1926, "pessimisticTTI": 2133, "roughEstimateOfTTFCPUI": 1926, "optimisticTTFCPUI": 1926, "pessimisticTTFCPUI": 2077, "roughEstimateOfSI": 6767, "optimisticSI": 4188, "pessimisticSI": 1776, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 8886, "optimisticLCP": 8886, "pessimisticLCP": 8886},
-    {"url": "https://www.cnet.com/", "roughEstimateOfFCP": 2538, "optimisticFCP": 2237, "pessimisticFCP": 2839, "roughEstimateOfFMP": 2799, "optimisticFMP": 2558, "pessimisticFMP": 3040, "roughEstimateOfTTI": 39200, "optimisticTTI": 32393, "pessimisticTTI": 46007, "roughEstimateOfTTFCPUI": 32393, "optimisticTTFCPUI": 32393, "pessimisticTTFCPUI": 46007, "roughEstimateOfSI": 15774, "optimisticSI": 1339, "pessimisticSI": 21768, "roughEstimateOfEIL": 429, "optimisticEIL": 537, "pessimisticEIL": 537, "roughEstimateOfLCP": 4324, "optimisticLCP": 4324, "pessimisticLCP": 4324},
+    {"url": "https://www.cnet.com/", "roughEstimateOfFCP": 2538, "optimisticFCP": 2237, "pessimisticFCP": 2839, "roughEstimateOfFMP": 2799, "optimisticFMP": 2558, "pessimisticFMP": 3040, "roughEstimateOfTTI": 42198, "optimisticTTI": 38324, "pessimisticTTI": 46073, "roughEstimateOfTTFCPUI": 38324, "optimisticTTFCPUI": 38324, "pessimisticTTFCPUI": 46073, "roughEstimateOfSI": 15591, "optimisticSI": 1339, "pessimisticSI": 21487, "roughEstimateOfEIL": 429, "optimisticEIL": 537, "pessimisticEIL": 537, "roughEstimateOfLCP": 4324, "optimisticLCP": 4324, "pessimisticLCP": 4324},
     {"url": "https://www.codewars.com", "roughEstimateOfFCP": 2284, "optimisticFCP": 2284, "pessimisticFCP": 2284, "roughEstimateOfFMP": 3617, "optimisticFMP": 2568, "pessimisticFMP": 4666, "roughEstimateOfTTI": 5946, "optimisticTTI": 5704, "pessimisticTTI": 6188, "roughEstimateOfTTFCPUI": 5704, "optimisticTTFCPUI": 5704, "pessimisticTTFCPUI": 6188, "roughEstimateOfSI": 2817, "optimisticSI": 834, "pessimisticSI": 2922, "roughEstimateOfEIL": 146, "optimisticEIL": 174, "pessimisticEIL": 191, "roughEstimateOfLCP": 9668, "optimisticLCP": 9668, "pessimisticLCP": 9668},
-    {"url": "https://www.dawn.com/", "roughEstimateOfFCP": 2492, "optimisticFCP": 2411, "pessimisticFCP": 2573, "roughEstimateOfFMP": 2654, "optimisticFMP": 2573, "pessimisticFMP": 2735, "roughEstimateOfTTI": 25412, "optimisticTTI": 22718, "pessimisticTTI": 28106, "roughEstimateOfTTFCPUI": 22718, "optimisticTTFCPUI": 22718, "pessimisticTTFCPUI": 28106, "roughEstimateOfSI": 11449, "optimisticSI": 1332, "pessimisticSI": 15129, "roughEstimateOfEIL": 463, "optimisticEIL": 579, "pessimisticEIL": 579, "roughEstimateOfLCP": 6678, "optimisticLCP": 6678, "pessimisticLCP": 6678},
+    {"url": "https://www.dawn.com/", "roughEstimateOfFCP": 2654, "optimisticFCP": 2411, "pessimisticFCP": 2897, "roughEstimateOfFMP": 2897, "optimisticFMP": 2573, "pessimisticFMP": 3221, "roughEstimateOfTTI": 25900, "optimisticTTI": 22718, "pessimisticTTI": 29083, "roughEstimateOfTTFCPUI": 22718, "optimisticTTFCPUI": 22718, "pessimisticTTFCPUI": 29083, "roughEstimateOfSI": 10933, "optimisticSI": 1332, "pessimisticSI": 14335, "roughEstimateOfEIL": 463, "optimisticEIL": 579, "pessimisticEIL": 579, "roughEstimateOfLCP": 7128, "optimisticLCP": 7128, "pessimisticLCP": 7128},
     {"url": "https://www.deviantart.com/", "roughEstimateOfFCP": 2920, "optimisticFCP": 2920, "pessimisticFCP": 2920, "roughEstimateOfFMP": 2920, "optimisticFMP": 2920, "pessimisticFMP": 2920, "roughEstimateOfTTI": 13102, "optimisticTTI": 11090, "pessimisticTTI": 15113, "roughEstimateOfTTFCPUI": 11090, "optimisticTTFCPUI": 11090, "pessimisticTTFCPUI": 6725, "roughEstimateOfSI": 3069, "optimisticSI": 996, "pessimisticSI": 2962, "roughEstimateOfEIL": 1617, "optimisticEIL": 2021, "pessimisticEIL": 2021, "roughEstimateOfLCP": 13742, "optimisticLCP": 13742, "pessimisticLCP": 13742},
-    {"url": "https://www.domaintools.com/", "roughEstimateOfFCP": 3131, "optimisticFCP": 3050, "pessimisticFCP": 3212, "roughEstimateOfFMP": 4658, "optimisticFMP": 3212, "pessimisticFMP": 6104, "roughEstimateOfTTI": 9173, "optimisticTTI": 8858, "pessimisticTTI": 9489, "roughEstimateOfTTFCPUI": 8858, "optimisticTTFCPUI": 8858, "pessimisticTTFCPUI": 9489, "roughEstimateOfSI": 7507, "optimisticSI": 3235, "pessimisticSI": 4968, "roughEstimateOfEIL": 140, "optimisticEIL": 117, "pessimisticEIL": 234, "roughEstimateOfLCP": 12639, "optimisticLCP": 10495, "pessimisticLCP": 14783},
-    {"url": "https://www.ebay.com/", "roughEstimateOfFCP": 2141, "optimisticFCP": 2141, "pessimisticFCP": 2141, "roughEstimateOfFMP": 2460, "optimisticFMP": 2460, "pessimisticFMP": 2460, "roughEstimateOfTTI": 14484, "optimisticTTI": 12667, "pessimisticTTI": 16302, "roughEstimateOfTTFCPUI": 12667, "optimisticTTFCPUI": 12667, "pessimisticTTFCPUI": 16302, "roughEstimateOfSI": 4620, "optimisticSI": 628, "pessimisticSI": 6140, "roughEstimateOfEIL": 548, "optimisticEIL": 685, "pessimisticEIL": 685, "roughEstimateOfLCP": 4110, "optimisticLCP": 4110, "pessimisticLCP": 4110},
+    {"url": "https://www.domaintools.com/", "roughEstimateOfFCP": 3131, "optimisticFCP": 3050, "pessimisticFCP": 3212, "roughEstimateOfFMP": 4786, "optimisticFMP": 3263, "pessimisticFMP": 6310, "roughEstimateOfTTI": 9586, "optimisticTTI": 9270, "pessimisticTTI": 9901, "roughEstimateOfTTFCPUI": 9270, "optimisticTTFCPUI": 9270, "pessimisticTTFCPUI": 9901, "roughEstimateOfSI": 7534, "optimisticSI": 3235, "pessimisticSI": 5008, "roughEstimateOfEIL": 165, "optimisticEIL": 165, "pessimisticEIL": 249, "roughEstimateOfLCP": 12742, "optimisticLCP": 10495, "pessimisticLCP": 14989},
+    {"url": "https://www.ebay.com/", "roughEstimateOfFCP": 2141, "optimisticFCP": 2141, "pessimisticFCP": 2141, "roughEstimateOfFMP": 2460, "optimisticFMP": 2460, "pessimisticFMP": 2460, "roughEstimateOfTTI": 15196, "optimisticTTI": 14021, "pessimisticTTI": 16371, "roughEstimateOfTTFCPUI": 14021, "optimisticTTFCPUI": 14021, "pessimisticTTFCPUI": 16371, "roughEstimateOfSI": 4366, "optimisticSI": 628, "pessimisticSI": 5749, "roughEstimateOfEIL": 548, "optimisticEIL": 685, "pessimisticEIL": 685, "roughEstimateOfLCP": 4110, "optimisticLCP": 4110, "pessimisticLCP": 4110},
     {"url": "https://www.ebs.in/IPS/", "roughEstimateOfFCP": 6387, "optimisticFCP": 4297, "pessimisticFCP": 8476, "roughEstimateOfFMP": 7027, "optimisticFMP": 4755, "pessimisticFMP": 9300, "roughEstimateOfTTI": 14938, "optimisticTTI": 7509, "pessimisticTTI": 22366, "roughEstimateOfTTFCPUI": 7509, "optimisticTTFCPUI": 7509, "pessimisticTTFCPUI": 3255, "roughEstimateOfSI": 13591, "optimisticSI": 4003, "pessimisticSI": 12671, "roughEstimateOfEIL": 36, "optimisticEIL": 16, "pessimisticEIL": 75, "roughEstimateOfLCP": 11108, "optimisticLCP": 6356, "pessimisticLCP": 15860},
     {"url": "https://www.espn.com/", "roughEstimateOfFCP": 3876, "optimisticFCP": 3850, "pessimisticFCP": 3902, "roughEstimateOfFMP": 5363, "optimisticFMP": 3850, "pessimisticFMP": 6877, "roughEstimateOfTTI": 35614, "optimisticTTI": 31194, "pessimisticTTI": 40035, "roughEstimateOfTTFCPUI": 31194, "optimisticTTFCPUI": 31194, "pessimisticTTFCPUI": 35562, "roughEstimateOfSI": 13874, "optimisticSI": 2989, "pessimisticSI": 15291, "roughEstimateOfEIL": 3506, "optimisticEIL": 4382, "pessimisticEIL": 4382, "roughEstimateOfLCP": 7675, "optimisticLCP": 7675, "pessimisticLCP": 7675},
     {"url": "https://www.flipkart.com", "roughEstimateOfFCP": 2352, "optimisticFCP": 2352, "pessimisticFCP": 2352, "roughEstimateOfFMP": 3830, "optimisticFMP": 2512, "pessimisticFMP": 5149, "roughEstimateOfTTI": 12625, "optimisticTTI": 10186, "pessimisticTTI": 15064, "roughEstimateOfTTFCPUI": 10186, "optimisticTTFCPUI": 10186, "pessimisticTTFCPUI": 15064, "roughEstimateOfSI": 7406, "optimisticSI": 3188, "pessimisticSI": 4912, "roughEstimateOfEIL": 299, "optimisticEIL": 374, "pessimisticEIL": 374, "roughEstimateOfLCP": 12424, "optimisticLCP": 12221, "pessimisticLCP": 12627},
-    {"url": "https://www.foxnews.com/", "roughEstimateOfFCP": 3526, "optimisticFCP": 3526, "pessimisticFCP": 3526, "roughEstimateOfFMP": 3526, "optimisticFMP": 3526, "pessimisticFMP": 3526, "roughEstimateOfTTI": 25517, "optimisticTTI": 19976, "pessimisticTTI": 31057, "roughEstimateOfTTFCPUI": 19976, "optimisticTTFCPUI": 19976, "pessimisticTTFCPUI": 22710, "roughEstimateOfSI": 12104, "optimisticSI": 1187, "pessimisticSI": 16450, "roughEstimateOfEIL": 257, "optimisticEIL": 321, "pessimisticEIL": 321, "roughEstimateOfLCP": 7706, "optimisticLCP": 7706, "pessimisticLCP": 7706},
-    {"url": "https://www.gmx.net/", "roughEstimateOfFCP": 2265, "optimisticFCP": 2265, "pessimisticFCP": 2265, "roughEstimateOfFMP": 2265, "optimisticFMP": 2265, "pessimisticFMP": 2265, "roughEstimateOfTTI": 9100, "optimisticTTI": 8275, "pessimisticTTI": 9925, "roughEstimateOfTTFCPUI": 8275, "optimisticTTFCPUI": 8275, "pessimisticTTFCPUI": 9925, "roughEstimateOfSI": 4203, "optimisticSI": 1327, "pessimisticSI": 3992, "roughEstimateOfEIL": 123, "optimisticEIL": 154, "pessimisticEIL": 154, "roughEstimateOfLCP": 6857, "optimisticLCP": 6857, "pessimisticLCP": 6857},
-    {"url": "https://www.hatena.ne.jp/", "roughEstimateOfFCP": 1739, "optimisticFCP": 1739, "pessimisticFCP": 1739, "roughEstimateOfFMP": 2658, "optimisticFMP": 2270, "pessimisticFMP": 3046, "roughEstimateOfTTI": 14451, "optimisticTTI": 10990, "pessimisticTTI": 17913, "roughEstimateOfTTFCPUI": 10990, "optimisticTTFCPUI": 10990, "pessimisticTTFCPUI": 17913, "roughEstimateOfSI": 9178, "optimisticSI": 2323, "pessimisticSI": 9502, "roughEstimateOfEIL": 104, "optimisticEIL": 130, "pessimisticEIL": 130, "roughEstimateOfLCP": 8428, "optimisticLCP": 7947, "pessimisticLCP": 8909},
-    {"url": "https://www.hulu.com/welcome", "roughEstimateOfFCP": 4258, "optimisticFCP": 4097, "pessimisticFCP": 4418, "roughEstimateOfFMP": 8445, "optimisticFMP": 8044, "pessimisticFMP": 8847, "roughEstimateOfTTI": 16437, "optimisticTTI": 15459, "pessimisticTTI": 17414, "roughEstimateOfTTFCPUI": 15459, "optimisticTTFCPUI": 15459, "pessimisticTTFCPUI": 17414, "roughEstimateOfSI": 6178, "optimisticSI": 920, "pessimisticSI": 7907, "roughEstimateOfEIL": 402, "optimisticEIL": 502, "pessimisticEIL": 502, "roughEstimateOfLCP": 5130, "optimisticLCP": 5130, "pessimisticLCP": 5130},
+    {"url": "https://www.foxnews.com/", "roughEstimateOfFCP": 3526, "optimisticFCP": 3526, "pessimisticFCP": 3526, "roughEstimateOfFMP": 3526, "optimisticFMP": 3526, "pessimisticFMP": 3526, "roughEstimateOfTTI": 25639, "optimisticTTI": 19968, "pessimisticTTI": 31311, "roughEstimateOfTTFCPUI": 19968, "optimisticTTFCPUI": 19968, "pessimisticTTFCPUI": 22626, "roughEstimateOfSI": 12091, "optimisticSI": 1187, "pessimisticSI": 16430, "roughEstimateOfEIL": 257, "optimisticEIL": 321, "pessimisticEIL": 321, "roughEstimateOfLCP": 7706, "optimisticLCP": 7706, "pessimisticLCP": 7706},
+    {"url": "https://www.gmx.net/", "roughEstimateOfFCP": 2265, "optimisticFCP": 2265, "pessimisticFCP": 2265, "roughEstimateOfFMP": 2265, "optimisticFMP": 2265, "pessimisticFMP": 2265, "roughEstimateOfTTI": 9025, "optimisticTTI": 8275, "pessimisticTTI": 9775, "roughEstimateOfTTFCPUI": 8275, "optimisticTTFCPUI": 8275, "pessimisticTTFCPUI": 9775, "roughEstimateOfSI": 4171, "optimisticSI": 1327, "pessimisticSI": 3943, "roughEstimateOfEIL": 123, "optimisticEIL": 154, "pessimisticEIL": 154, "roughEstimateOfLCP": 6857, "optimisticLCP": 6857, "pessimisticLCP": 6857},
+    {"url": "https://www.hatena.ne.jp/", "roughEstimateOfFCP": 1739, "optimisticFCP": 1739, "pessimisticFCP": 1739, "roughEstimateOfFMP": 2658, "optimisticFMP": 2270, "pessimisticFMP": 3046, "roughEstimateOfTTI": 16390, "optimisticTTI": 13662, "pessimisticTTI": 19118, "roughEstimateOfTTFCPUI": 13662, "optimisticTTFCPUI": 13662, "pessimisticTTFCPUI": 19118, "roughEstimateOfSI": 8672, "optimisticSI": 2323, "pessimisticSI": 8722, "roughEstimateOfEIL": 104, "optimisticEIL": 130, "pessimisticEIL": 130, "roughEstimateOfLCP": 8428, "optimisticLCP": 7947, "pessimisticLCP": 8909},
+    {"url": "https://www.hulu.com/welcome", "roughEstimateOfFCP": 4258, "optimisticFCP": 4097, "pessimisticFCP": 4418, "roughEstimateOfFMP": 8445, "optimisticFMP": 8044, "pessimisticFMP": 8847, "roughEstimateOfTTI": 16409, "optimisticTTI": 15364, "pessimisticTTI": 17455, "roughEstimateOfTTFCPUI": 15364, "optimisticTTFCPUI": 15364, "pessimisticTTFCPUI": 17455, "roughEstimateOfSI": 6148, "optimisticSI": 920, "pessimisticSI": 7862, "roughEstimateOfEIL": 402, "optimisticEIL": 502, "pessimisticEIL": 502, "roughEstimateOfLCP": 5130, "optimisticLCP": 5130, "pessimisticLCP": 5130},
     {"url": "https://www.ifeng.com/", "roughEstimateOfFCP": 5148, "optimisticFCP": 5148, "pessimisticFCP": 5148, "roughEstimateOfFMP": 5148, "optimisticFMP": 5148, "pessimisticFMP": 5148, "roughEstimateOfTTI": 6019, "optimisticTTI": 5709, "pessimisticTTI": 6329, "roughEstimateOfTTFCPUI": 5709, "optimisticTTFCPUI": 5709, "pessimisticTTFCPUI": 6329, "roughEstimateOfSI": 7291, "optimisticSI": 2997, "pessimisticSI": 5148, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 5556, "optimisticLCP": 5556, "pessimisticLCP": 5556},
     {"url": "https://www.imageshack.us/login", "roughEstimateOfFCP": 2301, "optimisticFCP": 2299, "pessimisticFCP": 2302, "roughEstimateOfFMP": 2301, "optimisticFMP": 2299, "pessimisticFMP": 2302, "roughEstimateOfTTI": 6171, "optimisticTTI": 6064, "pessimisticTTI": 6277, "roughEstimateOfTTFCPUI": 6064, "optimisticTTFCPUI": 6064, "pessimisticTTFCPUI": 6277, "roughEstimateOfSI": 4413, "optimisticSI": 1491, "pessimisticSI": 3963, "roughEstimateOfEIL": 97, "optimisticEIL": 122, "pessimisticEIL": 122, "roughEstimateOfLCP": 3103, "optimisticLCP": 2896, "pessimisticLCP": 3309},
     {"url": "https://www.instagram.com/", "roughEstimateOfFCP": 1056, "optimisticFCP": 1056, "pessimisticFCP": 1056, "roughEstimateOfFMP": 4043, "optimisticFMP": 3968, "pessimisticFMP": 4118, "roughEstimateOfTTI": 5834, "optimisticTTI": 4928, "pessimisticTTI": 6739, "roughEstimateOfTTFCPUI": 4928, "optimisticTTFCPUI": 4928, "pessimisticTTFCPUI": 6739, "roughEstimateOfSI": 3039, "optimisticSI": 822, "pessimisticSI": 3290, "roughEstimateOfEIL": 153, "optimisticEIL": 192, "pessimisticEIL": 192, "roughEstimateOfLCP": 5481, "optimisticLCP": 5406, "pessimisticLCP": 5556},
     {"url": "https://www.irs.gov/", "roughEstimateOfFCP": 2182, "optimisticFCP": 2182, "pessimisticFCP": 2182, "roughEstimateOfFMP": 3429, "optimisticFMP": 2948, "pessimisticFMP": 3910, "roughEstimateOfTTI": 14625, "optimisticTTI": 12669, "pessimisticTTI": 16582, "roughEstimateOfTTFCPUI": 12669, "optimisticTTFCPUI": 12669, "pessimisticTTFCPUI": 16582, "roughEstimateOfSI": 4824, "optimisticSI": 818, "pessimisticSI": 6044, "roughEstimateOfEIL": 282, "optimisticEIL": 352, "pessimisticEIL": 352, "roughEstimateOfLCP": 5031, "optimisticLCP": 5031, "pessimisticLCP": 5031},
     {"url": "https://www.java.com/en/", "roughEstimateOfFCP": 956, "optimisticFCP": 956, "pessimisticFCP": 956, "roughEstimateOfFMP": 956, "optimisticFMP": 956, "pessimisticFMP": 956, "roughEstimateOfTTI": 3695, "optimisticTTI": 3188, "pessimisticTTI": 4201, "roughEstimateOfTTFCPUI": 3188, "optimisticTTFCPUI": 3188, "pessimisticTTFCPUI": 4201, "roughEstimateOfSI": 1203, "optimisticSI": 484, "pessimisticSI": 1194, "roughEstimateOfEIL": 53, "optimisticEIL": 67, "pessimisticEIL": 67, "roughEstimateOfLCP": 3138, "optimisticLCP": 3138, "pessimisticLCP": 3138},
-    {"url": "https://www.linkedin.com/", "roughEstimateOfFCP": 1903, "optimisticFCP": 1903, "pessimisticFCP": 1903, "roughEstimateOfFMP": 1903, "optimisticFMP": 1903, "pessimisticFMP": 1903, "roughEstimateOfTTI": 11601, "optimisticTTI": 9568, "pessimisticTTI": 13634, "roughEstimateOfTTFCPUI": 9568, "optimisticTTFCPUI": 9568, "pessimisticTTFCPUI": 6828, "roughEstimateOfSI": 2130, "optimisticSI": 655, "pessimisticSI": 2251, "roughEstimateOfEIL": 345, "optimisticEIL": 431, "pessimisticEIL": 431, "roughEstimateOfLCP": 2558, "optimisticLCP": 2558, "pessimisticLCP": 2558},
+    {"url": "https://www.linkedin.com/", "roughEstimateOfFCP": 1903, "optimisticFCP": 1903, "pessimisticFCP": 1903, "roughEstimateOfFMP": 1903, "optimisticFMP": 1903, "pessimisticFMP": 1903, "roughEstimateOfTTI": 11667, "optimisticTTI": 9709, "pessimisticTTI": 13624, "roughEstimateOfTTFCPUI": 9709, "optimisticTTFCPUI": 9709, "pessimisticTTFCPUI": 6818, "roughEstimateOfSI": 2067, "optimisticSI": 655, "pessimisticSI": 2154, "roughEstimateOfEIL": 345, "optimisticEIL": 431, "pessimisticEIL": 431, "roughEstimateOfLCP": 2558, "optimisticLCP": 2558, "pessimisticLCP": 2558},
     {"url": "https://www.metacafe.com/", "roughEstimateOfFCP": 1900, "optimisticFCP": 1900, "pessimisticFCP": 1900, "roughEstimateOfFMP": 1900, "optimisticFMP": 1900, "pessimisticFMP": 1900, "roughEstimateOfTTI": 5592, "optimisticTTI": 5354, "pessimisticTTI": 5831, "roughEstimateOfTTFCPUI": 5354, "optimisticTTFCPUI": 5354, "pessimisticTTFCPUI": 5831, "roughEstimateOfSI": 3120, "optimisticSI": 769, "pessimisticSI": 3529, "roughEstimateOfEIL": 67, "optimisticEIL": 84, "pessimisticEIL": 84, "roughEstimateOfLCP": 4284, "optimisticLCP": 4284, "pessimisticLCP": 4284},
-    {"url": "https://www.mgid.com/ru", "roughEstimateOfFCP": 2119, "optimisticFCP": 2119, "pessimisticFCP": 2119, "roughEstimateOfFMP": 4367, "optimisticFMP": 4231, "pessimisticFMP": 4503, "roughEstimateOfTTI": 15351, "optimisticTTI": 14392, "pessimisticTTI": 16310, "roughEstimateOfTTFCPUI": 14392, "optimisticTTFCPUI": 14392, "pessimisticTTFCPUI": 16310, "roughEstimateOfSI": 6056, "optimisticSI": 983, "pessimisticSI": 7584, "roughEstimateOfEIL": 167, "optimisticEIL": 208, "pessimisticEIL": 208, "roughEstimateOfLCP": 8340, "optimisticLCP": 8340, "pessimisticLCP": 8340},
-    {"url": "https://www.mlb.com/", "roughEstimateOfFCP": 3186, "optimisticFCP": 3186, "pessimisticFCP": 3186, "roughEstimateOfFMP": 3186, "optimisticFMP": 3186, "pessimisticFMP": 3186, "roughEstimateOfTTI": 38959, "optimisticTTI": 30571, "pessimisticTTI": 47348, "roughEstimateOfTTFCPUI": 30571, "optimisticTTFCPUI": 30571, "pessimisticTTFCPUI": 24832, "roughEstimateOfSI": 19821, "optimisticSI": 1316, "pessimisticSI": 28045, "roughEstimateOfEIL": 1178, "optimisticEIL": 1473, "pessimisticEIL": 1473, "roughEstimateOfLCP": 11088, "optimisticLCP": 11040, "pessimisticLCP": 11136},
+    {"url": "https://www.mgid.com/ru", "roughEstimateOfFCP": 2119, "optimisticFCP": 2119, "pessimisticFCP": 2119, "roughEstimateOfFMP": 4607, "optimisticFMP": 4231, "pessimisticFMP": 4983, "roughEstimateOfTTI": 15297, "optimisticTTI": 14570, "pessimisticTTI": 16023, "roughEstimateOfTTFCPUI": 14570, "optimisticTTFCPUI": 14570, "pessimisticTTFCPUI": 16023, "roughEstimateOfSI": 6074, "optimisticSI": 983, "pessimisticSI": 7612, "roughEstimateOfEIL": 170, "optimisticEIL": 212, "pessimisticEIL": 212, "roughEstimateOfLCP": 8340, "optimisticLCP": 8340, "pessimisticLCP": 8340},
+    {"url": "https://www.mlb.com/", "roughEstimateOfFCP": 3186, "optimisticFCP": 3186, "pessimisticFCP": 3186, "roughEstimateOfFMP": 3186, "optimisticFMP": 3186, "pessimisticFMP": 3186, "roughEstimateOfTTI": 41144, "optimisticTTI": 34121, "pessimisticTTI": 48167, "roughEstimateOfTTFCPUI": 34121, "optimisticTTFCPUI": 34121, "pessimisticTTFCPUI": 25056, "roughEstimateOfSI": 19845, "optimisticSI": 1316, "pessimisticSI": 28082, "roughEstimateOfEIL": 1178, "optimisticEIL": 1473, "pessimisticEIL": 1473, "roughEstimateOfLCP": 12572, "optimisticLCP": 12572, "pessimisticLCP": 12572},
     {"url": "https://www.mozilla.org/en-US/", "roughEstimateOfFCP": 2359, "optimisticFCP": 2359, "pessimisticFCP": 2359, "roughEstimateOfFMP": 2359, "optimisticFMP": 2359, "pessimisticFMP": 2359, "roughEstimateOfTTI": 4093, "optimisticTTI": 3983, "pessimisticTTI": 4203, "roughEstimateOfTTFCPUI": 3983, "optimisticTTFCPUI": 3983, "pessimisticTTFCPUI": 4203, "roughEstimateOfSI": 2669, "optimisticSI": 801, "pessimisticSI": 2767, "roughEstimateOfEIL": 47, "optimisticEIL": 59, "pessimisticEIL": 59, "roughEstimateOfLCP": 6899, "optimisticLCP": 6899, "pessimisticLCP": 6899},
     {"url": "https://www.msn.com/", "roughEstimateOfFCP": 2239, "optimisticFCP": 2079, "pessimisticFCP": 2398, "roughEstimateOfFMP": 2558, "optimisticFMP": 2079, "pessimisticFMP": 3036, "roughEstimateOfTTI": 10376, "optimisticTTI": 9377, "pessimisticTTI": 11376, "roughEstimateOfTTFCPUI": 9377, "optimisticTTFCPUI": 9377, "pessimisticTTFCPUI": 11376, "roughEstimateOfSI": 5252, "optimisticSI": 1381, "pessimisticSI": 5491, "roughEstimateOfEIL": 160, "optimisticEIL": 200, "pessimisticEIL": 200, "roughEstimateOfLCP": 3674, "optimisticLCP": 3674, "pessimisticLCP": 3674},
     {"url": "https://www.netflix.com/", "roughEstimateOfFCP": 4341, "optimisticFCP": 4341, "pessimisticFCP": 4341, "roughEstimateOfFMP": 5452, "optimisticFMP": 5391, "pessimisticFMP": 5513, "roughEstimateOfTTI": 8220, "optimisticTTI": 6026, "pessimisticTTI": 10415, "roughEstimateOfTTFCPUI": 6026, "optimisticTTFCPUI": 6026, "pessimisticTTFCPUI": 10415, "roughEstimateOfSI": 4440, "optimisticSI": 871, "pessimisticSI": 5340, "roughEstimateOfEIL": 126, "optimisticEIL": 158, "pessimisticEIL": 158, "roughEstimateOfLCP": 7646, "optimisticLCP": 7646, "pessimisticLCP": 7646},
     {"url": "https://www.nih.gov/", "roughEstimateOfFCP": 4476, "optimisticFCP": 4230, "pessimisticFCP": 4721, "roughEstimateOfFMP": 4923, "optimisticFMP": 4389, "pessimisticFMP": 5457, "roughEstimateOfTTI": 6117, "optimisticTTI": 5829, "pessimisticTTI": 6405, "roughEstimateOfTTFCPUI": 5829, "optimisticTTFCPUI": 5829, "pessimisticTTFCPUI": 6405, "roughEstimateOfSI": 4476, "optimisticSI": 830, "pessimisticSI": 5385, "roughEstimateOfEIL": 48, "optimisticEIL": 33, "pessimisticEIL": 86, "roughEstimateOfLCP": 9574, "optimisticLCP": 8357, "pessimisticLCP": 10790},
-    {"url": "https://www.ning.com/", "roughEstimateOfFCP": 2097, "optimisticFCP": 2097, "pessimisticFCP": 2097, "roughEstimateOfFMP": 3244, "optimisticFMP": 2417, "pessimisticFMP": 4071, "roughEstimateOfTTI": 17036, "optimisticTTI": 14114, "pessimisticTTI": 19958, "roughEstimateOfTTFCPUI": 14114, "optimisticTTFCPUI": 14114, "pessimisticTTFCPUI": 19958, "roughEstimateOfSI": 7281, "optimisticSI": 1385, "pessimisticSI": 8603, "roughEstimateOfEIL": 259, "optimisticEIL": 324, "pessimisticEIL": 324, "roughEstimateOfLCP": 8216, "optimisticLCP": 8038, "pessimisticLCP": 8394},
+    {"url": "https://www.ning.com/", "roughEstimateOfFCP": 2097, "optimisticFCP": 2097, "pessimisticFCP": 2097, "roughEstimateOfFMP": 3244, "optimisticFMP": 2417, "pessimisticFMP": 4071, "roughEstimateOfTTI": 16956, "optimisticTTI": 13953, "pessimisticTTI": 19958, "roughEstimateOfTTFCPUI": 13953, "optimisticTTFCPUI": 13953, "pessimisticTTFCPUI": 14055, "roughEstimateOfSI": 7263, "optimisticSI": 1385, "pessimisticSI": 8575, "roughEstimateOfEIL": 259, "optimisticEIL": 324, "pessimisticEIL": 324, "roughEstimateOfLCP": 8216, "optimisticLCP": 8038, "pessimisticLCP": 8394},
     {"url": "https://www.nokia.com/", "roughEstimateOfFCP": 2579, "optimisticFCP": 2504, "pessimisticFCP": 2654, "roughEstimateOfFMP": 2579, "optimisticFMP": 2504, "pessimisticFMP": 2654, "roughEstimateOfTTI": 10825, "optimisticTTI": 10251, "pessimisticTTI": 11399, "roughEstimateOfTTFCPUI": 9008, "optimisticTTFCPUI": 9008, "pessimisticTTFCPUI": 9677, "roughEstimateOfSI": 5127, "optimisticSI": 1367, "pessimisticSI": 5328, "roughEstimateOfEIL": 135, "optimisticEIL": 169, "pessimisticEIL": 169, "roughEstimateOfLCP": 10499, "optimisticLCP": 10419, "pessimisticLCP": 10580},
     {"url": "https://www.ocn.ne.jp/", "roughEstimateOfFCP": 3856, "optimisticFCP": 3850, "pessimisticFCP": 3862, "roughEstimateOfFMP": 3856, "optimisticFMP": 3850, "pessimisticFMP": 3862, "roughEstimateOfTTI": 9057, "optimisticTTI": 8252, "pessimisticTTI": 9862, "roughEstimateOfTTFCPUI": 8252, "optimisticTTFCPUI": 8252, "pessimisticTTFCPUI": 9862, "roughEstimateOfSI": 6299, "optimisticSI": 2266, "pessimisticSI": 5196, "roughEstimateOfEIL": 312, "optimisticEIL": 390, "pessimisticEIL": 390, "roughEstimateOfLCP": 7713, "optimisticLCP": 7713, "pessimisticLCP": 7713},
     {"url": "https://www.onet.pl/", "roughEstimateOfFCP": 2070, "optimisticFCP": 2070, "pessimisticFCP": 2070, "roughEstimateOfFMP": 2070, "optimisticFMP": 2070, "pessimisticFMP": 2070, "roughEstimateOfTTI": 11953, "optimisticTTI": 10718, "pessimisticTTI": 13187, "roughEstimateOfTTFCPUI": 10718, "optimisticTTFCPUI": 10718, "pessimisticTTFCPUI": 11832, "roughEstimateOfSI": 5718, "optimisticSI": 1759, "pessimisticSI": 5393, "roughEstimateOfEIL": 343, "optimisticEIL": 429, "pessimisticEIL": 429, "roughEstimateOfLCP": 3819, "optimisticLCP": 3819, "pessimisticLCP": 3819},
     {"url": "https://www.orange.fr/portail", "roughEstimateOfFCP": 4050, "optimisticFCP": 2992, "pessimisticFCP": 5108, "roughEstimateOfFMP": 4925, "optimisticFMP": 3448, "pessimisticFMP": 6401, "roughEstimateOfTTI": 15246, "optimisticTTI": 13675, "pessimisticTTI": 16816, "roughEstimateOfTTFCPUI": 13675, "optimisticTTFCPUI": 13675, "pessimisticTTFCPUI": 16816, "roughEstimateOfSI": 10069, "optimisticSI": 3925, "pessimisticSI": 7422, "roughEstimateOfEIL": 450, "optimisticEIL": 562, "pessimisticEIL": 562, "roughEstimateOfLCP": 7151, "optimisticLCP": 6627, "pessimisticLCP": 7675},
     {"url": "https://www.partypoker.com/", "roughEstimateOfFCP": 4948, "optimisticFCP": 4948, "pessimisticFCP": 4948, "roughEstimateOfFMP": 4948, "optimisticFMP": 4948, "pessimisticFMP": 4948, "roughEstimateOfTTI": 7128, "optimisticTTI": 5353, "pessimisticTTI": 8903, "roughEstimateOfTTFCPUI": 5353, "optimisticTTFCPUI": 5353, "pessimisticTTFCPUI": 3331, "roughEstimateOfSI": 6738, "optimisticSI": 2695, "pessimisticSI": 4948, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 10696, "optimisticLCP": 10696, "pessimisticLCP": 10696},
-    {"url": "https://www.rakuten.co.jp/", "roughEstimateOfFCP": 3309, "optimisticFCP": 3309, "pessimisticFCP": 3309, "roughEstimateOfFMP": 5114, "optimisticFMP": 3309, "pessimisticFMP": 6920, "roughEstimateOfTTI": 25423, "optimisticTTI": 18860, "pessimisticTTI": 31987, "roughEstimateOfTTFCPUI": 18860, "optimisticTTFCPUI": 18860, "pessimisticTTFCPUI": 23748, "roughEstimateOfSI": 12758, "optimisticSI": 4212, "pessimisticSI": 10939, "roughEstimateOfEIL": 205, "optimisticEIL": 247, "pessimisticEIL": 265, "roughEstimateOfLCP": 13607, "optimisticLCP": 13528, "pessimisticLCP": 13687},
+    {"url": "https://www.rakuten.co.jp/", "roughEstimateOfFCP": 3309, "optimisticFCP": 3309, "pessimisticFCP": 3309, "roughEstimateOfFMP": 5114, "optimisticFMP": 3309, "pessimisticFMP": 6920, "roughEstimateOfTTI": 25441, "optimisticTTI": 18729, "pessimisticTTI": 32154, "roughEstimateOfTTFCPUI": 18729, "optimisticTTFCPUI": 18729, "pessimisticTTFCPUI": 23280, "roughEstimateOfSI": 12677, "optimisticSI": 4212, "pessimisticSI": 10815, "roughEstimateOfEIL": 205, "optimisticEIL": 247, "pessimisticEIL": 265, "roughEstimateOfLCP": 13607, "optimisticLCP": 13528, "pessimisticLCP": 13687},
     {"url": "https://www.reddit.com/", "roughEstimateOfFCP": 2204, "optimisticFCP": 2204, "pessimisticFCP": 2204, "roughEstimateOfFMP": 6836, "optimisticFMP": 5350, "pessimisticFMP": 8323, "roughEstimateOfTTI": 12063, "optimisticTTI": 10622, "pessimisticTTI": 13504, "roughEstimateOfTTFCPUI": 10622, "optimisticTTFCPUI": 10622, "pessimisticTTFCPUI": 13504, "roughEstimateOfSI": 8184, "optimisticSI": 3340, "pessimisticSI": 5780, "roughEstimateOfEIL": 1302, "optimisticEIL": 1627, "pessimisticEIL": 1627, "roughEstimateOfLCP": 10822, "optimisticLCP": 9613, "pessimisticLCP": 12031},
-    {"url": "https://www.scribd.com/", "roughEstimateOfFCP": 2099, "optimisticFCP": 2099, "pessimisticFCP": 2099, "roughEstimateOfFMP": 2099, "optimisticFMP": 2099, "pessimisticFMP": 2099, "roughEstimateOfTTI": 9283, "optimisticTTI": 8452, "pessimisticTTI": 10115, "roughEstimateOfTTFCPUI": 8452, "optimisticTTFCPUI": 8452, "pessimisticTTFCPUI": 10115, "roughEstimateOfSI": 4250, "optimisticSI": 873, "pessimisticSI": 5043, "roughEstimateOfEIL": 100, "optimisticEIL": 126, "pessimisticEIL": 126, "roughEstimateOfLCP": 11587, "optimisticLCP": 11508, "pessimisticLCP": 11667},
+    {"url": "https://www.scribd.com/", "roughEstimateOfFCP": 2099, "optimisticFCP": 2099, "pessimisticFCP": 2099, "roughEstimateOfFMP": 2099, "optimisticFMP": 2099, "pessimisticFMP": 2099, "roughEstimateOfTTI": 9782, "optimisticTTI": 9090, "pessimisticTTI": 10473, "roughEstimateOfTTFCPUI": 9090, "optimisticTTFCPUI": 9090, "pessimisticTTFCPUI": 10473, "roughEstimateOfSI": 4347, "optimisticSI": 873, "pessimisticSI": 5193, "roughEstimateOfEIL": 100, "optimisticEIL": 126, "pessimisticEIL": 126, "roughEstimateOfLCP": 12066, "optimisticLCP": 11827, "pessimisticLCP": 12305},
     {"url": "https://www.shopping.com/", "roughEstimateOfFCP": 2855, "optimisticFCP": 2433, "pessimisticFCP": 3277, "roughEstimateOfFMP": 2855, "optimisticFMP": 2433, "pessimisticFMP": 3277, "roughEstimateOfTTI": 5455, "optimisticTTI": 4934, "pessimisticTTI": 5975, "roughEstimateOfTTFCPUI": 4934, "optimisticTTFCPUI": 4934, "pessimisticTTFCPUI": 5975, "roughEstimateOfSI": 3633, "optimisticSI": 1210, "pessimisticSI": 3368, "roughEstimateOfEIL": 344, "optimisticEIL": 430, "pessimisticEIL": 430, "roughEstimateOfLCP": 3845, "optimisticLCP": 3845, "pessimisticLCP": 3845},
     {"url": "https://www.skype.com/en/", "roughEstimateOfFCP": 2497, "optimisticFCP": 2497, "pessimisticFCP": 2497, "roughEstimateOfFMP": 2804, "optimisticFMP": 2497, "pessimisticFMP": 3110, "roughEstimateOfTTI": 5732, "optimisticTTI": 5039, "pessimisticTTI": 6425, "roughEstimateOfTTFCPUI": 5039, "optimisticTTFCPUI": 5039, "pessimisticTTFCPUI": 6425, "roughEstimateOfSI": 4055, "optimisticSI": 1120, "pessimisticSI": 4211, "roughEstimateOfEIL": 89, "optimisticEIL": 111, "pessimisticEIL": 111, "roughEstimateOfLCP": 5285, "optimisticLCP": 4664, "pessimisticLCP": 5907},
     {"url": "https://www.so-net.ne.jp/m/", "roughEstimateOfFCP": 3774, "optimisticFCP": 3167, "pessimisticFCP": 4381, "roughEstimateOfFMP": 3774, "optimisticFMP": 3167, "pessimisticFMP": 4381, "roughEstimateOfTTI": 8910, "optimisticTTI": 7083, "pessimisticTTI": 10738, "roughEstimateOfTTFCPUI": 7083, "optimisticTTFCPUI": 7083, "pessimisticTTFCPUI": 10738, "roughEstimateOfSI": 7556, "optimisticSI": 2439, "pessimisticSI": 6755, "roughEstimateOfEIL": 142, "optimisticEIL": 178, "pessimisticEIL": 178, "roughEstimateOfLCP": 8816, "optimisticLCP": 8736, "pessimisticLCP": 8896},
     {"url": "https://www.symantec.com/", "roughEstimateOfFCP": 3764, "optimisticFCP": 3610, "pessimisticFCP": 3918, "roughEstimateOfFMP": 3824, "optimisticFMP": 3610, "pessimisticFMP": 4037, "roughEstimateOfTTI": 11615, "optimisticTTI": 8631, "pessimisticTTI": 14598, "roughEstimateOfTTFCPUI": 8631, "optimisticTTFCPUI": 8631, "pessimisticTTFCPUI": 10787, "roughEstimateOfSI": 7713, "optimisticSI": 2165, "pessimisticSI": 7587, "roughEstimateOfEIL": 345, "optimisticEIL": 431, "pessimisticEIL": 431, "roughEstimateOfLCP": 11640, "optimisticLCP": 11057, "pessimisticLCP": 12223},
-    {"url": "https://www.thestar.com.my/", "roughEstimateOfFCP": 3093, "optimisticFCP": 2230, "pessimisticFCP": 3956, "roughEstimateOfFMP": 3093, "optimisticFMP": 2230, "pessimisticFMP": 3956, "roughEstimateOfTTI": 21450, "optimisticTTI": 17739, "pessimisticTTI": 25161, "roughEstimateOfTTFCPUI": 17739, "optimisticTTFCPUI": 17739, "pessimisticTTFCPUI": 25161, "roughEstimateOfSI": 14870, "optimisticSI": 5315, "pessimisticSI": 11815, "roughEstimateOfEIL": 128, "optimisticEIL": 160, "pessimisticEIL": 160, "roughEstimateOfLCP": 15593, "optimisticLCP": 15509, "pessimisticLCP": 15678},
+    {"url": "https://www.thestar.com.my/", "roughEstimateOfFCP": 3093, "optimisticFCP": 2230, "pessimisticFCP": 3956, "roughEstimateOfFMP": 3093, "optimisticFMP": 2230, "pessimisticFMP": 3956, "roughEstimateOfTTI": 21562, "optimisticTTI": 17873, "pessimisticTTI": 25250, "roughEstimateOfTTFCPUI": 17873, "optimisticTTFCPUI": 17873, "pessimisticTTFCPUI": 18713, "roughEstimateOfSI": 14850, "optimisticSI": 5315, "pessimisticSI": 11784, "roughEstimateOfEIL": 128, "optimisticEIL": 160, "pessimisticEIL": 160, "roughEstimateOfLCP": 15593, "optimisticLCP": 15509, "pessimisticLCP": 15678},
     {"url": "https://www.tianya.cn/m/", "roughEstimateOfFCP": 3501, "optimisticFCP": 3501, "pessimisticFCP": 3501, "roughEstimateOfFMP": 3574, "optimisticFMP": 3501, "pessimisticFMP": 3646, "roughEstimateOfTTI": 5528, "optimisticTTI": 5196, "pessimisticTTI": 5860, "roughEstimateOfTTFCPUI": 5593, "optimisticTTFCPUI": 5593, "pessimisticTTFCPUI": 7375, "roughEstimateOfSI": 14424, "optimisticSI": 8681, "pessimisticSI": 3878, "roughEstimateOfEIL": 27, "optimisticEIL": 34, "pessimisticEIL": 34, "roughEstimateOfLCP": 7934, "optimisticLCP": 7926, "pessimisticLCP": 7941},
     {"url": "https://www.torrentz.com/", "roughEstimateOfFCP": 817, "optimisticFCP": 817, "pessimisticFCP": 817, "roughEstimateOfFMP": 817, "optimisticFMP": 817, "pessimisticFMP": 817, "roughEstimateOfTTI": 817, "optimisticTTI": 817, "pessimisticTTI": 817, "roughEstimateOfTTFCPUI": 817, "optimisticTTFCPUI": 817, "pessimisticTTFCPUI": 817, "roughEstimateOfSI": 863, "optimisticSI": 416, "pessimisticSI": 817, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 817, "optimisticLCP": 817, "pessimisticLCP": 817},
     {"url": "https://www.tumblr.com/", "roughEstimateOfFCP": 2508, "optimisticFCP": 2508, "pessimisticFCP": 2508, "roughEstimateOfFMP": 2508, "optimisticFMP": 2508, "pessimisticFMP": 2508, "roughEstimateOfTTI": 9662, "optimisticTTI": 9428, "pessimisticTTI": 9895, "roughEstimateOfTTFCPUI": 3112, "optimisticTTFCPUI": 3112, "pessimisticTTFCPUI": 3268, "roughEstimateOfSI": 3697, "optimisticSI": 628, "pessimisticSI": 4720, "roughEstimateOfEIL": 258, "optimisticEIL": 322, "pessimisticEIL": 322, "roughEstimateOfLCP": 8835, "optimisticLCP": 8835, "pessimisticLCP": 8835},
     {"url": "https://www.twitpic.com/", "roughEstimateOfFCP": 807, "optimisticFCP": 807, "pessimisticFCP": 807, "roughEstimateOfFMP": 807, "optimisticFMP": 807, "pessimisticFMP": 807, "roughEstimateOfTTI": 807, "optimisticTTI": 807, "pessimisticTTI": 807, "roughEstimateOfTTFCPUI": 807, "optimisticTTFCPUI": 807, "pessimisticTTFCPUI": 807, "roughEstimateOfSI": 807, "optimisticSI": 121, "pessimisticSI": 848, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 807, "optimisticLCP": 807, "pessimisticLCP": 807},
     {"url": "https://www.typepad.com/", "roughEstimateOfFCP": 2757, "optimisticFCP": 2757, "pessimisticFCP": 2757, "roughEstimateOfFMP": 3317, "optimisticFMP": 3077, "pessimisticFMP": 3556, "roughEstimateOfTTI": 3835, "optimisticTTI": 3716, "pessimisticTTI": 3953, "roughEstimateOfTTFCPUI": 3716, "optimisticTTFCPUI": 3716, "pessimisticTTFCPUI": 3953, "roughEstimateOfSI": 3121, "optimisticSI": 1009, "pessimisticSI": 3012, "roughEstimateOfEIL": 13, "optimisticEIL": 16, "pessimisticEIL": 16, "roughEstimateOfLCP": 13276, "optimisticLCP": 13276, "pessimisticLCP": 13276},
-    {"url": "https://www.verizonwireless.com/", "roughEstimateOfFCP": 3039, "optimisticFCP": 3039, "pessimisticFCP": 3039, "roughEstimateOfFMP": 3954, "optimisticFMP": 3954, "pessimisticFMP": 3954, "roughEstimateOfTTI": 20972, "optimisticTTI": 18328, "pessimisticTTI": 23616, "roughEstimateOfTTFCPUI": 18328, "optimisticTTFCPUI": 18328, "pessimisticTTFCPUI": 23616, "roughEstimateOfSI": 5986, "optimisticSI": 870, "pessimisticSI": 7720, "roughEstimateOfEIL": 1114, "optimisticEIL": 1393, "pessimisticEIL": 1393, "roughEstimateOfLCP": 6979, "optimisticLCP": 6899, "pessimisticLCP": 7060},
-    {"url": "https://www.vevo.com/", "roughEstimateOfFCP": 5347, "optimisticFCP": 5347, "pessimisticFCP": 5347, "roughEstimateOfFMP": 6365, "optimisticFMP": 5675, "pessimisticFMP": 7055, "roughEstimateOfTTI": 18784, "optimisticTTI": 14871, "pessimisticTTI": 22697, "roughEstimateOfTTFCPUI": 14871, "optimisticTTFCPUI": 14871, "pessimisticTTFCPUI": 22697, "roughEstimateOfSI": 14288, "optimisticSI": 6002, "pessimisticSI": 9438, "roughEstimateOfEIL": 452, "optimisticEIL": 565, "pessimisticEIL": 565, "roughEstimateOfLCP": 9686, "optimisticLCP": 9182, "pessimisticLCP": 10191},
+    {"url": "https://www.verizonwireless.com/", "roughEstimateOfFCP": 3039, "optimisticFCP": 3039, "pessimisticFCP": 3039, "roughEstimateOfFMP": 3954, "optimisticFMP": 3954, "pessimisticFMP": 3954, "roughEstimateOfTTI": 22947, "optimisticTTI": 20298, "pessimisticTTI": 25597, "roughEstimateOfTTFCPUI": 20298, "optimisticTTFCPUI": 20298, "pessimisticTTFCPUI": 15869, "roughEstimateOfSI": 6003, "optimisticSI": 870, "pessimisticSI": 7746, "roughEstimateOfEIL": 1114, "optimisticEIL": 1393, "pessimisticEIL": 1393, "roughEstimateOfLCP": 6979, "optimisticLCP": 6899, "pessimisticLCP": 7060},
+    {"url": "https://www.vevo.com/", "roughEstimateOfFCP": 5347, "optimisticFCP": 5347, "pessimisticFCP": 5347, "roughEstimateOfFMP": 6365, "optimisticFMP": 5675, "pessimisticFMP": 7055, "roughEstimateOfTTI": 20386, "optimisticTTI": 17758, "pessimisticTTI": 23014, "roughEstimateOfTTFCPUI": 17758, "optimisticTTFCPUI": 17758, "pessimisticTTFCPUI": 23014, "roughEstimateOfSI": 14307, "optimisticSI": 6002, "pessimisticSI": 9469, "roughEstimateOfEIL": 452, "optimisticEIL": 565, "pessimisticEIL": 565, "roughEstimateOfLCP": 9686, "optimisticLCP": 9182, "pessimisticLCP": 10191},
     {"url": "https://www.wikipedia.org/", "roughEstimateOfFCP": 1458, "optimisticFCP": 1458, "pessimisticFCP": 1458, "roughEstimateOfFMP": 1472, "optimisticFMP": 1458, "pessimisticFMP": 1487, "roughEstimateOfTTI": 1731, "optimisticTTI": 1593, "pessimisticTTI": 1870, "roughEstimateOfTTFCPUI": 1593, "optimisticTTFCPUI": 1593, "pessimisticTTFCPUI": 1870, "roughEstimateOfSI": 1610, "optimisticSI": 579, "pessimisticSI": 1614, "roughEstimateOfEIL": 65, "optimisticEIL": 81, "pessimisticEIL": 81, "roughEstimateOfLCP": 1653, "optimisticLCP": 1653, "pessimisticLCP": 1653},
     {"url": "https://www8.hp.com/us/en/home.html", "roughEstimateOfFCP": 4806, "optimisticFCP": 3365, "pessimisticFCP": 6248, "roughEstimateOfFMP": 6672, "optimisticFMP": 5143, "pessimisticFMP": 8202, "roughEstimateOfTTI": 17697, "optimisticTTI": 15485, "pessimisticTTI": 19909, "roughEstimateOfTTFCPUI": 15485, "optimisticTTFCPUI": 15485, "pessimisticTTFCPUI": 19909, "roughEstimateOfSI": 12962, "optimisticSI": 3856, "pessimisticSI": 12020, "roughEstimateOfEIL": 406, "optimisticEIL": 507, "pessimisticEIL": 507, "roughEstimateOfLCP": 11020, "optimisticLCP": 10939, "pessimisticLCP": 11100}
   ]
diff --git a/lighthouse-core/test/fixtures/prefetched-script.devtoolslog.json b/lighthouse-core/test/fixtures/prefetched-script.devtoolslog.json
new file mode 100644
index 000000000..a14c2ff7e
--- /dev/null
+++ b/lighthouse-core/test/fixtures/prefetched-script.devtoolslog.json
@@ -0,0 +1,51 @@
+[
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"BD1859038737DD692A0BE0F0A3B93548","name":"commit","timestamp":11505.728685}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"BD1859038737DD692A0BE0F0A3B93548","name":"DOMContentLoaded","timestamp":11505.728789}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"BD1859038737DD692A0BE0F0A3B93548","name":"load","timestamp":11505.729029}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"BD1859038737DD692A0BE0F0A3B93548","name":"networkAlmostIdle","timestamp":11505.729376}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"BD1859038737DD692A0BE0F0A3B93548","name":"networkIdle","timestamp":11505.729376}},
+  {"method":"Network.requestWillBeSent","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","loaderId":"B3377B836B5EAB73B5508CDC916800B6","documentURL":"http://localhost:8000/home.html","request":{"url":"http://localhost:8000/home.html","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"VeryHigh","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":11505.997411,"wallTime":1576014698.354064,"initiator":{"type":"other"},"type":"Document","frameId":"C0093E205067376DAE5E33F890675B1A","hasUserGesture":false}},
+  {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","blockedCookies":[],"headers":{"Host":"localhost:8000","Connection":"keep-alive","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3963.0 Mobile Safari/537.36 Chrome-Lighthouse","Sec-Fetch-User":"?1","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Sec-Fetch-Site":"none","Sec-Fetch-Mode":"navigate","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"}}},
+  {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","blockedCookies":[],"headers":{"Server":"SimpleHTTP/0.6 Python/2.7.17rc1","Date":"Tue, 10 Dec 2019 21:51:38 GMT","Content-type":"text/html","Content-Length":"389","Last-Modified":"Tue, 10 Dec 2019 21:51:26 GMT"},"headersText":"HTTP/1.0 200 OK\r\nServer: SimpleHTTP/0.6 Python/2.7.17rc1\r\nDate: Tue, 10 Dec 2019 21:51:38 GMT\r\nContent-type: text/html\r\nContent-Length: 389\r\nLast-Modified: Tue, 10 Dec 2019 21:51:26 GMT\r\n\r\n"}},
+  {"method":"Network.responseReceived","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","loaderId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11505.999408,"type":"Document","response":{"url":"http://localhost:8000/home.html","status":200,"statusText":"OK","headers":{"Content-type":"text/html","Content-Length":"389","Last-Modified":"Tue, 10 Dec 2019 21:51:26 GMT"},"mimeType":"text/html","requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding":"gzip, deflate, br"},"connectionReused":false,"connectionId":59,"remoteIPAddress":"127.0.0.1","remotePort":8000,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":189,"timing":{"requestTime":11505.997836,"proxyStart":0.147,"proxyEnd":0.148,"dnsStart":0.174,"dnsEnd":0.183,"connectStart":0.183,"connectEnd":0.433,"sendStart":0.618,"sendEnd":0.658,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":1.101},"protocol":"http/1.0","securityState":"secure"},"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Page.frameStartedLoading","params":{"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"init","timestamp":11506.00108}},
+  {"method":"Page.frameNavigated","params":{"frame":{"id":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","url":"http://localhost:8000/home.html","securityOrigin":"http://localhost:8000","mimeType":"text/html"}}},
+  {"method":"Network.dataReceived","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11506.012463,"dataLength":389,"encodedDataLength":0}},
+  {"method":"Network.loadingFinished","params":{"requestId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11505.9993,"encodedDataLength":578,"shouldReportCorbBlocking":false}},
+  {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"129062.2","blockedCookies":[],"headers":{"Host":"localhost:8000","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3963.0 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"application/signed-exchange;v=b3;q=0.9,*/*;q=0.8","Purpose":"prefetch","Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"no-cors","Referer":"http://localhost:8000/home.html","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"}}},
+  {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"129062.2","blockedCookies":[],"headers":{"Server":"SimpleHTTP/0.6 Python/2.7.17rc1","Date":"Tue, 10 Dec 2019 21:51:38 GMT","Content-type":"application/javascript","Content-Length":"110","Last-Modified":"Tue, 10 Dec 2019 21:28:17 GMT"},"headersText":"HTTP/1.0 200 OK\r\nServer: SimpleHTTP/0.6 Python/2.7.17rc1\r\nDate: Tue, 10 Dec 2019 21:51:38 GMT\r\nContent-type: application/javascript\r\nContent-Length: 110\r\nLast-Modified: Tue, 10 Dec 2019 21:28:17 GMT\r\n\r\n"}},
+  {"method":"Network.requestWillBeSent","params":{"requestId":"129062.2","loaderId":"B3377B836B5EAB73B5508CDC916800B6","documentURL":"http://localhost:8000/home.html","request":{"url":"http://localhost:8000/loader.js","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"VeryLow","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":11506.013557,"wallTime":1576014698.370198,"initiator":{"type":"parser","url":"http://localhost:8000/home.html","lineNumber":5},"type":"Other","frameId":"C0093E205067376DAE5E33F890675B1A","hasUserGesture":false}},
+  {"method":"Network.responseReceived","params":{"requestId":"129062.2","loaderId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11507.014113,"type":"Other","response":{"url":"http://localhost:8000/loader.js","status":200,"statusText":"OK","headers":{"Last-Modified":"Tue, 10 Dec 2019 21:28:17 GMT","Content-Length":"110","Content-type":"application/javascript"},"mimeType":"application/javascript","connectionReused":true,"connectionId":64,"remoteIPAddress":"127.0.0.1","remotePort":8000,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":202,"timing":{"requestTime":11506.014069,"proxyStart":0.166,"proxyEnd":0.169,"sendStart":0.294,"sendEnd":0.375,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":0.862},"protocol":"http/1.0","securityState":"secure"},"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Network.dataReceived","params":{"requestId":"129062.2","timestamp":11507.014317,"dataLength":0,"encodedDataLength":110}},
+  {"method":"Network.loadingFinished","params":{"requestId":"129062.2","timestamp":11506.015661,"encodedDataLength":312,"shouldReportCorbBlocking":false}},
+  {"method":"Page.loadEventFired","params":{"timestamp":11507.015479}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"load","timestamp":11507.015479}},
+  {"method":"Page.frameStoppedLoading","params":{"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Page.domContentEventFired","params":{"timestamp":11507.038043}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"DOMContentLoaded","timestamp":11507.038043}},
+  {"method":"Network.requestWillBeSent","params":{"requestId":"129062.3","loaderId":"B3377B836B5EAB73B5508CDC916800B6","documentURL":"http://localhost:8000/home.html","request":{"url":"http://localhost:8000/favicon.ico","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"High","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":11507.040045,"wallTime":1576014699.396687,"initiator":{"type":"other"},"type":"Other","frameId":"C0093E205067376DAE5E33F890675B1A","hasUserGesture":false}},
+  {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"129062.3","blockedCookies":[],"headers":{"Host":"localhost:8000","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3963.0 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"image/webp,image/apng,image/*,*/*;q=0.8","Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"no-cors","Referer":"http://localhost:8000/home.html","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"}}},
+  {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"129062.3","blockedCookies":[],"headers":{"Server":"SimpleHTTP/0.6 Python/2.7.17rc1","Date":"Tue, 10 Dec 2019 21:51:39 GMT","Connection":"close","Content-Type":"text/html"},"headersText":"HTTP/1.0 404 File not found\r\nServer: SimpleHTTP/0.6 Python/2.7.17rc1\r\nDate: Tue, 10 Dec 2019 21:51:39 GMT\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"}},
+  {"method":"Network.responseReceived","params":{"requestId":"129062.3","loaderId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11507.042353,"type":"Other","response":{"url":"http://localhost:8000/favicon.ico","status":404,"statusText":"File not found","headers":{"Content-Type":"text/html"},"mimeType":"text/html","connectionReused":false,"connectionId":74,"remoteIPAddress":"127.0.0.1","remotePort":8000,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":153,"timing":{"requestTime":11507.040371,"proxyStart":0.284,"proxyEnd":0.288,"dnsStart":0.321,"dnsEnd":0.333,"connectStart":0.333,"connectEnd":0.62,"sendStart":0.673,"sendEnd":0.733,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":1.449},"protocol":"http/1.0","securityState":"secure"},"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Network.dataReceived","params":{"requestId":"129062.3","timestamp":11507.042526,"dataLength":195,"encodedDataLength":0}},
+  {"method":"Network.dataReceived","params":{"requestId":"129062.3","timestamp":11507.042781,"dataLength":0,"encodedDataLength":195}},
+  {"method":"Network.loadingFinished","params":{"requestId":"129062.3","timestamp":11507.042533,"encodedDataLength":348,"shouldReportCorbBlocking":false}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"firstPaint","timestamp":11507.047823}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"firstContentfulPaint","timestamp":11507.047823}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"firstMeaningfulPaintCandidate","timestamp":11507.047823}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"networkAlmostIdle","timestamp":11507.038048}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"firstMeaningfulPaint","timestamp":11507.047823}},
+  {"method":"Page.lifecycleEvent","params":{"frameId":"C0093E205067376DAE5E33F890675B1A","loaderId":"B3377B836B5EAB73B5508CDC916800B6","name":"networkIdle","timestamp":11507.042798}},
+  {"method":"Network.requestWillBeSent","params":{"requestId":"129062.4","loaderId":"B3377B836B5EAB73B5508CDC916800B6","documentURL":"http://localhost:8000/home.html","request":{"url":"http://localhost:8000/loader.js","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":11508.014933,"wallTime":1576014700.371575,"initiator":{"type":"script","stack":{"callFrames":[{"functionName":"","scriptId":"12","url":"http://localhost:8000/home.html","lineNumber":13,"columnNumber":18}],"parent":{"description":"setTimeout","callFrames":[{"functionName":"","scriptId":"12","url":"http://localhost:8000/home.html","lineNumber":10,"columnNumber":2}]}}},"type":"Script","frameId":"C0093E205067376DAE5E33F890675B1A","hasUserGesture":false}},
+  {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"129062.4","blockedCookies":[],"headers":{"Server":"SimpleHTTP/0.6 Python/2.7.17rc1","Date":"Tue, 10 Dec 2019 21:51:38 GMT","Content-type":"application/javascript","Content-Length":"110","Last-Modified":"Tue, 10 Dec 2019 21:28:17 GMT"},"headersText":"HTTP/1.0 200 OK\r\nServer: SimpleHTTP/0.6 Python/2.7.17rc1\r\nDate: Tue, 10 Dec 2019 21:51:38 GMT\r\nContent-type: application/javascript\r\nContent-Length: 110\r\nLast-Modified: Tue, 10 Dec 2019 21:28:17 GMT\r\n\r\n"}},
+  {"method":"Network.responseReceived","params":{"requestId":"129062.4","loaderId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11508.017153,"type":"Script","response":{"url":"http://localhost:8000/loader.js","status":200,"statusText":"OK","headers":{"Last-Modified":"Tue, 10 Dec 2019 21:28:17 GMT","Content-Length":"110","Content-type":"application/javascript"},"mimeType":"application/javascript","connectionReused":false,"connectionId":0,"remoteIPAddress":"127.0.0.1","remotePort":8000,"fromDiskCache":true,"fromServiceWorker":false,"fromPrefetchCache":true,"encodedDataLength":0,"timing":{"requestTime":11508.015548,"sendStart":0.15,"sendEnd":0.15,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":0.749},"protocol":"http/1.0","securityState":"secure"},"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Network.dataReceived","params":{"requestId":"129062.4","timestamp":11508.017316,"dataLength":110,"encodedDataLength":0}},
+  {"method":"Network.loadingFinished","params":{"requestId":"129062.4","timestamp":11508.017176,"encodedDataLength":0,"shouldReportCorbBlocking":false}},
+  {"method":"Network.requestWillBeSent","params":{"requestId":"129062.5","loaderId":"B3377B836B5EAB73B5508CDC916800B6","documentURL":"http://localhost:8000/home.html","request":{"url":"http://localhost:8000/impl.js","method":"GET","headers":{},"mixedContentType":"none","initialPriority":"Low","referrerPolicy":"no-referrer-when-downgrade"},"timestamp":11508.018743,"wallTime":1576014700.375384,"initiator":{"type":"script","stack":{"callFrames":[{"functionName":"","scriptId":"13","url":"http://localhost:8000/loader.js","lineNumber":3,"columnNumber":14}]}},"type":"Script","frameId":"C0093E205067376DAE5E33F890675B1A","hasUserGesture":false}},
+  {"method":"Network.requestWillBeSentExtraInfo","params":{"requestId":"129062.5","blockedCookies":[],"headers":{"Host":"localhost:8000","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3963.0 Mobile Safari/537.36 Chrome-Lighthouse","Accept":"*/*","Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"no-cors","Referer":"http://localhost:8000/home.html","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9"}}},
+  {"method":"Network.responseReceivedExtraInfo","params":{"requestId":"129062.5","blockedCookies":[],"headers":{"Server":"SimpleHTTP/0.6 Python/2.7.17rc1","Date":"Tue, 10 Dec 2019 21:51:40 GMT","Content-type":"application/javascript","Content-Length":"101","Last-Modified":"Tue, 10 Dec 2019 21:29:11 GMT"},"headersText":"HTTP/1.0 200 OK\r\nServer: SimpleHTTP/0.6 Python/2.7.17rc1\r\nDate: Tue, 10 Dec 2019 21:51:40 GMT\r\nContent-type: application/javascript\r\nContent-Length: 101\r\nLast-Modified: Tue, 10 Dec 2019 21:29:11 GMT\r\n\r\n"}},
+  {"method":"Network.responseReceived","params":{"requestId":"129062.5","loaderId":"B3377B836B5EAB73B5508CDC916800B6","timestamp":11508.021604,"type":"Script","response":{"url":"http://localhost:8000/impl.js","status":200,"statusText":"OK","headers":{"Last-Modified":"Tue, 10 Dec 2019 21:29:11 GMT","Content-Length":"101","Content-type":"application/javascript"},"mimeType":"application/javascript","connectionReused":false,"connectionId":82,"remoteIPAddress":"127.0.0.1","remotePort":8000,"fromDiskCache":false,"fromServiceWorker":false,"fromPrefetchCache":false,"encodedDataLength":202,"timing":{"requestTime":11508.019237,"proxyStart":0.233,"proxyEnd":0.238,"dnsStart":0.272,"dnsEnd":0.284,"connectStart":0.284,"connectEnd":0.614,"sendStart":0.679,"sendEnd":0.765,"pushStart":0,"pushEnd":0,"receiveHeadersEnd":1.567},"protocol":"http/1.0","securityState":"secure"},"frameId":"C0093E205067376DAE5E33F890675B1A"}},
+  {"method":"Network.dataReceived","params":{"requestId":"129062.5","timestamp":11508.022019,"dataLength":101,"encodedDataLength":101}},
+  {"method":"Network.loadingFinished","params":{"requestId":"129062.5","timestamp":11508.021611,"encodedDataLength":303,"shouldReportCorbBlocking":false}}
+]
\ No newline at end of file
diff --git a/lighthouse-core/test/lib/network-recorder-test.js b/lighthouse-core/test/lib/network-recorder-test.js
index 0897df3c9..963f8a5ee 100644
--- a/lighthouse-core/test/lib/network-recorder-test.js
+++ b/lighthouse-core/test/lib/network-recorder-test.js
@@ -9,6 +9,7 @@ const NetworkRecorder = require('../../lib/network-recorder.js');
 const networkRecordsToDevtoolsLog = require('../network-records-to-devtools-log.js');
 const assert = require('assert');
 const devtoolsLogItems = require('../fixtures/artifacts/perflog/defaultPass.devtoolslog.json');
+const prefetchedScriptDevtoolsLog = require('../fixtures/prefetched-script.devtoolslog.json');
 const redirectsDevtoolsLog = require('../fixtures/wikipedia-redirect.devtoolslog.json');
 const redirectsScriptDevtoolsLog = require('../fixtures/redirects-from-script.devtoolslog.json');
 const lrRequestDevtoolsLog = require('../fixtures/lr.devtoolslog.json');
@@ -316,4 +317,327 @@ describe('network recorder', function() {
       assert.deepStrictEqual(periods, []);
     });
   });
+
+  it('should handle prefetch requests', () => {
+    const records = NetworkRecorder.recordsFromLogs(prefetchedScriptDevtoolsLog);
+    expect(records.length).toBe(5);
+
+    const [mainDocument, loaderPrefetch, _ /* favicon */, loaderScript, implScript] = records;
+    expect(mainDocument.initiatorRequest).toBe(undefined);
+    expect(loaderPrefetch.startTime < loaderScript.startTime).toBe(true);
+    expect(loaderPrefetch.resourceType).toBe('Other');
+    expect(loaderPrefetch.initiatorRequest).toBe(mainDocument);
+    expect(loaderScript.resourceType).toBe('Script');
+    expect(loaderScript.initiatorRequest).toBe(mainDocument);
+    expect(implScript.resourceType).toBe('Script');
+    expect(implScript.initiatorRequest).toBe(loaderScript);
+  });
+
+  it('Not set initiators when timings are invalid', () => {
+    // Note that the followings are contrived for testing purposes and are
+    // unlikely to occur in practice.
+    const logs = [
+      { // initiator
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '1',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 107988.912007,
+          'wallTime': 1466620735.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Other',
+        },
+      },
+      { // initiator response
+        'method': 'Network.responseReceived',
+        'params': {
+          'requestId': '1',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'response': {
+            'url': 'https://www.example.com/initiator',
+            'status': '200',
+            'headers': {},
+          },
+          'timestamp': 108088.912007,
+          'wallTime': 1466620835.21187,
+        },
+      },
+      { // initiated
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '2',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiated',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 106988.912007,
+          'wallTime': 1466620635.21187,
+          'initiator': {
+            'type': 'script',
+            'url': 'https://www.example.com/initiator',
+          },
+          'type': 'Other',
+        },
+      },
+    ];
+    const records = NetworkRecorder.recordsFromLogs(logs);
+    expect(records.length).toBe(2);
+
+    const [initiator, initiated] = records;
+    expect(initiator.initiatorRequest).toBe(undefined);
+    expect(initiated.initiatorRequest).toBe(undefined);
+  });
+
+  it(`should allow 'Other' initiators when unambiguous`, () => {
+    // Note that the followings are contrived for testing purposes and are
+    // unlikely to occur in practice. In particular, the initiator's timestamp
+    // is after the initiated's timestamp.
+    const logs = [
+      { // initiator
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '1',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 107988.912007,
+          'wallTime': 1466620735.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Other',
+        },
+      },
+      { // initiated
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '2',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiated',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 108088.912007,
+          'wallTime': 1466620835.21187,
+          'initiator': {
+            'type': 'script',
+            'url': 'https://www.example.com/initiator',
+          },
+          'type': 'Other',
+        },
+      },
+    ];
+    const records = NetworkRecorder.recordsFromLogs(logs);
+    expect(records.length).toBe(2);
+
+    const [initiator, initiated] = records;
+    expect(initiator.initiatorRequest).toBe(undefined);
+    expect(initiated.initiatorRequest).toBe(initiator);
+  });
+
+  it('should give higher precedence to same-frame initiators', () => {
+    // Note that the followings are contrived for testing purposes and are
+    // unlikely to occur in practice. In particular, the initiator's timestamp
+    // is after the initiated's timestamp.
+    const logs = [
+      { // initiator (frame 1)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '1',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 107988.912007,
+          'wallTime': 1466620735.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Script',
+        },
+      },
+      { // initiator (frame 2)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '2',
+          'frameId': '2',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 108088.912007,
+          'wallTime': 1466620835.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Script',
+        },
+      },
+      { // initiated (frame 2)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '3',
+          'frameId': '2',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiated',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 108188.912007,
+          'wallTime': 1466620935.21187,
+          'initiator': {
+            'type': 'script',
+            'url': 'https://www.example.com/initiator',
+          },
+          'type': 'Script',
+        },
+      },
+    ];
+    const records = NetworkRecorder.recordsFromLogs(logs);
+    expect(records.length).toBe(3);
+
+    const [initiator1, initiator2, initiated] = records;
+    expect(initiator1.frameId).toBe('1');
+    expect(initiator1.initiatorRequest).toBe(undefined);
+    expect(initiator2.frameId).toBe('2');
+    expect(initiator2.initiatorRequest).toBe(undefined);
+    expect(initiated.initiatorRequest).toBe(initiator2);
+  });
+
+  it('should give higher precedence to same-frame initiators unless timing is invalid', () => {
+    // Note that the followings are contrived for testing purposes and are
+    // unlikely to occur in practice. In particular, the initiator's timestamp
+    // is after the initiated's timestamp.
+    const logs = [
+      { // initiator (frame 1)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '1',
+          'frameId': '1',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 107988.912007,
+          'wallTime': 1466620735.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Script',
+        },
+      },
+      { // initiator (frame 2)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '2',
+          'frameId': '2',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiator',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 108388.912007,
+          'wallTime': 1466621035.21187,
+          'initiator': {
+            'type': 'other',
+          },
+          'type': 'Script',
+        },
+      },
+      {
+        'method': 'Network.responseReceived',
+        'params': {
+          'requestId': '2',
+          'frameId': '2',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'response': {
+            'url': 'https://www.example.com/initiator',
+            'status': '200',
+            'headers': {},
+          },
+          'timestamp': 108488.912007,
+          'wallTime': 1466621135.21187,
+        },
+      },
+      { // initiated (frame 2)
+        'method': 'Network.requestWillBeSent',
+        'params': {
+          'requestId': '3',
+          'frameId': '2',
+          'loaderId': '1',
+          'documentURL': 'https://www.example.com/home',
+          'request': {
+            'url': 'https://www.example.com/initiated',
+            'method': 'GET',
+            'mixedContentType': 'none',
+            'initialPriority': 'VeryHigh',
+          },
+          'timestamp': 108188.912007,
+          'wallTime': 1466620935.21187,
+          'initiator': {
+            'type': 'script',
+            'url': 'https://www.example.com/initiator',
+          },
+          'type': 'Script',
+        },
+      },
+    ];
+    const records = NetworkRecorder.recordsFromLogs(logs);
+    expect(records.length).toBe(3);
+
+    const [initiator1, initiator2, initiated] = records;
+    expect(initiator1.frameId).toBe('1');
+    expect(initiator1.initiatorRequest).toBe(undefined);
+    expect(initiator2.frameId).toBe('2');
+    expect(initiator2.initiatorRequest).toBe(undefined);
+    expect(initiator2.startTime > initiated.startTime).toBe(true);
+    expect(initiated.initiatorRequest).toBe(initiator1);
+  });
 });