| '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; | 
| }; |