'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var call = require('../internals/function-call'); 
 | 
var IS_PURE = require('../internals/is-pure'); 
 | 
var FunctionName = require('../internals/function-name'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var createIteratorConstructor = require('../internals/iterator-create-constructor'); 
 | 
var getPrototypeOf = require('../internals/object-get-prototype-of'); 
 | 
var setPrototypeOf = require('../internals/object-set-prototype-of'); 
 | 
var setToStringTag = require('../internals/set-to-string-tag'); 
 | 
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); 
 | 
var defineBuiltIn = require('../internals/define-built-in'); 
 | 
var wellKnownSymbol = require('../internals/well-known-symbol'); 
 | 
var Iterators = require('../internals/iterators'); 
 | 
var IteratorsCore = require('../internals/iterators-core'); 
 | 
  
 | 
var PROPER_FUNCTION_NAME = FunctionName.PROPER; 
 | 
var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; 
 | 
var IteratorPrototype = IteratorsCore.IteratorPrototype; 
 | 
var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; 
 | 
var ITERATOR = wellKnownSymbol('iterator'); 
 | 
var KEYS = 'keys'; 
 | 
var VALUES = 'values'; 
 | 
var ENTRIES = 'entries'; 
 | 
  
 | 
var returnThis = function () { return this; }; 
 | 
  
 | 
module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { 
 | 
  createIteratorConstructor(IteratorConstructor, NAME, next); 
 | 
  
 | 
  var getIterationMethod = function (KIND) { 
 | 
    if (KIND === DEFAULT && defaultIterator) return defaultIterator; 
 | 
    if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND]; 
 | 
  
 | 
    switch (KIND) { 
 | 
      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; 
 | 
      case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; 
 | 
      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; 
 | 
    } 
 | 
  
 | 
    return function () { return new IteratorConstructor(this); }; 
 | 
  }; 
 | 
  
 | 
  var TO_STRING_TAG = NAME + ' Iterator'; 
 | 
  var INCORRECT_VALUES_NAME = false; 
 | 
  var IterablePrototype = Iterable.prototype; 
 | 
  var nativeIterator = IterablePrototype[ITERATOR] 
 | 
    || IterablePrototype['@@iterator'] 
 | 
    || DEFAULT && IterablePrototype[DEFAULT]; 
 | 
  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); 
 | 
  var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; 
 | 
  var CurrentIteratorPrototype, methods, KEY; 
 | 
  
 | 
  // fix native 
 | 
  if (anyNativeIterator) { 
 | 
    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); 
 | 
    if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { 
 | 
      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { 
 | 
        if (setPrototypeOf) { 
 | 
          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); 
 | 
        } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { 
 | 
          defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis); 
 | 
        } 
 | 
      } 
 | 
      // Set @@toStringTag to native iterators 
 | 
      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); 
 | 
      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  // fix Array.prototype.{ values, @@iterator }.name in V8 / FF 
 | 
  if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) { 
 | 
    if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { 
 | 
      createNonEnumerableProperty(IterablePrototype, 'name', VALUES); 
 | 
    } else { 
 | 
      INCORRECT_VALUES_NAME = true; 
 | 
      defaultIterator = function values() { return call(nativeIterator, this); }; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  // export additional methods 
 | 
  if (DEFAULT) { 
 | 
    methods = { 
 | 
      values: getIterationMethod(VALUES), 
 | 
      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), 
 | 
      entries: getIterationMethod(ENTRIES) 
 | 
    }; 
 | 
    if (FORCED) for (KEY in methods) { 
 | 
      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { 
 | 
        defineBuiltIn(IterablePrototype, KEY, methods[KEY]); 
 | 
      } 
 | 
    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); 
 | 
  } 
 | 
  
 | 
  // define iterator 
 | 
  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { 
 | 
    defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); 
 | 
  } 
 | 
  Iterators[NAME] = defaultIterator; 
 | 
  
 | 
  return methods; 
 | 
}; 
 |