docs: function() {
        var csr = new tr.ClockSyncRecord('ftrace_importer', 0, {});
        this.model_.clockSyncRecords.push(csr);
        if (this.stackFrameEvents_) {
          this.importStackFrames_(
              this.stackFrameEvents_, 'g', false /* addRootFrame */);
        }
  
        if (this.traceAnnotations_)
          this.importAnnotations_();
  
        var events = this.events_;
        for (var eI = 0; eI < events.length; eI++) {
          var event = events[eI];
          if (event.args === '__stripped__') {
            event.argsStripped = true;
            event.args = undefined;
          }
  
          if (event.ph === 'B' || event.ph === 'E') {
            this.processDurationEvent(event);
  
          } else if (event.ph === 'X') {
            var slice = this.processCompleteEvent(event);
            // TODO(yuhaoz): If Chrome supports creating other events with flow,
            // we will need to call processFlowEvent for them also.
            // https://github.com/catapult-project/catapult/issues/1259
            if (slice !== undefined && event.bind_id !== undefined)
              this.processFlowEvent(event, slice);
  
          } else if (event.ph === 'b' || event.ph === 'e' || event.ph === 'n' ||
                     event.ph === 'S' || event.ph === 'F' || event.ph === 'T' ||
                     event.ph === 'p') {
            this.processAsyncEvent(event);
  
          // Note, I is historic. The instant event marker got changed, but we
          // want to support loading old trace files so we have both I and i.
          } else if (event.ph === 'I' || event.ph === 'i' || event.ph === 'R') {
            this.processInstantEvent(event);
  
          } else if (event.ph === 'P') {
            this.processTraceSampleEvent(event);
  
          } else if (event.ph === 'C') {
            this.processCounterEvent(event);
  
          } else if (event.ph === 'M') {
            this.processMetadataEvent(event);
  
          } else if (event.ph === 'N' || event.ph === 'D' || event.ph === 'O') {
            this.processObjectEvent(event);
  
          } else if (event.ph === 's' || event.ph === 't' || event.ph === 'f') {
            this.processFlowEvent(event);
  
          } else if (event.ph === 'v') {
            this.processMemoryDumpEvent(event);
  
          } else {
            this.model_.importWarning({
              type: 'parse_error',
              message: 'Unrecognized event phase: ' +
                  event.ph + ' (' + event.name + ')'
            });
          }
        }
  
        // Remove all the root stack frame children as they should
        // already be added.
        tr.b.iterItems(this.v8ProcessRootStackFrame_, function(name, frame) {
          frame.removeAllChildren();
        });
      }