docs: function mergeEachQueryParams(controllerQP, routeQP) {
      var keysAlreadyMergedOrSkippable;
      var qps = {};
  
      if (_emberMetalFeatures.default('ember-routing-route-configured-query-params')) {
        keysAlreadyMergedOrSkippable = {};
      } else {
        keysAlreadyMergedOrSkippable = {
          defaultValue: true,
          type: true,
          scope: true,
          as: true
        };
      }
  
      // first loop over all controller qps, merging them with any matching route qps
      // into a new empty object to avoid mutating.
      for (var cqpName in controllerQP) {
        if (!controllerQP.hasOwnProperty(cqpName)) {
          continue;
        }
  
        var newControllerParameterConfiguration = {};
        _emberMetalAssign.default(newControllerParameterConfiguration, controllerQP[cqpName]);
        _emberMetalAssign.default(newControllerParameterConfiguration, routeQP[cqpName]);
  
        qps[cqpName] = newControllerParameterConfiguration;
  
        // allows us to skip this QP when we check route QPs.
        keysAlreadyMergedOrSkippable[cqpName] = true;
      }
  
      // loop over all route qps, skipping those that were merged in the first pass
      // because they also appear in controller qps
      for (var rqpName in routeQP) {
        if (!routeQP.hasOwnProperty(rqpName) || keysAlreadyMergedOrSkippable[rqpName]) {
          continue;
        }
  
        var newRouteParameterConfiguration = {};
        _emberMetalAssign.default(newRouteParameterConfiguration, routeQP[rqpName], controllerQP[rqpName]);
        qps[rqpName] = newRouteParameterConfiguration;
      }
  
      return qps;
    }