diff --git a/.gitignore b/.gitignore
index 525bf36b..bcddf59b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
.DS_Store
node_modules
-dist
example/build
.cache
\ No newline at end of file
diff --git a/dist/ReactGraph.umd.js b/dist/ReactGraph.umd.js
new file mode 100644
index 00000000..4f3d6932
--- /dev/null
+++ b/dist/ReactGraph.umd.js
@@ -0,0 +1,34488 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react'), require('prop-types')) :
+ typeof define === 'function' && define.amd ? define(['react', 'prop-types'], factory) :
+ (global = global || self, global.ReactGraph = factory(global.React, global.PropTypes));
+}(this, function (React, PropTypes$1) { 'use strict';
+
+ var React__default = 'default' in React ? React['default'] : React;
+ PropTypes$1 = PropTypes$1 && PropTypes$1.hasOwnProperty('default') ? PropTypes$1['default'] : PropTypes$1;
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ keys.push.apply(keys, Object.getOwnPropertySymbols(object));
+ }
+
+ if (enumerableOnly) keys = keys.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ return keys;
+ }
+
+ function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(source, true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(source).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+ }
+
+ function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+ }
+
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+
+ return _setPrototypeOf(o, p);
+ }
+
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ }
+
+ return _assertThisInitialized(self);
+ }
+
+ function _taggedTemplateLiteral(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ return Object.freeze(Object.defineProperties(strings, {
+ raw: {
+ value: Object.freeze(raw)
+ }
+ }));
+ }
+
+ function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+ }
+
+ function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+ }
+
+ function _iterableToArrayLimit(arr, i) {
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+ }
+
+ function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+ }
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function unwrapExports (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ var lodash_isequal = createCommonjsModule(function (module, exports) {
+ /**
+ * Lodash (Custom Build)
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright JS Foundation and other contributors
+ * Released under MIT license
+ * Based on Underscore.js 1.8.3
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /** Used to stand-in for `undefined` hash values. */
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+ /** Used to compose bitmasks for value comparisons. */
+ var COMPARE_PARTIAL_FLAG = 1,
+ COMPARE_UNORDERED_FLAG = 2;
+
+ /** Used as references for various `Number` constants. */
+ var MAX_SAFE_INTEGER = 9007199254740991;
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ asyncTag = '[object AsyncFunction]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ nullTag = '[object Null]',
+ objectTag = '[object Object]',
+ promiseTag = '[object Promise]',
+ proxyTag = '[object Proxy]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ symbolTag = '[object Symbol]',
+ undefinedTag = '[object Undefined]',
+ weakMapTag = '[object WeakMap]';
+
+ var arrayBufferTag = '[object ArrayBuffer]',
+ dataViewTag = '[object DataView]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+ /**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
+ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+
+ /** Used to detect host constructors (Safari). */
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+ /** Used to detect unsigned integer values. */
+ var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+ /** Used to identify `toStringTag` values of typed arrays. */
+ var typedArrayTags = {};
+ typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+ typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+ typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+ typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+ typedArrayTags[uint32Tag] = true;
+ typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+ typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+ typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+ typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+ typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+ typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+ typedArrayTags[setTag] = typedArrayTags[stringTag] =
+ typedArrayTags[weakMapTag] = false;
+
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
+
+ /** Detect free variable `self`. */
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+ /** Used as a reference to the global object. */
+ var root = freeGlobal || freeSelf || Function('return this')();
+
+ /** Detect free variable `exports`. */
+ var freeExports = exports && !exports.nodeType && exports;
+
+ /** Detect free variable `module`. */
+ var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
+
+ /** Detect the popular CommonJS extension `module.exports`. */
+ var moduleExports = freeModule && freeModule.exports === freeExports;
+
+ /** Detect free variable `process` from Node.js. */
+ var freeProcess = moduleExports && freeGlobal.process;
+
+ /** Used to access faster Node.js helpers. */
+ var nodeUtil = (function() {
+ try {
+ return freeProcess && freeProcess.binding && freeProcess.binding('util');
+ } catch (e) {}
+ }());
+
+ /* Node.js helper references. */
+ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+
+ /**
+ * A specialized version of `_.filter` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+ function arrayFilter(array, predicate) {
+ var index = -1,
+ length = array == null ? 0 : array.length,
+ resIndex = 0,
+ result = [];
+
+ while (++index < length) {
+ var value = array[index];
+ if (predicate(value, index, array)) {
+ result[resIndex++] = value;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
+
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
+ return array;
+ }
+
+ /**
+ * A specialized version of `_.some` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ */
+ function arraySome(array, predicate) {
+ var index = -1,
+ length = array == null ? 0 : array.length;
+
+ while (++index < length) {
+ if (predicate(array[index], index, array)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+ function baseTimes(n, iteratee) {
+ var index = -1,
+ result = Array(n);
+
+ while (++index < n) {
+ result[index] = iteratee(index);
+ }
+ return result;
+ }
+
+ /**
+ * The base implementation of `_.unary` without support for storing metadata.
+ *
+ * @private
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ */
+ function baseUnary(func) {
+ return function(value) {
+ return func(value);
+ };
+ }
+
+ /**
+ * Checks if a `cache` value for `key` exists.
+ *
+ * @private
+ * @param {Object} cache The cache to query.
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function cacheHas(cache, key) {
+ return cache.has(key);
+ }
+
+ /**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+ function getValue(object, key) {
+ return object == null ? undefined : object[key];
+ }
+
+ /**
+ * Converts `map` to its key-value pairs.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
+ */
+ function mapToArray(map) {
+ var index = -1,
+ result = Array(map.size);
+
+ map.forEach(function(value, key) {
+ result[++index] = [key, value];
+ });
+ return result;
+ }
+
+ /**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+ function overArg(func, transform) {
+ return function(arg) {
+ return func(transform(arg));
+ };
+ }
+
+ /**
+ * Converts `set` to an array of its values.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
+ */
+ function setToArray(set) {
+ var index = -1,
+ result = Array(set.size);
+
+ set.forEach(function(value) {
+ result[++index] = value;
+ });
+ return result;
+ }
+
+ /** Used for built-in method references. */
+ var arrayProto = Array.prototype,
+ funcProto = Function.prototype,
+ objectProto = Object.prototype;
+
+ /** Used to detect overreaching core-js shims. */
+ var coreJsData = root['__core-js_shared__'];
+
+ /** Used to resolve the decompiled source of functions. */
+ var funcToString = funcProto.toString;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto.hasOwnProperty;
+
+ /** Used to detect methods masquerading as native. */
+ var maskSrcKey = (function() {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+ return uid ? ('Symbol(src)_1.' + uid) : '';
+ }());
+
+ /**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var nativeObjectToString = objectProto.toString;
+
+ /** Used to detect if a method is native. */
+ var reIsNative = RegExp('^' +
+ funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+ );
+
+ /** Built-in value references. */
+ var Buffer = moduleExports ? root.Buffer : undefined,
+ Symbol = root.Symbol,
+ Uint8Array = root.Uint8Array,
+ propertyIsEnumerable = objectProto.propertyIsEnumerable,
+ splice = arrayProto.splice,
+ symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+ var nativeGetSymbols = Object.getOwnPropertySymbols,
+ nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
+ nativeKeys = overArg(Object.keys, Object);
+
+ /* Built-in method references that are verified to be native. */
+ var DataView = getNative(root, 'DataView'),
+ Map = getNative(root, 'Map'),
+ Promise = getNative(root, 'Promise'),
+ Set = getNative(root, 'Set'),
+ WeakMap = getNative(root, 'WeakMap'),
+ nativeCreate = getNative(Object, 'create');
+
+ /** Used to detect maps, sets, and weakmaps. */
+ var dataViewCtorString = toSource(DataView),
+ mapCtorString = toSource(Map),
+ promiseCtorString = toSource(Promise),
+ setCtorString = toSource(Set),
+ weakMapCtorString = toSource(WeakMap);
+
+ /** Used to convert symbols to primitives and strings. */
+ var symbolProto = Symbol ? Symbol.prototype : undefined,
+ symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
+ /**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+ function Hash(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+
+ /**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+ function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
+ this.size = 0;
+ }
+
+ /**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function hashDelete(key) {
+ var result = this.has(key) && delete this.__data__[key];
+ this.size -= result ? 1 : 0;
+ return result;
+ }
+
+ /**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function hashGet(key) {
+ var data = this.__data__;
+ if (nativeCreate) {
+ var result = data[key];
+ return result === HASH_UNDEFINED ? undefined : result;
+ }
+ return hasOwnProperty.call(data, key) ? data[key] : undefined;
+ }
+
+ /**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
+ }
+
+ /**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+ function hashSet(key, value) {
+ var data = this.__data__;
+ this.size += this.has(key) ? 0 : 1;
+ data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+ return this;
+ }
+
+ // Add methods to `Hash`.
+ Hash.prototype.clear = hashClear;
+ Hash.prototype['delete'] = hashDelete;
+ Hash.prototype.get = hashGet;
+ Hash.prototype.has = hashHas;
+ Hash.prototype.set = hashSet;
+
+ /**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+ function ListCache(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+
+ /**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+ function listCacheClear() {
+ this.__data__ = [];
+ this.size = 0;
+ }
+
+ /**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function listCacheDelete(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ return false;
+ }
+ var lastIndex = data.length - 1;
+ if (index == lastIndex) {
+ data.pop();
+ } else {
+ splice.call(data, index, 1);
+ }
+ --this.size;
+ return true;
+ }
+
+ /**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function listCacheGet(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ return index < 0 ? undefined : data[index][1];
+ }
+
+ /**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
+ }
+
+ /**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+ function listCacheSet(key, value) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ ++this.size;
+ data.push([key, value]);
+ } else {
+ data[index][1] = value;
+ }
+ return this;
+ }
+
+ // Add methods to `ListCache`.
+ ListCache.prototype.clear = listCacheClear;
+ ListCache.prototype['delete'] = listCacheDelete;
+ ListCache.prototype.get = listCacheGet;
+ ListCache.prototype.has = listCacheHas;
+ ListCache.prototype.set = listCacheSet;
+
+ /**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+ function MapCache(entries) {
+ var index = -1,
+ length = entries == null ? 0 : entries.length;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+ }
+
+ /**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+ function mapCacheClear() {
+ this.size = 0;
+ this.__data__ = {
+ 'hash': new Hash,
+ 'map': new (Map || ListCache),
+ 'string': new Hash
+ };
+ }
+
+ /**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function mapCacheDelete(key) {
+ var result = getMapData(this, key)['delete'](key);
+ this.size -= result ? 1 : 0;
+ return result;
+ }
+
+ /**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+ }
+
+ /**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+ }
+
+ /**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+ function mapCacheSet(key, value) {
+ var data = getMapData(this, key),
+ size = data.size;
+
+ data.set(key, value);
+ this.size += data.size == size ? 0 : 1;
+ return this;
+ }
+
+ // Add methods to `MapCache`.
+ MapCache.prototype.clear = mapCacheClear;
+ MapCache.prototype['delete'] = mapCacheDelete;
+ MapCache.prototype.get = mapCacheGet;
+ MapCache.prototype.has = mapCacheHas;
+ MapCache.prototype.set = mapCacheSet;
+
+ /**
+ *
+ * Creates an array cache object to store unique values.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [values] The values to cache.
+ */
+ function SetCache(values) {
+ var index = -1,
+ length = values == null ? 0 : values.length;
+
+ this.__data__ = new MapCache;
+ while (++index < length) {
+ this.add(values[index]);
+ }
+ }
+
+ /**
+ * Adds `value` to the array cache.
+ *
+ * @private
+ * @name add
+ * @memberOf SetCache
+ * @alias push
+ * @param {*} value The value to cache.
+ * @returns {Object} Returns the cache instance.
+ */
+ function setCacheAdd(value) {
+ this.__data__.set(value, HASH_UNDEFINED);
+ return this;
+ }
+
+ /**
+ * Checks if `value` is in the array cache.
+ *
+ * @private
+ * @name has
+ * @memberOf SetCache
+ * @param {*} value The value to search for.
+ * @returns {number} Returns `true` if `value` is found, else `false`.
+ */
+ function setCacheHas(value) {
+ return this.__data__.has(value);
+ }
+
+ // Add methods to `SetCache`.
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+ SetCache.prototype.has = setCacheHas;
+
+ /**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+ function Stack(entries) {
+ var data = this.__data__ = new ListCache(entries);
+ this.size = data.size;
+ }
+
+ /**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+ function stackClear() {
+ this.__data__ = new ListCache;
+ this.size = 0;
+ }
+
+ /**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function stackDelete(key) {
+ var data = this.__data__,
+ result = data['delete'](key);
+
+ this.size = data.size;
+ return result;
+ }
+
+ /**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function stackGet(key) {
+ return this.__data__.get(key);
+ }
+
+ /**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function stackHas(key) {
+ return this.__data__.has(key);
+ }
+
+ /**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
+ function stackSet(key, value) {
+ var data = this.__data__;
+ if (data instanceof ListCache) {
+ var pairs = data.__data__;
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+ pairs.push([key, value]);
+ this.size = ++data.size;
+ return this;
+ }
+ data = this.__data__ = new MapCache(pairs);
+ }
+ data.set(key, value);
+ this.size = data.size;
+ return this;
+ }
+
+ // Add methods to `Stack`.
+ Stack.prototype.clear = stackClear;
+ Stack.prototype['delete'] = stackDelete;
+ Stack.prototype.get = stackGet;
+ Stack.prototype.has = stackHas;
+ Stack.prototype.set = stackSet;
+
+ /**
+ * Creates an array of the enumerable property names of the array-like `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @param {boolean} inherited Specify returning inherited property names.
+ * @returns {Array} Returns the array of property names.
+ */
+ function arrayLikeKeys(value, inherited) {
+ var isArr = isArray(value),
+ isArg = !isArr && isArguments(value),
+ isBuff = !isArr && !isArg && isBuffer(value),
+ isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+ skipIndexes = isArr || isArg || isBuff || isType,
+ result = skipIndexes ? baseTimes(value.length, String) : [],
+ length = result.length;
+
+ for (var key in value) {
+ if ((inherited || hasOwnProperty.call(value, key)) &&
+ !(skipIndexes && (
+ // Safari 9 has enumerable `arguments.length` in strict mode.
+ key == 'length' ||
+ // Node.js 0.10 has enumerable non-index properties on buffers.
+ (isBuff && (key == 'offset' || key == 'parent')) ||
+ // PhantomJS 2 has enumerable non-index properties on typed arrays.
+ (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
+ // Skip index properties.
+ isIndex(key, length)
+ ))) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function assocIndexOf(array, key) {
+ var length = array.length;
+ while (length--) {
+ if (eq(array[length][0], key)) {
+ return length;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+ function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result = keysFunc(object);
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+ }
+
+ /**
+ * The base implementation of `getTag` without fallbacks for buggy environments.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+ function baseGetTag(value) {
+ if (value == null) {
+ return value === undefined ? undefinedTag : nullTag;
+ }
+ return (symToStringTag && symToStringTag in Object(value))
+ ? getRawTag(value)
+ : objectToString(value);
+ }
+
+ /**
+ * The base implementation of `_.isArguments`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ */
+ function baseIsArguments(value) {
+ return isObjectLike(value) && baseGetTag(value) == argsTag;
+ }
+
+ /**
+ * The base implementation of `_.isEqual` which supports partial comparisons
+ * and tracks traversed objects.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {boolean} bitmask The bitmask flags.
+ * 1 - Unordered comparison
+ * 2 - Partial comparison
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ */
+ function baseIsEqual(value, other, bitmask, customizer, stack) {
+ if (value === other) {
+ return true;
+ }
+ if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
+ return value !== value && other !== other;
+ }
+ return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+ }
+
+ /**
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
+ * deep comparisons and tracks traversed objects enabling objects with circular
+ * references to be compared.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+ var objIsArr = isArray(object),
+ othIsArr = isArray(other),
+ objTag = objIsArr ? arrayTag : getTag(object),
+ othTag = othIsArr ? arrayTag : getTag(other);
+
+ objTag = objTag == argsTag ? objectTag : objTag;
+ othTag = othTag == argsTag ? objectTag : othTag;
+
+ var objIsObj = objTag == objectTag,
+ othIsObj = othTag == objectTag,
+ isSameTag = objTag == othTag;
+
+ if (isSameTag && isBuffer(object)) {
+ if (!isBuffer(other)) {
+ return false;
+ }
+ objIsArr = true;
+ objIsObj = false;
+ }
+ if (isSameTag && !objIsObj) {
+ stack || (stack = new Stack);
+ return (objIsArr || isTypedArray(object))
+ ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
+ : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+ }
+ if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+ var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+ if (objIsWrapped || othIsWrapped) {
+ var objUnwrapped = objIsWrapped ? object.value() : object,
+ othUnwrapped = othIsWrapped ? other.value() : other;
+
+ stack || (stack = new Stack);
+ return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+ }
+ }
+ if (!isSameTag) {
+ return false;
+ }
+ stack || (stack = new Stack);
+ return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+ }
+
+ /**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ */
+ function baseIsNative(value) {
+ if (!isObject(value) || isMasked(value)) {
+ return false;
+ }
+ var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+ return pattern.test(toSource(value));
+ }
+
+ /**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+ function baseIsTypedArray(value) {
+ return isObjectLike(value) &&
+ isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+ }
+
+ /**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+ function baseKeys(object) {
+ if (!isPrototype(object)) {
+ return nativeKeys(object);
+ }
+ var result = [];
+ for (var key in Object(object)) {
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
+ result.push(key);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Array} array The array to compare.
+ * @param {Array} other The other array to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `array` and `other` objects.
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+ */
+ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+ arrLength = array.length,
+ othLength = other.length;
+
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+ return false;
+ }
+ // Assume cyclic values are equal.
+ var stacked = stack.get(array);
+ if (stacked && stack.get(other)) {
+ return stacked == other;
+ }
+ var index = -1,
+ result = true,
+ seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
+
+ stack.set(array, other);
+ stack.set(other, array);
+
+ // Ignore non-index properties.
+ while (++index < arrLength) {
+ var arrValue = array[index],
+ othValue = other[index];
+
+ if (customizer) {
+ var compared = isPartial
+ ? customizer(othValue, arrValue, index, other, array, stack)
+ : customizer(arrValue, othValue, index, array, other, stack);
+ }
+ if (compared !== undefined) {
+ if (compared) {
+ continue;
+ }
+ result = false;
+ break;
+ }
+ // Recursively compare arrays (susceptible to call stack limits).
+ if (seen) {
+ if (!arraySome(other, function(othValue, othIndex) {
+ if (!cacheHas(seen, othIndex) &&
+ (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+ return seen.push(othIndex);
+ }
+ })) {
+ result = false;
+ break;
+ }
+ } else if (!(
+ arrValue === othValue ||
+ equalFunc(arrValue, othValue, bitmask, customizer, stack)
+ )) {
+ result = false;
+ break;
+ }
+ }
+ stack['delete'](array);
+ stack['delete'](other);
+ return result;
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
+ * the same `toStringTag`.
+ *
+ * **Note:** This function only supports comparing values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {string} tag The `toStringTag` of the objects to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+ switch (tag) {
+ case dataViewTag:
+ if ((object.byteLength != other.byteLength) ||
+ (object.byteOffset != other.byteOffset)) {
+ return false;
+ }
+ object = object.buffer;
+ other = other.buffer;
+
+ case arrayBufferTag:
+ if ((object.byteLength != other.byteLength) ||
+ !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+ return false;
+ }
+ return true;
+
+ case boolTag:
+ case dateTag:
+ case numberTag:
+ // Coerce booleans to `1` or `0` and dates to milliseconds.
+ // Invalid dates are coerced to `NaN`.
+ return eq(+object, +other);
+
+ case errorTag:
+ return object.name == other.name && object.message == other.message;
+
+ case regexpTag:
+ case stringTag:
+ // Coerce regexes to strings and treat strings, primitives and objects,
+ // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+ // for more details.
+ return object == (other + '');
+
+ case mapTag:
+ var convert = mapToArray;
+
+ case setTag:
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+ convert || (convert = setToArray);
+
+ if (object.size != other.size && !isPartial) {
+ return false;
+ }
+ // Assume cyclic values are equal.
+ var stacked = stack.get(object);
+ if (stacked) {
+ return stacked == other;
+ }
+ bitmask |= COMPARE_UNORDERED_FLAG;
+
+ // Recursively compare objects (susceptible to call stack limits).
+ stack.set(object, other);
+ var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+ stack['delete'](object);
+ return result;
+
+ case symbolTag:
+ if (symbolValueOf) {
+ return symbolValueOf.call(object) == symbolValueOf.call(other);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * A specialized version of `baseIsEqualDeep` for objects with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+ var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+ objProps = getAllKeys(object),
+ objLength = objProps.length,
+ othProps = getAllKeys(other),
+ othLength = othProps.length;
+
+ if (objLength != othLength && !isPartial) {
+ return false;
+ }
+ var index = objLength;
+ while (index--) {
+ var key = objProps[index];
+ if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+ return false;
+ }
+ }
+ // Assume cyclic values are equal.
+ var stacked = stack.get(object);
+ if (stacked && stack.get(other)) {
+ return stacked == other;
+ }
+ var result = true;
+ stack.set(object, other);
+ stack.set(other, object);
+
+ var skipCtor = isPartial;
+ while (++index < objLength) {
+ key = objProps[index];
+ var objValue = object[key],
+ othValue = other[key];
+
+ if (customizer) {
+ var compared = isPartial
+ ? customizer(othValue, objValue, key, other, object, stack)
+ : customizer(objValue, othValue, key, object, other, stack);
+ }
+ // Recursively compare objects (susceptible to call stack limits).
+ if (!(compared === undefined
+ ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
+ : compared
+ )) {
+ result = false;
+ break;
+ }
+ skipCtor || (skipCtor = key == 'constructor');
+ }
+ if (result && !skipCtor) {
+ var objCtor = object.constructor,
+ othCtor = other.constructor;
+
+ // Non `Object` object instances with different constructors are not equal.
+ if (objCtor != othCtor &&
+ ('constructor' in object && 'constructor' in other) &&
+ !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
+ typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+ result = false;
+ }
+ }
+ stack['delete'](object);
+ stack['delete'](other);
+ return result;
+ }
+
+ /**
+ * Creates an array of own enumerable property names and symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+ function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+ }
+
+ /**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+ function getMapData(map, key) {
+ var data = map.__data__;
+ return isKeyable(key)
+ ? data[typeof key == 'string' ? 'string' : 'hash']
+ : data.map;
+ }
+
+ /**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+ function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : undefined;
+ }
+
+ /**
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the raw `toStringTag`.
+ */
+ function getRawTag(value) {
+ var isOwn = hasOwnProperty.call(value, symToStringTag),
+ tag = value[symToStringTag];
+
+ try {
+ value[symToStringTag] = undefined;
+ var unmasked = true;
+ } catch (e) {}
+
+ var result = nativeObjectToString.call(value);
+ if (unmasked) {
+ if (isOwn) {
+ value[symToStringTag] = tag;
+ } else {
+ delete value[symToStringTag];
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Creates an array of the own enumerable symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+ var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+ if (object == null) {
+ return [];
+ }
+ object = Object(object);
+ return arrayFilter(nativeGetSymbols(object), function(symbol) {
+ return propertyIsEnumerable.call(object, symbol);
+ });
+ };
+
+ /**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+ var getTag = baseGetTag;
+
+ // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+ (Map && getTag(new Map) != mapTag) ||
+ (Promise && getTag(Promise.resolve()) != promiseTag) ||
+ (Set && getTag(new Set) != setTag) ||
+ (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+ getTag = function(value) {
+ var result = baseGetTag(value),
+ Ctor = result == objectTag ? value.constructor : undefined,
+ ctorString = Ctor ? toSource(Ctor) : '';
+
+ if (ctorString) {
+ switch (ctorString) {
+ case dataViewCtorString: return dataViewTag;
+ case mapCtorString: return mapTag;
+ case promiseCtorString: return promiseTag;
+ case setCtorString: return setTag;
+ case weakMapCtorString: return weakMapTag;
+ }
+ }
+ return result;
+ };
+ }
+
+ /**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+ function isIndex(value, length) {
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return !!length &&
+ (typeof value == 'number' || reIsUint.test(value)) &&
+ (value > -1 && value % 1 == 0 && value < length);
+ }
+
+ /**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+ function isKeyable(value) {
+ var type = typeof value;
+ return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+ ? (value !== '__proto__')
+ : (value === null);
+ }
+
+ /**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
+ function isMasked(func) {
+ return !!maskSrcKey && (maskSrcKey in func);
+ }
+
+ /**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
+ function isPrototype(value) {
+ var Ctor = value && value.constructor,
+ proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+
+ return value === proto;
+ }
+
+ /**
+ * Converts `value` to a string using `Object.prototype.toString`.
+ *
+ * @private
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ */
+ function objectToString(value) {
+ return nativeObjectToString.call(value);
+ }
+
+ /**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to convert.
+ * @returns {string} Returns the source code.
+ */
+ function toSource(func) {
+ if (func != null) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {}
+ try {
+ return (func + '');
+ } catch (e) {}
+ }
+ return '';
+ }
+
+ /**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+ function eq(value, other) {
+ return value === other || (value !== value && other !== other);
+ }
+
+ /**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
+ return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
+ !propertyIsEnumerable.call(value, 'callee');
+ };
+
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+ var isArray = Array.isArray;
+
+ /**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+ function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+ }
+
+ /**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
+ var isBuffer = nativeIsBuffer || stubFalse;
+
+ /**
+ * Performs a deep comparison between two values to determine if they are
+ * equivalent.
+ *
+ * **Note:** This method supports comparing arrays, array buffers, booleans,
+ * date objects, error objects, maps, numbers, `Object` objects, regexes,
+ * sets, strings, symbols, and typed arrays. `Object` objects are compared
+ * by their own, not inherited, enumerable properties. Functions and DOM
+ * nodes are compared by strict equality, i.e. `===`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.isEqual(object, other);
+ * // => true
+ *
+ * object === other;
+ * // => false
+ */
+ function isEqual(value, other) {
+ return baseIsEqual(value, other);
+ }
+
+ /**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+ function isFunction(value) {
+ if (!isObject(value)) {
+ return false;
+ }
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 9 which returns 'object' for typed arrays and other constructors.
+ var tag = baseGetTag(value);
+ return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+ }
+
+ /**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+ function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
+
+ /**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+ function isObject(value) {
+ var type = typeof value;
+ return value != null && (type == 'object' || type == 'function');
+ }
+
+ /**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+ function isObjectLike(value) {
+ return value != null && typeof value == 'object';
+ }
+
+ /**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+
+ /**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+ function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+ }
+
+ /**
+ * This method returns a new empty array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {Array} Returns the new empty array.
+ * @example
+ *
+ * var arrays = _.times(2, _.stubArray);
+ *
+ * console.log(arrays);
+ * // => [[], []]
+ *
+ * console.log(arrays[0] === arrays[1]);
+ * // => false
+ */
+ function stubArray() {
+ return [];
+ }
+
+ /**
+ * This method returns `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {boolean} Returns `false`.
+ * @example
+ *
+ * _.times(2, _.stubFalse);
+ * // => [false, false]
+ */
+ function stubFalse() {
+ return false;
+ }
+
+ module.exports = isEqual;
+ });
+
+ var _extends_1 = createCommonjsModule(function (module) {
+ function _extends() {
+ module.exports = _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+ }
+
+ module.exports = _extends;
+ });
+
+ function memoize(fn) {
+ var cache = {};
+ return function (arg) {
+ if (cache[arg] === undefined) cache[arg] = fn(arg);
+ return cache[arg];
+ };
+ }
+
+ var reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|itemProp|itemScope|itemType|itemID|itemRef|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23
+
+ var index = memoize(function (prop) {
+ return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111
+ /* o */
+ && prop.charCodeAt(1) === 110
+ /* n */
+ && prop.charCodeAt(2) < 91;
+ }
+ /* Z+1 */
+ );
+
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+ subClass.__proto__ = superClass;
+ }
+
+ var inheritsLoose = _inheritsLoose;
+
+ /*
+
+ Based off glamor's StyleSheet, thanks Sunil ❤️
+
+ high performance StyleSheet for css-in-js systems
+
+ - uses multiple style tags behind the scenes for millions of rules
+ - uses `insertRule` for appending in production for *much* faster performance
+
+ // usage
+
+ import { StyleSheet } from '@emotion/sheet'
+
+ let styleSheet = new StyleSheet({ key: '', container: document.head })
+
+ styleSheet.insert('#box { border: 1px solid red; }')
+ - appends a css rule into the stylesheet
+
+ styleSheet.flush()
+ - empties the stylesheet of all its contents
+
+ */
+ // $FlowFixMe
+ function sheetForTag(tag) {
+ if (tag.sheet) {
+ // $FlowFixMe
+ return tag.sheet;
+ } // this weirdness brought to you by firefox
+
+ /* istanbul ignore next */
+
+
+ for (var i = 0; i < document.styleSheets.length; i++) {
+ if (document.styleSheets[i].ownerNode === tag) {
+ // $FlowFixMe
+ return document.styleSheets[i];
+ }
+ }
+ }
+
+ function createStyleElement(options) {
+ var tag = document.createElement('style');
+ tag.setAttribute('data-emotion', options.key);
+
+ if (options.nonce !== undefined) {
+ tag.setAttribute('nonce', options.nonce);
+ }
+
+ tag.appendChild(document.createTextNode(''));
+ return tag;
+ }
+
+ var StyleSheet =
+ /*#__PURE__*/
+ function () {
+ function StyleSheet(options) {
+ this.isSpeedy = options.speedy === undefined ? process.env.NODE_ENV === 'production' : options.speedy;
+ this.tags = [];
+ this.ctr = 0;
+ this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets
+
+ this.key = options.key;
+ this.container = options.container;
+ this.before = null;
+ }
+
+ var _proto = StyleSheet.prototype;
+
+ _proto.insert = function insert(rule) {
+ // the max length is how many rules we have per style tag, it's 65000 in speedy mode
+ // it's 1 in dev because we insert source maps that map a single rule to a location
+ // and you can only have one source map per style tag
+ if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {
+ var _tag = createStyleElement(this);
+
+ var before;
+
+ if (this.tags.length === 0) {
+ before = this.before;
+ } else {
+ before = this.tags[this.tags.length - 1].nextSibling;
+ }
+
+ this.container.insertBefore(_tag, before);
+ this.tags.push(_tag);
+ }
+
+ var tag = this.tags[this.tags.length - 1];
+
+ if (this.isSpeedy) {
+ var sheet = sheetForTag(tag);
+
+ try {
+ // this is a really hot path
+ // we check the second character first because having "i"
+ // as the second character will happen less often than
+ // having "@" as the first character
+ var isImportRule = rule.charCodeAt(1) === 105 && rule.charCodeAt(0) === 64; // this is the ultrafast version, works across browsers
+ // the big drawback is that the css won't be editable in devtools
+
+ sheet.insertRule(rule, // we need to insert @import rules before anything else
+ // otherwise there will be an error
+ // technically this means that the @import rules will
+ // _usually_(not always since there could be multiple style tags)
+ // be the first ones in prod and generally later in dev
+ // this shouldn't really matter in the real world though
+ // @import is generally only used for font faces from google fonts and etc.
+ // so while this could be technically correct then it would be slower and larger
+ // for a tiny bit of correctness that won't matter in the real world
+ isImportRule ? 0 : sheet.cssRules.length);
+ } catch (e) {
+ if (process.env.NODE_ENV !== 'production') {
+ console.warn("There was a problem inserting the following rule: \"" + rule + "\"", e);
+ }
+ }
+ } else {
+ tag.appendChild(document.createTextNode(rule));
+ }
+
+ this.ctr++;
+ };
+
+ _proto.flush = function flush() {
+ // $FlowFixMe
+ this.tags.forEach(function (tag) {
+ return tag.parentNode.removeChild(tag);
+ });
+ this.tags = [];
+ this.ctr = 0;
+ };
+
+ return StyleSheet;
+ }();
+
+ function stylis_min (W) {
+ function M(d, c, e, h, a) {
+ for (var m = 0, b = 0, v = 0, n = 0, q, g, x = 0, K = 0, k, u = k = q = 0, l = 0, r = 0, I = 0, t = 0, B = e.length, J = B - 1, y, f = '', p = '', F = '', G = '', C; l < B;) {
+ g = e.charCodeAt(l);
+ l === J && 0 !== b + n + v + m && (0 !== b && (g = 47 === b ? 10 : 47), n = v = m = 0, B++, J++);
+
+ if (0 === b + n + v + m) {
+ if (l === J && (0 < r && (f = f.replace(N, '')), 0 < f.trim().length)) {
+ switch (g) {
+ case 32:
+ case 9:
+ case 59:
+ case 13:
+ case 10:
+ break;
+
+ default:
+ f += e.charAt(l);
+ }
+
+ g = 59;
+ }
+
+ switch (g) {
+ case 123:
+ f = f.trim();
+ q = f.charCodeAt(0);
+ k = 1;
+
+ for (t = ++l; l < B;) {
+ switch (g = e.charCodeAt(l)) {
+ case 123:
+ k++;
+ break;
+
+ case 125:
+ k--;
+ break;
+
+ case 47:
+ switch (g = e.charCodeAt(l + 1)) {
+ case 42:
+ case 47:
+ a: {
+ for (u = l + 1; u < J; ++u) {
+ switch (e.charCodeAt(u)) {
+ case 47:
+ if (42 === g && 42 === e.charCodeAt(u - 1) && l + 2 !== u) {
+ l = u + 1;
+ break a;
+ }
+
+ break;
+
+ case 10:
+ if (47 === g) {
+ l = u + 1;
+ break a;
+ }
+
+ }
+ }
+
+ l = u;
+ }
+
+ }
+
+ break;
+
+ case 91:
+ g++;
+
+ case 40:
+ g++;
+
+ case 34:
+ case 39:
+ for (; l++ < J && e.charCodeAt(l) !== g;) {
+ }
+
+ }
+
+ if (0 === k) break;
+ l++;
+ }
+
+ k = e.substring(t, l);
+ 0 === q && (q = (f = f.replace(ca, '').trim()).charCodeAt(0));
+
+ switch (q) {
+ case 64:
+ 0 < r && (f = f.replace(N, ''));
+ g = f.charCodeAt(1);
+
+ switch (g) {
+ case 100:
+ case 109:
+ case 115:
+ case 45:
+ r = c;
+ break;
+
+ default:
+ r = O;
+ }
+
+ k = M(c, r, k, g, a + 1);
+ t = k.length;
+ 0 < A && (r = X(O, f, I), C = H(3, k, r, c, D, z, t, g, a, h), f = r.join(''), void 0 !== C && 0 === (t = (k = C.trim()).length) && (g = 0, k = ''));
+ if (0 < t) switch (g) {
+ case 115:
+ f = f.replace(da, ea);
+
+ case 100:
+ case 109:
+ case 45:
+ k = f + '{' + k + '}';
+ break;
+
+ case 107:
+ f = f.replace(fa, '$1 $2');
+ k = f + '{' + k + '}';
+ k = 1 === w || 2 === w && L('@' + k, 3) ? '@-webkit-' + k + '@' + k : '@' + k;
+ break;
+
+ default:
+ k = f + k, 112 === h && (k = (p += k, ''));
+ } else k = '';
+ break;
+
+ default:
+ k = M(c, X(c, f, I), k, h, a + 1);
+ }
+
+ F += k;
+ k = I = r = u = q = 0;
+ f = '';
+ g = e.charCodeAt(++l);
+ break;
+
+ case 125:
+ case 59:
+ f = (0 < r ? f.replace(N, '') : f).trim();
+ if (1 < (t = f.length)) switch (0 === u && (q = f.charCodeAt(0), 45 === q || 96 < q && 123 > q) && (t = (f = f.replace(' ', ':')).length), 0 < A && void 0 !== (C = H(1, f, c, d, D, z, p.length, h, a, h)) && 0 === (t = (f = C.trim()).length) && (f = '\x00\x00'), q = f.charCodeAt(0), g = f.charCodeAt(1), q) {
+ case 0:
+ break;
+
+ case 64:
+ if (105 === g || 99 === g) {
+ G += f + e.charAt(l);
+ break;
+ }
+
+ default:
+ 58 !== f.charCodeAt(t - 1) && (p += P(f, q, g, f.charCodeAt(2)));
+ }
+ I = r = u = q = 0;
+ f = '';
+ g = e.charCodeAt(++l);
+ }
+ }
+
+ switch (g) {
+ case 13:
+ case 10:
+ 47 === b ? b = 0 : 0 === 1 + q && 107 !== h && 0 < f.length && (r = 1, f += '\x00');
+ 0 < A * Y && H(0, f, c, d, D, z, p.length, h, a, h);
+ z = 1;
+ D++;
+ break;
+
+ case 59:
+ case 125:
+ if (0 === b + n + v + m) {
+ z++;
+ break;
+ }
+
+ default:
+ z++;
+ y = e.charAt(l);
+
+ switch (g) {
+ case 9:
+ case 32:
+ if (0 === n + m + b) switch (x) {
+ case 44:
+ case 58:
+ case 9:
+ case 32:
+ y = '';
+ break;
+
+ default:
+ 32 !== g && (y = ' ');
+ }
+ break;
+
+ case 0:
+ y = '\\0';
+ break;
+
+ case 12:
+ y = '\\f';
+ break;
+
+ case 11:
+ y = '\\v';
+ break;
+
+ case 38:
+ 0 === n + b + m && (r = I = 1, y = '\f' + y);
+ break;
+
+ case 108:
+ if (0 === n + b + m + E && 0 < u) switch (l - u) {
+ case 2:
+ 112 === x && 58 === e.charCodeAt(l - 3) && (E = x);
+
+ case 8:
+ 111 === K && (E = K);
+ }
+ break;
+
+ case 58:
+ 0 === n + b + m && (u = l);
+ break;
+
+ case 44:
+ 0 === b + v + n + m && (r = 1, y += '\r');
+ break;
+
+ case 34:
+ case 39:
+ 0 === b && (n = n === g ? 0 : 0 === n ? g : n);
+ break;
+
+ case 91:
+ 0 === n + b + v && m++;
+ break;
+
+ case 93:
+ 0 === n + b + v && m--;
+ break;
+
+ case 41:
+ 0 === n + b + m && v--;
+ break;
+
+ case 40:
+ if (0 === n + b + m) {
+ if (0 === q) switch (2 * x + 3 * K) {
+ case 533:
+ break;
+
+ default:
+ q = 1;
+ }
+ v++;
+ }
+
+ break;
+
+ case 64:
+ 0 === b + v + n + m + u + k && (k = 1);
+ break;
+
+ case 42:
+ case 47:
+ if (!(0 < n + m + v)) switch (b) {
+ case 0:
+ switch (2 * g + 3 * e.charCodeAt(l + 1)) {
+ case 235:
+ b = 47;
+ break;
+
+ case 220:
+ t = l, b = 42;
+ }
+
+ break;
+
+ case 42:
+ 47 === g && 42 === x && t + 2 !== l && (33 === e.charCodeAt(t + 2) && (p += e.substring(t, l + 1)), y = '', b = 0);
+ }
+ }
+
+ 0 === b && (f += y);
+ }
+
+ K = x;
+ x = g;
+ l++;
+ }
+
+ t = p.length;
+
+ if (0 < t) {
+ r = c;
+ if (0 < A && (C = H(2, p, r, d, D, z, t, h, a, h), void 0 !== C && 0 === (p = C).length)) return G + p + F;
+ p = r.join(',') + '{' + p + '}';
+
+ if (0 !== w * E) {
+ 2 !== w || L(p, 2) || (E = 0);
+
+ switch (E) {
+ case 111:
+ p = p.replace(ha, ':-moz-$1') + p;
+ break;
+
+ case 112:
+ p = p.replace(Q, '::-webkit-input-$1') + p.replace(Q, '::-moz-$1') + p.replace(Q, ':-ms-input-$1') + p;
+ }
+
+ E = 0;
+ }
+ }
+
+ return G + p + F;
+ }
+
+ function X(d, c, e) {
+ var h = c.trim().split(ia);
+ c = h;
+ var a = h.length,
+ m = d.length;
+
+ switch (m) {
+ case 0:
+ case 1:
+ var b = 0;
+
+ for (d = 0 === m ? '' : d[0] + ' '; b < a; ++b) {
+ c[b] = Z(d, c[b], e).trim();
+ }
+
+ break;
+
+ default:
+ var v = b = 0;
+
+ for (c = []; b < a; ++b) {
+ for (var n = 0; n < m; ++n) {
+ c[v++] = Z(d[n] + ' ', h[b], e).trim();
+ }
+ }
+
+ }
+
+ return c;
+ }
+
+ function Z(d, c, e) {
+ var h = c.charCodeAt(0);
+ 33 > h && (h = (c = c.trim()).charCodeAt(0));
+
+ switch (h) {
+ case 38:
+ return c.replace(F, '$1' + d.trim());
+
+ case 58:
+ return d.trim() + c.replace(F, '$1' + d.trim());
+
+ default:
+ if (0 < 1 * e && 0 < c.indexOf('\f')) return c.replace(F, (58 === d.charCodeAt(0) ? '' : '$1') + d.trim());
+ }
+
+ return d + c;
+ }
+
+ function P(d, c, e, h) {
+ var a = d + ';',
+ m = 2 * c + 3 * e + 4 * h;
+
+ if (944 === m) {
+ d = a.indexOf(':', 9) + 1;
+ var b = a.substring(d, a.length - 1).trim();
+ b = a.substring(0, d).trim() + b + ';';
+ return 1 === w || 2 === w && L(b, 1) ? '-webkit-' + b + b : b;
+ }
+
+ if (0 === w || 2 === w && !L(a, 1)) return a;
+
+ switch (m) {
+ case 1015:
+ return 97 === a.charCodeAt(10) ? '-webkit-' + a + a : a;
+
+ case 951:
+ return 116 === a.charCodeAt(3) ? '-webkit-' + a + a : a;
+
+ case 963:
+ return 110 === a.charCodeAt(5) ? '-webkit-' + a + a : a;
+
+ case 1009:
+ if (100 !== a.charCodeAt(4)) break;
+
+ case 969:
+ case 942:
+ return '-webkit-' + a + a;
+
+ case 978:
+ return '-webkit-' + a + '-moz-' + a + a;
+
+ case 1019:
+ case 983:
+ return '-webkit-' + a + '-moz-' + a + '-ms-' + a + a;
+
+ case 883:
+ if (45 === a.charCodeAt(8)) return '-webkit-' + a + a;
+ if (0 < a.indexOf('image-set(', 11)) return a.replace(ja, '$1-webkit-$2') + a;
+ break;
+
+ case 932:
+ if (45 === a.charCodeAt(4)) switch (a.charCodeAt(5)) {
+ case 103:
+ return '-webkit-box-' + a.replace('-grow', '') + '-webkit-' + a + '-ms-' + a.replace('grow', 'positive') + a;
+
+ case 115:
+ return '-webkit-' + a + '-ms-' + a.replace('shrink', 'negative') + a;
+
+ case 98:
+ return '-webkit-' + a + '-ms-' + a.replace('basis', 'preferred-size') + a;
+ }
+ return '-webkit-' + a + '-ms-' + a + a;
+
+ case 964:
+ return '-webkit-' + a + '-ms-flex-' + a + a;
+
+ case 1023:
+ if (99 !== a.charCodeAt(8)) break;
+ b = a.substring(a.indexOf(':', 15)).replace('flex-', '').replace('space-between', 'justify');
+ return '-webkit-box-pack' + b + '-webkit-' + a + '-ms-flex-pack' + b + a;
+
+ case 1005:
+ return ka.test(a) ? a.replace(aa, ':-webkit-') + a.replace(aa, ':-moz-') + a : a;
+
+ case 1e3:
+ b = a.substring(13).trim();
+ c = b.indexOf('-') + 1;
+
+ switch (b.charCodeAt(0) + b.charCodeAt(c)) {
+ case 226:
+ b = a.replace(G, 'tb');
+ break;
+
+ case 232:
+ b = a.replace(G, 'tb-rl');
+ break;
+
+ case 220:
+ b = a.replace(G, 'lr');
+ break;
+
+ default:
+ return a;
+ }
+
+ return '-webkit-' + a + '-ms-' + b + a;
+
+ case 1017:
+ if (-1 === a.indexOf('sticky', 9)) break;
+
+ case 975:
+ c = (a = d).length - 10;
+ b = (33 === a.charCodeAt(c) ? a.substring(0, c) : a).substring(d.indexOf(':', 7) + 1).trim();
+
+ switch (m = b.charCodeAt(0) + (b.charCodeAt(7) | 0)) {
+ case 203:
+ if (111 > b.charCodeAt(8)) break;
+
+ case 115:
+ a = a.replace(b, '-webkit-' + b) + ';' + a;
+ break;
+
+ case 207:
+ case 102:
+ a = a.replace(b, '-webkit-' + (102 < m ? 'inline-' : '') + 'box') + ';' + a.replace(b, '-webkit-' + b) + ';' + a.replace(b, '-ms-' + b + 'box') + ';' + a;
+ }
+
+ return a + ';';
+
+ case 938:
+ if (45 === a.charCodeAt(5)) switch (a.charCodeAt(6)) {
+ case 105:
+ return b = a.replace('-items', ''), '-webkit-' + a + '-webkit-box-' + b + '-ms-flex-' + b + a;
+
+ case 115:
+ return '-webkit-' + a + '-ms-flex-item-' + a.replace(ba, '') + a;
+
+ default:
+ return '-webkit-' + a + '-ms-flex-line-pack' + a.replace('align-content', '').replace(ba, '') + a;
+ }
+ break;
+
+ case 973:
+ case 989:
+ if (45 !== a.charCodeAt(3) || 122 === a.charCodeAt(4)) break;
+
+ case 931:
+ case 953:
+ if (!0 === la.test(d)) return 115 === (b = d.substring(d.indexOf(':') + 1)).charCodeAt(0) ? P(d.replace('stretch', 'fill-available'), c, e, h).replace(':fill-available', ':stretch') : a.replace(b, '-webkit-' + b) + a.replace(b, '-moz-' + b.replace('fill-', '')) + a;
+ break;
+
+ case 962:
+ if (a = '-webkit-' + a + (102 === a.charCodeAt(5) ? '-ms-' + a : '') + a, 211 === e + h && 105 === a.charCodeAt(13) && 0 < a.indexOf('transform', 10)) return a.substring(0, a.indexOf(';', 27) + 1).replace(ma, '$1-webkit-$2') + a;
+ }
+
+ return a;
+ }
+
+ function L(d, c) {
+ var e = d.indexOf(1 === c ? ':' : '{'),
+ h = d.substring(0, 3 !== c ? e : 10);
+ e = d.substring(e + 1, d.length - 1);
+ return R(2 !== c ? h : h.replace(na, '$1'), e, c);
+ }
+
+ function ea(d, c) {
+ var e = P(c, c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2));
+ return e !== c + ';' ? e.replace(oa, ' or ($1)').substring(4) : '(' + c + ')';
+ }
+
+ function H(d, c, e, h, a, m, b, v, n, q) {
+ for (var g = 0, x = c, w; g < A; ++g) {
+ switch (w = S[g].call(B, d, x, e, h, a, m, b, v, n, q)) {
+ case void 0:
+ case !1:
+ case !0:
+ case null:
+ break;
+
+ default:
+ x = w;
+ }
+ }
+
+ if (x !== c) return x;
+ }
+
+ function T(d) {
+ switch (d) {
+ case void 0:
+ case null:
+ A = S.length = 0;
+ break;
+
+ default:
+ if ('function' === typeof d) S[A++] = d;else if ('object' === typeof d) for (var c = 0, e = d.length; c < e; ++c) {
+ T(d[c]);
+ } else Y = !!d | 0;
+ }
+
+ return T;
+ }
+
+ function U(d) {
+ d = d.prefix;
+ void 0 !== d && (R = null, d ? 'function' !== typeof d ? w = 1 : (w = 2, R = d) : w = 0);
+ return U;
+ }
+
+ function B(d, c) {
+ var e = d;
+ 33 > e.charCodeAt(0) && (e = e.trim());
+ V = e;
+ e = [V];
+
+ if (0 < A) {
+ var h = H(-1, c, e, e, D, z, 0, 0, 0, 0);
+ void 0 !== h && 'string' === typeof h && (c = h);
+ }
+
+ var a = M(O, e, c, 0, 0);
+ 0 < A && (h = H(-2, a, e, e, D, z, a.length, 0, 0, 0), void 0 !== h && (a = h));
+ V = '';
+ E = 0;
+ z = D = 1;
+ return a;
+ }
+
+ var ca = /^\0+/g,
+ N = /[\0\r\f]/g,
+ aa = /: */g,
+ ka = /zoo|gra/,
+ ma = /([,: ])(transform)/g,
+ ia = /,\r+?/g,
+ F = /([\t\r\n ])*\f?&/g,
+ fa = /@(k\w+)\s*(\S*)\s*/,
+ Q = /::(place)/g,
+ ha = /:(read-only)/g,
+ G = /[svh]\w+-[tblr]{2}/,
+ da = /\(\s*(.*)\s*\)/g,
+ oa = /([\s\S]*?);/g,
+ ba = /-self|flex-/g,
+ na = /[^]*?(:[rp][el]a[\w-]+)[^]*/,
+ la = /stretch|:\s*\w+\-(?:conte|avail)/,
+ ja = /([^-])(image-set\()/,
+ z = 1,
+ D = 1,
+ E = 0,
+ w = 1,
+ O = [],
+ S = [],
+ A = 0,
+ R = null,
+ Y = 0,
+ V = '';
+ B.use = T;
+ B.set = U;
+ void 0 !== W && U(W);
+ return B;
+ }
+
+ var weakMemoize = function weakMemoize(func) {
+ // $FlowFixMe flow doesn't include all non-primitive types as allowed for weakmaps
+ var cache = new WeakMap();
+ return function (arg) {
+ if (cache.has(arg)) {
+ // $FlowFixMe
+ return cache.get(arg);
+ }
+
+ var ret = func(arg);
+ cache.set(arg, ret);
+ return ret;
+ };
+ };
+
+ // https://github.com/thysultan/stylis.js/tree/master/plugins/rule-sheet
+ // inlined to avoid umd wrapper and peerDep warnings/installing stylis
+ // since we use stylis after closure compiler
+ var delimiter = '/*|*/';
+ var needle = delimiter + '}';
+
+ function toSheet(block) {
+ if (block) {
+ Sheet.current.insert(block + '}');
+ }
+ }
+
+ var Sheet = {
+ current: null
+ };
+ var ruleSheet = function ruleSheet(context, content, selectors, parents, line, column, length, ns, depth, at) {
+ switch (context) {
+ // property
+ case 1:
+ {
+ switch (content.charCodeAt(0)) {
+ case 64:
+ {
+ // @import
+ Sheet.current.insert(content + ';');
+ return '';
+ }
+ // charcode for l
+
+ case 108:
+ {
+ // charcode for b
+ // this ignores label
+ if (content.charCodeAt(2) === 98) {
+ return '';
+ }
+ }
+ }
+
+ break;
+ }
+ // selector
+
+ case 2:
+ {
+ if (ns === 0) return content + delimiter;
+ break;
+ }
+ // at-rule
+
+ case 3:
+ {
+ switch (ns) {
+ // @font-face, @page
+ case 102:
+ case 112:
+ {
+ Sheet.current.insert(selectors[0] + content);
+ return '';
+ }
+
+ default:
+ {
+ return content + (at === 0 ? delimiter : '');
+ }
+ }
+ }
+
+ case -2:
+ {
+ content.split(needle).forEach(toSheet);
+ }
+ }
+ };
+ var removeLabel = function removeLabel(context, content) {
+ if (context === 1 && // charcode for l
+ content.charCodeAt(0) === 108 && // charcode for b
+ content.charCodeAt(2) === 98 // this ignores label
+ ) {
+ return '';
+ }
+ };
+
+ var isBrowser = typeof document !== 'undefined';
+ var rootServerStylisCache = {};
+ var getServerStylisCache = isBrowser ? undefined : weakMemoize(function () {
+ var getCache = weakMemoize(function () {
+ return {};
+ });
+ var prefixTrueCache = {};
+ var prefixFalseCache = {};
+ return function (prefix) {
+ if (prefix === undefined || prefix === true) {
+ return prefixTrueCache;
+ }
+
+ if (prefix === false) {
+ return prefixFalseCache;
+ }
+
+ return getCache(prefix);
+ };
+ });
+
+ var createCache = function createCache(options) {
+ if (options === undefined) options = {};
+ var key = options.key || 'css';
+ var stylisOptions;
+
+ if (options.prefix !== undefined) {
+ stylisOptions = {
+ prefix: options.prefix
+ };
+ }
+
+ var stylis = new stylis_min(stylisOptions);
+
+ if (process.env.NODE_ENV !== 'production') {
+ // $FlowFixMe
+ if (/[^a-z-]/.test(key)) {
+ throw new Error("Emotion key must only contain lower case alphabetical characters and - but \"" + key + "\" was passed");
+ }
+ }
+
+ var inserted = {}; // $FlowFixMe
+
+ var container;
+
+ if (isBrowser) {
+ container = options.container || document.head;
+ var nodes = document.querySelectorAll("style[data-emotion-" + key + "]");
+ Array.prototype.forEach.call(nodes, function (node) {
+ var attrib = node.getAttribute("data-emotion-" + key); // $FlowFixMe
+
+ attrib.split(' ').forEach(function (id) {
+ inserted[id] = true;
+ });
+
+ if (node.parentNode !== container) {
+ container.appendChild(node);
+ }
+ });
+ }
+
+ var _insert;
+
+ if (isBrowser) {
+ stylis.use(options.stylisPlugins)(ruleSheet);
+
+ _insert = function insert(selector, serialized, sheet, shouldCache) {
+ var name = serialized.name;
+ Sheet.current = sheet;
+
+ if (process.env.NODE_ENV !== 'production' && serialized.map !== undefined) {
+ var map = serialized.map;
+ Sheet.current = {
+ insert: function insert(rule) {
+ sheet.insert(rule + map);
+ }
+ };
+ }
+
+ stylis(selector, serialized.styles);
+
+ if (shouldCache) {
+ cache.inserted[name] = true;
+ }
+ };
+ } else {
+ stylis.use(removeLabel);
+ var serverStylisCache = rootServerStylisCache;
+
+ if (options.stylisPlugins || options.prefix !== undefined) {
+ stylis.use(options.stylisPlugins); // $FlowFixMe
+
+ serverStylisCache = getServerStylisCache(options.stylisPlugins || rootServerStylisCache)(options.prefix);
+ }
+
+ var getRules = function getRules(selector, serialized) {
+ var name = serialized.name;
+
+ if (serverStylisCache[name] === undefined) {
+ serverStylisCache[name] = stylis(selector, serialized.styles);
+ }
+
+ return serverStylisCache[name];
+ };
+
+ _insert = function _insert(selector, serialized, sheet, shouldCache) {
+ var name = serialized.name;
+ var rules = getRules(selector, serialized);
+
+ if (cache.compat === undefined) {
+ // in regular mode, we don't set the styles on the inserted cache
+ // since we don't need to and that would be wasting memory
+ // we return them so that they are rendered in a style tag
+ if (shouldCache) {
+ cache.inserted[name] = true;
+ }
+
+ if ( // using === development instead of !== production
+ // because if people do ssr in tests, the source maps showing up would be annoying
+ process.env.NODE_ENV === 'development' && serialized.map !== undefined) {
+ return rules + serialized.map;
+ }
+
+ return rules;
+ } else {
+ // in compat mode, we put the styles on the inserted cache so
+ // that emotion-server can pull out the styles
+ // except when we don't want to cache it(just the Global component right now)
+ if (shouldCache) {
+ cache.inserted[name] = rules;
+ } else {
+ return rules;
+ }
+ }
+ };
+ }
+
+ if (process.env.NODE_ENV !== 'production') {
+ // https://esbench.com/bench/5bf7371a4cd7e6009ef61d0a
+ var commentStart = /\/\*/g;
+ var commentEnd = /\*\//g;
+ stylis.use(function (context, content) {
+ switch (context) {
+ case -1:
+ {
+ while (commentStart.test(content)) {
+ commentEnd.lastIndex = commentStart.lastIndex;
+
+ if (commentEnd.test(content)) {
+ commentStart.lastIndex = commentEnd.lastIndex;
+ continue;
+ }
+
+ throw new Error('Your styles have an unterminated comment ("/*" without corresponding "*/").');
+ }
+
+ commentStart.lastIndex = 0;
+ break;
+ }
+ }
+ });
+ stylis.use(function (context, content, selectors) {
+ switch (context) {
+ case -1:
+ {
+ var flag = 'emotion-disable-server-rendering-unsafe-selector-warning-please-do-not-use-this-the-warning-exists-for-a-reason';
+ var unsafePseudoClasses = content.match(/(:first|:nth|:nth-last)-child/g);
+
+ if (unsafePseudoClasses) {
+ unsafePseudoClasses.forEach(function (unsafePseudoClass) {
+ var ignoreRegExp = new RegExp(unsafePseudoClass + ".*\\/\\* " + flag + " \\*\\/");
+ var ignore = ignoreRegExp.test(content);
+
+ if (unsafePseudoClass && !ignore) {
+ console.error("The pseudo class \"" + unsafePseudoClass + "\" is potentially unsafe when doing server-side rendering. Try changing it to \"" + unsafePseudoClass.split('-child')[0] + "-of-type\".");
+ }
+ });
+ }
+
+ break;
+ }
+ }
+ });
+ }
+
+ var cache = {
+ key: key,
+ sheet: new StyleSheet({
+ key: key,
+ container: container,
+ nonce: options.nonce,
+ speedy: options.speedy
+ }),
+ nonce: options.nonce,
+ inserted: inserted,
+ registered: {},
+ insert: _insert
+ };
+ return cache;
+ };
+
+ var isBrowser$1 = typeof document !== 'undefined';
+ function getRegisteredStyles(registered, registeredStyles, classNames) {
+ var rawClassName = '';
+ classNames.split(' ').forEach(function (className) {
+ if (registered[className] !== undefined) {
+ registeredStyles.push(registered[className]);
+ } else {
+ rawClassName += className + " ";
+ }
+ });
+ return rawClassName;
+ }
+ var insertStyles = function insertStyles(cache, serialized, isStringTag) {
+ var className = cache.key + "-" + serialized.name;
+
+ if ( // we only need to add the styles to the registered cache if the
+ // class name could be used further down
+ // the tree but if it's a string tag, we know it won't
+ // so we don't have to add it to registered cache.
+ // this improves memory usage since we can avoid storing the whole style string
+ (isStringTag === false || // we need to always store it if we're in compat mode and
+ // in node since emotion-server relies on whether a style is in
+ // the registered cache to know whether a style is global or not
+ // also, note that this check will be dead code eliminated in the browser
+ isBrowser$1 === false && cache.compat !== undefined) && cache.registered[className] === undefined) {
+ cache.registered[className] = serialized.styles;
+ }
+
+ if (cache.inserted[serialized.name] === undefined) {
+ var stylesForSSR = '';
+ var current = serialized;
+
+ do {
+ var maybeStyles = cache.insert("." + className, current, cache.sheet, true);
+
+ if (!isBrowser$1 && maybeStyles !== undefined) {
+ stylesForSSR += maybeStyles;
+ }
+
+ current = current.next;
+ } while (current !== undefined);
+
+ if (!isBrowser$1 && stylesForSSR.length !== 0) {
+ return stylesForSSR;
+ }
+ }
+ };
+
+ /* eslint-disable */
+ // murmurhash2 via https://github.com/garycourt/murmurhash-js/blob/master/murmurhash2_gc.js
+ function murmurhash2_32_gc(str) {
+ var l = str.length,
+ h = l ^ l,
+ i = 0,
+ k;
+
+ while (l >= 4) {
+ k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;
+ k = (k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0x5bd1e995 & 0xffff) << 16);
+ k ^= k >>> 24;
+ k = (k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0x5bd1e995 & 0xffff) << 16);
+ h = (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0x5bd1e995 & 0xffff) << 16) ^ k;
+ l -= 4;
+ ++i;
+ }
+
+ switch (l) {
+ case 3:
+ h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
+
+ case 2:
+ h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
+
+ case 1:
+ h ^= str.charCodeAt(i) & 0xff;
+ h = (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0x5bd1e995 & 0xffff) << 16);
+ }
+
+ h ^= h >>> 13;
+ h = (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0x5bd1e995 & 0xffff) << 16);
+ h ^= h >>> 15;
+ return (h >>> 0).toString(36);
+ }
+
+ var unitlessKeys = {
+ animationIterationCount: 1,
+ borderImageOutset: 1,
+ borderImageSlice: 1,
+ borderImageWidth: 1,
+ boxFlex: 1,
+ boxFlexGroup: 1,
+ boxOrdinalGroup: 1,
+ columnCount: 1,
+ columns: 1,
+ flex: 1,
+ flexGrow: 1,
+ flexPositive: 1,
+ flexShrink: 1,
+ flexNegative: 1,
+ flexOrder: 1,
+ gridRow: 1,
+ gridRowEnd: 1,
+ gridRowSpan: 1,
+ gridRowStart: 1,
+ gridColumn: 1,
+ gridColumnEnd: 1,
+ gridColumnSpan: 1,
+ gridColumnStart: 1,
+ msGridRow: 1,
+ msGridRowSpan: 1,
+ msGridColumn: 1,
+ msGridColumnSpan: 1,
+ fontWeight: 1,
+ lineHeight: 1,
+ opacity: 1,
+ order: 1,
+ orphans: 1,
+ tabSize: 1,
+ widows: 1,
+ zIndex: 1,
+ zoom: 1,
+ WebkitLineClamp: 1,
+ // SVG-related properties
+ fillOpacity: 1,
+ floodOpacity: 1,
+ stopOpacity: 1,
+ strokeDasharray: 1,
+ strokeDashoffset: 1,
+ strokeMiterlimit: 1,
+ strokeOpacity: 1,
+ strokeWidth: 1
+ };
+
+ var hyphenateRegex = /[A-Z]|^ms/g;
+ var animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;
+
+ var isCustomProperty = function isCustomProperty(property) {
+ return property.charCodeAt(1) === 45;
+ };
+
+ var processStyleName = memoize(function (styleName) {
+ return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();
+ });
+
+ var processStyleValue = function processStyleValue(key, value) {
+ if (value == null || typeof value === 'boolean') {
+ return '';
+ }
+
+ switch (key) {
+ case 'animation':
+ case 'animationName':
+ {
+ if (typeof value === 'string') {
+ value = value.replace(animationRegex, function (match, p1, p2) {
+ cursor = {
+ name: p1,
+ styles: p2,
+ next: cursor
+ };
+ return p1;
+ });
+ }
+ }
+ }
+
+ if (unitlessKeys[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {
+ return value + 'px';
+ }
+
+ return value;
+ };
+
+ if (process.env.NODE_ENV !== 'production') {
+ var contentValuePattern = /(attr|calc|counters?|url)\(/;
+ var contentValues = ['normal', 'none', 'counter', 'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote', 'initial', 'inherit', 'unset'];
+ var oldProcessStyleValue = processStyleValue;
+ var msPattern = /^-ms-/;
+ var hyphenPattern = /-(.)/g;
+ var hyphenatedCache = {};
+
+ processStyleValue = function processStyleValue(key, value) {
+ if (key === 'content') {
+ if (typeof value !== 'string' || contentValues.indexOf(value) === -1 && !contentValuePattern.test(value) && (value.charAt(0) !== value.charAt(value.length - 1) || value.charAt(0) !== '"' && value.charAt(0) !== "'")) {
+ console.error("You seem to be using a value for 'content' without quotes, try replacing it with `content: '\"" + value + "\"'`");
+ }
+ }
+
+ var processed = oldProcessStyleValue(key, value);
+
+ if (processed !== '' && !isCustomProperty(key) && key.indexOf('-') !== -1 && hyphenatedCache[key] === undefined) {
+ hyphenatedCache[key] = true;
+ console.error("Using kebab-case for css properties in objects is not supported. Did you mean " + key.replace(msPattern, 'ms-').replace(hyphenPattern, function (str, char) {
+ return char.toUpperCase();
+ }) + "?");
+ }
+
+ return processed;
+ };
+ }
+
+ var shouldWarnAboutInterpolatingClassNameFromCss = true;
+
+ function handleInterpolation(mergedProps, registered, interpolation, couldBeSelectorInterpolation) {
+ if (interpolation == null) {
+ return '';
+ }
+
+ if (interpolation.__emotion_styles !== undefined) {
+ if (process.env.NODE_ENV !== 'production' && interpolation.toString() === 'NO_COMPONENT_SELECTOR') {
+ throw new Error('Component selectors can only be used in conjunction with babel-plugin-emotion.');
+ }
+
+ return interpolation;
+ }
+
+ switch (typeof interpolation) {
+ case 'boolean':
+ {
+ return '';
+ }
+
+ case 'object':
+ {
+ if (interpolation.anim === 1) {
+ cursor = {
+ name: interpolation.name,
+ styles: interpolation.styles,
+ next: cursor
+ };
+ return interpolation.name;
+ }
+
+ if (interpolation.styles !== undefined) {
+ var next = interpolation.next;
+
+ if (next !== undefined) {
+ // not the most efficient thing ever but this is a pretty rare case
+ // and there will be very few iterations of this generally
+ while (next !== undefined) {
+ cursor = {
+ name: next.name,
+ styles: next.styles,
+ next: cursor
+ };
+ next = next.next;
+ }
+ }
+
+ var styles = interpolation.styles;
+
+ if (process.env.NODE_ENV !== 'production' && interpolation.map !== undefined) {
+ styles += interpolation.map;
+ }
+
+ return styles;
+ }
+
+ return createStringFromObject(mergedProps, registered, interpolation);
+ }
+
+ case 'function':
+ {
+ if (mergedProps !== undefined) {
+ var previousCursor = cursor;
+ var result = interpolation(mergedProps);
+ cursor = previousCursor;
+ return handleInterpolation(mergedProps, registered, result, couldBeSelectorInterpolation);
+ } else if (process.env.NODE_ENV !== 'production') {
+ console.error('Functions that are interpolated in css calls will be stringified.\n' + 'If you want to have a css call based on props, create a function that returns a css call like this\n' + 'let dynamicStyle = (props) => css`color: ${props.color}`\n' + 'It can be called directly with props or interpolated in a styled call like this\n' + "let SomeComponent = styled('div')`${dynamicStyle}`");
+ }
+ }
+ // eslint-disable-next-line no-fallthrough
+
+ default:
+ {
+ if (registered == null) {
+ return interpolation;
+ }
+
+ var cached = registered[interpolation];
+
+ if (process.env.NODE_ENV !== 'production' && couldBeSelectorInterpolation && shouldWarnAboutInterpolatingClassNameFromCss && cached !== undefined) {
+ console.error('Interpolating a className from css`` is not recommended and will cause problems with composition.\n' + 'Interpolating a className from css`` will be completely unsupported in a future major version of Emotion');
+ shouldWarnAboutInterpolatingClassNameFromCss = false;
+ }
+
+ return cached !== undefined && !couldBeSelectorInterpolation ? cached : interpolation;
+ }
+ }
+ }
+
+ function createStringFromObject(mergedProps, registered, obj) {
+ var string = '';
+
+ if (Array.isArray(obj)) {
+ for (var i = 0; i < obj.length; i++) {
+ string += handleInterpolation(mergedProps, registered, obj[i], false);
+ }
+ } else {
+ for (var _key in obj) {
+ var value = obj[_key];
+
+ if (typeof value !== 'object') {
+ if (registered != null && registered[value] !== undefined) {
+ string += _key + "{" + registered[value] + "}";
+ } else {
+ string += processStyleName(_key) + ":" + processStyleValue(_key, value) + ";";
+ }
+ } else {
+ if (_key === 'NO_COMPONENT_SELECTOR' && process.env.NODE_ENV !== 'production') {
+ throw new Error('Component selectors can only be used in conjunction with babel-plugin-emotion.');
+ }
+
+ if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {
+ for (var _i = 0; _i < value.length; _i++) {
+ string += processStyleName(_key) + ":" + processStyleValue(_key, value[_i]) + ";";
+ }
+ } else {
+ string += _key + "{" + handleInterpolation(mergedProps, registered, value, false) + "}";
+ }
+ }
+ }
+ }
+
+ return string;
+ }
+
+ var labelPattern = /label:\s*([^\s;\n{]+)\s*;/g;
+ var sourceMapPattern;
+
+ if (process.env.NODE_ENV !== 'production') {
+ sourceMapPattern = /\/\*#\ssourceMappingURL=data:application\/json;\S+\s+\*\//;
+ } // this is the cursor for keyframes
+ // keyframes are stored on the SerializedStyles object as a linked list
+
+
+ var cursor;
+ var serializeStyles = function serializeStyles(args, registered, mergedProps) {
+ if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {
+ return args[0];
+ }
+
+ var stringMode = true;
+ var styles = '';
+ cursor = undefined;
+ var strings = args[0];
+
+ if (strings == null || strings.raw === undefined) {
+ stringMode = false;
+ styles += handleInterpolation(mergedProps, registered, strings, false);
+ } else {
+ styles += strings[0];
+ } // we start at 1 since we've already handled the first arg
+
+
+ for (var i = 1; i < args.length; i++) {
+ styles += handleInterpolation(mergedProps, registered, args[i], styles.charCodeAt(styles.length - 1) === 46);
+
+ if (stringMode) {
+ styles += strings[i];
+ }
+ }
+
+ var sourceMap;
+
+ if (process.env.NODE_ENV !== 'production') {
+ styles = styles.replace(sourceMapPattern, function (match) {
+ sourceMap = match;
+ return '';
+ });
+ } // using a global regex with .exec is stateful so lastIndex has to be reset each time
+
+
+ labelPattern.lastIndex = 0;
+ var identifierName = '';
+ var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5
+
+ while ((match = labelPattern.exec(styles)) !== null) {
+ identifierName += '-' + // $FlowFixMe we know it's not null
+ match[1];
+ }
+
+ var name = murmurhash2_32_gc(styles) + identifierName;
+
+ if (process.env.NODE_ENV !== 'production') {
+ return {
+ name: name,
+ styles: styles,
+ map: sourceMap,
+ next: cursor
+ };
+ }
+
+ return {
+ name: name,
+ styles: styles,
+ next: cursor
+ };
+ };
+
+ var isBrowser$2 = typeof document !== 'undefined';
+
+ var EmotionCacheContext = React.createContext(isBrowser$2 ? createCache() : null);
+ var ThemeContext = React.createContext({});
+ var CacheProvider = EmotionCacheContext.Provider;
+
+ var withEmotionCache = function withEmotionCache(func) {
+ var render = function render(props, ref) {
+ return React.createElement(EmotionCacheContext.Consumer, null, function ( // $FlowFixMe we know it won't be null
+ cache) {
+ return func(props, cache, ref);
+ });
+ }; // $FlowFixMe
+
+
+ return React.forwardRef(render);
+ };
+
+ if (!isBrowser$2) {
+ var BasicProvider =
+ /*#__PURE__*/
+ function (_React$Component) {
+ inheritsLoose(BasicProvider, _React$Component);
+
+ function BasicProvider(props, context, updater) {
+ var _this;
+
+ _this = _React$Component.call(this, props, context, updater) || this;
+ _this.state = {
+ value: createCache()
+ };
+ return _this;
+ }
+
+ var _proto = BasicProvider.prototype;
+
+ _proto.render = function render() {
+ return React.createElement(EmotionCacheContext.Provider, this.state, this.props.children(this.state.value));
+ };
+
+ return BasicProvider;
+ }(React.Component);
+
+ withEmotionCache = function withEmotionCache(func) {
+ return function (props) {
+ return React.createElement(EmotionCacheContext.Consumer, null, function (context) {
+ if (context === null) {
+ return React.createElement(BasicProvider, null, function (newContext) {
+ return func(props, newContext);
+ });
+ } else {
+ return func(props, context);
+ }
+ });
+ };
+ };
+ }
+
+ var typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';
+ var labelPropName = '__EMOTION_LABEL_PLEASE_DO_NOT_USE__';
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ var render = function render(cache, props, theme, ref) {
+ var type = props[typePropName];
+ var registeredStyles = [];
+ var className = '';
+ var cssProp = theme === null ? props.css : props.css(theme); // so that using `css` from `emotion` and passing the result to the css prop works
+ // not passing the registered cache to serializeStyles because it would
+ // make certain babel optimisations not possible
+
+ if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {
+ cssProp = cache.registered[cssProp];
+ }
+
+ registeredStyles.push(cssProp);
+
+ if (props.className !== undefined) {
+ className = getRegisteredStyles(cache.registered, registeredStyles, props.className);
+ }
+
+ var serialized = serializeStyles(registeredStyles);
+
+ if (process.env.NODE_ENV !== 'production' && serialized.name.indexOf('-') === -1) {
+ var labelFromStack = props[labelPropName];
+
+ if (labelFromStack) {
+ serialized = serializeStyles([serialized, 'label:' + labelFromStack + ';']);
+ }
+ }
+
+ var rules = insertStyles(cache, serialized, typeof type === 'string');
+ className += cache.key + "-" + serialized.name;
+ var newProps = {};
+
+ for (var key in props) {
+ if (hasOwnProperty.call(props, key) && key !== 'css' && key !== typePropName && (process.env.NODE_ENV === 'production' || key !== labelPropName)) {
+ newProps[key] = props[key];
+ }
+ }
+
+ newProps.ref = ref;
+ newProps.className = className;
+ var ele = React.createElement(type, newProps);
+
+ if (!isBrowser$2 && rules !== undefined) {
+ var _ref;
+
+ var serializedNames = serialized.name;
+ var next = serialized.next;
+
+ while (next !== undefined) {
+ serializedNames += ' ' + next.name;
+ next = next.next;
+ }
+
+ return React.createElement(React.Fragment, null, React.createElement("style", (_ref = {}, _ref["data-emotion-" + cache.key] = serializedNames, _ref.dangerouslySetInnerHTML = {
+ __html: rules
+ }, _ref.nonce = cache.sheet.nonce, _ref)), ele);
+ }
+
+ return ele;
+ };
+
+ var Emotion = withEmotionCache(function (props, cache, ref) {
+ // use Context.read for the theme when it's stable
+ if (typeof props.css === 'function') {
+ return React.createElement(ThemeContext.Consumer, null, function (theme) {
+ return render(cache, props, theme, ref);
+ });
+ }
+
+ return render(cache, props, null, ref);
+ });
+
+ if (process.env.NODE_ENV !== 'production') {
+ Emotion.displayName = 'EmotionCssPropInternal';
+ } // $FlowFixMe
+
+ var classnames = function classnames(args) {
+ var len = args.length;
+ var i = 0;
+ var cls = '';
+
+ for (; i < len; i++) {
+ var arg = args[i];
+ if (arg == null) continue;
+ var toAdd = void 0;
+
+ switch (typeof arg) {
+ case 'boolean':
+ break;
+
+ case 'object':
+ {
+ if (Array.isArray(arg)) {
+ toAdd = classnames(arg);
+ } else {
+ toAdd = '';
+
+ for (var k in arg) {
+ if (arg[k] && k) {
+ toAdd && (toAdd += ' ');
+ toAdd += k;
+ }
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ toAdd = arg;
+ }
+ }
+
+ if (toAdd) {
+ cls && (cls += ' ');
+ cls += toAdd;
+ }
+ }
+
+ return cls;
+ };
+
+ function merge(registered, css, className) {
+ var registeredStyles = [];
+ var rawClassName = getRegisteredStyles(registered, registeredStyles, className);
+
+ if (registeredStyles.length < 2) {
+ return className;
+ }
+
+ return rawClassName + css(registeredStyles);
+ }
+
+ var ClassNames = withEmotionCache(function (props, context) {
+ return React.createElement(ThemeContext.Consumer, null, function (theme) {
+ var rules = '';
+ var serializedHashes = '';
+ var hasRendered = false;
+
+ var css = function css() {
+ if (hasRendered && process.env.NODE_ENV !== 'production') {
+ throw new Error('css can only be used during render');
+ }
+
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var serialized = serializeStyles(args, context.registered);
+
+ if (isBrowser$2) {
+ insertStyles(context, serialized, false);
+ } else {
+ var res = insertStyles(context, serialized, false);
+
+ if (res !== undefined) {
+ rules += res;
+ }
+ }
+
+ if (!isBrowser$2) {
+ serializedHashes += " " + serialized.name;
+ }
+
+ return context.key + "-" + serialized.name;
+ };
+
+ var cx = function cx() {
+ if (hasRendered && process.env.NODE_ENV !== 'production') {
+ throw new Error('cx can only be used during render');
+ }
+
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return merge(context.registered, css, classnames(args));
+ };
+
+ var content = {
+ css: css,
+ cx: cx,
+ theme: theme
+ };
+ var ele = props.children(content);
+ hasRendered = true;
+
+ if (!isBrowser$2 && rules.length !== 0) {
+ var _ref;
+
+ return React.createElement(React.Fragment, null, React.createElement("style", (_ref = {}, _ref["data-emotion-" + context.key] = serializedHashes.substring(1), _ref.dangerouslySetInnerHTML = {
+ __html: rules
+ }, _ref.nonce = context.sheet.nonce, _ref)), ele);
+ }
+
+ return ele;
+ });
+ });
+
+ var testOmitPropsOnStringTag = index;
+
+ var testOmitPropsOnComponent = function testOmitPropsOnComponent(key) {
+ return key !== 'theme' && key !== 'innerRef';
+ };
+
+ var getDefaultShouldForwardProp = function getDefaultShouldForwardProp(tag) {
+ return typeof tag === 'string' && // 96 is one less than the char code
+ // for "a" so this is checking that
+ // it's a lowercase character
+ tag.charCodeAt(0) > 96 ? testOmitPropsOnStringTag : testOmitPropsOnComponent;
+ };
+
+ var isBrowser$3 = typeof document !== 'undefined';
+
+ var createStyled = function createStyled(tag, options) {
+ if (process.env.NODE_ENV !== 'production') {
+ if (tag === undefined) {
+ throw new Error('You are trying to create a styled element with an undefined component.\nYou may have forgotten to import it.');
+ }
+ }
+
+ var identifierName;
+ var shouldForwardProp;
+ var targetClassName;
+
+ if (options !== undefined) {
+ identifierName = options.label;
+ targetClassName = options.target;
+ shouldForwardProp = tag.__emotion_forwardProp && options.shouldForwardProp ? function (propName) {
+ return tag.__emotion_forwardProp(propName) && // $FlowFixMe
+ options.shouldForwardProp(propName);
+ } : options.shouldForwardProp;
+ }
+
+ var isReal = tag.__emotion_real === tag;
+ var baseTag = isReal && tag.__emotion_base || tag;
+
+ if (typeof shouldForwardProp !== 'function' && isReal) {
+ shouldForwardProp = tag.__emotion_forwardProp;
+ }
+
+ var defaultShouldForwardProp = shouldForwardProp || getDefaultShouldForwardProp(baseTag);
+ var shouldUseAs = !defaultShouldForwardProp('as');
+ return function () {
+ var args = arguments;
+ var styles = isReal && tag.__emotion_styles !== undefined ? tag.__emotion_styles.slice(0) : [];
+
+ if (identifierName !== undefined) {
+ styles.push("label:" + identifierName + ";");
+ }
+
+ if (args[0] == null || args[0].raw === undefined) {
+ styles.push.apply(styles, args);
+ } else {
+ styles.push(args[0][0]);
+ var len = args.length;
+ var i = 1;
+
+ for (; i < len; i++) {
+ styles.push(args[i], args[0][i]);
+ }
+ }
+
+ var Styled = withEmotionCache(function (props, context, ref) {
+ return React.createElement(ThemeContext.Consumer, null, function (theme) {
+ var finalTag = shouldUseAs && props.as || baseTag;
+ var className = '';
+ var classInterpolations = [];
+ var mergedProps = props;
+
+ if (props.theme == null) {
+ mergedProps = {};
+
+ for (var key in props) {
+ mergedProps[key] = props[key];
+ }
+
+ mergedProps.theme = theme;
+ }
+
+ if (typeof props.className === 'string') {
+ className += getRegisteredStyles(context.registered, classInterpolations, props.className);
+ }
+
+ var serialized = serializeStyles(styles.concat(classInterpolations), context.registered, mergedProps);
+ var rules = insertStyles(context, serialized, typeof finalTag === 'string');
+ className += context.key + "-" + serialized.name;
+
+ if (targetClassName !== undefined) {
+ className += " " + targetClassName;
+ }
+
+ var finalShouldForwardProp = shouldUseAs && shouldForwardProp === undefined ? getDefaultShouldForwardProp(finalTag) : defaultShouldForwardProp;
+ var newProps = {};
+
+ for (var _key in props) {
+ if (shouldUseAs && _key === 'as') continue;
+
+ if ( // $FlowFixMe
+ finalShouldForwardProp(_key)) {
+ newProps[_key] = props[_key];
+ }
+ }
+
+ newProps.className = className;
+ newProps.ref = ref || props.innerRef;
+
+ if (process.env.NODE_ENV !== 'production' && props.innerRef) {
+ console.error('`innerRef` is deprecated and will be removed in a future major version of Emotion, please use the `ref` prop instead' + (identifierName === undefined ? '' : " in the usage of `" + identifierName + "`"));
+ }
+
+ var ele = React.createElement(finalTag, newProps);
+
+ if (!isBrowser$3 && rules !== undefined) {
+ var _ref;
+
+ var serializedNames = serialized.name;
+ var next = serialized.next;
+
+ while (next !== undefined) {
+ serializedNames += ' ' + next.name;
+ next = next.next;
+ }
+
+ return React.createElement(React.Fragment, null, React.createElement("style", (_ref = {}, _ref["data-emotion-" + context.key] = serializedNames, _ref.dangerouslySetInnerHTML = {
+ __html: rules
+ }, _ref.nonce = context.sheet.nonce, _ref)), ele);
+ }
+
+ return ele;
+ });
+ });
+ Styled.displayName = identifierName !== undefined ? identifierName : "Styled(" + (typeof baseTag === 'string' ? baseTag : baseTag.displayName || baseTag.name || 'Component') + ")";
+ Styled.defaultProps = tag.defaultProps;
+ Styled.__emotion_real = Styled;
+ Styled.__emotion_base = baseTag;
+ Styled.__emotion_styles = styles;
+ Styled.__emotion_forwardProp = shouldForwardProp;
+ Object.defineProperty(Styled, 'toString', {
+ value: function value() {
+ if (targetClassName === undefined && process.env.NODE_ENV !== 'production') {
+ return 'NO_COMPONENT_SELECTOR';
+ } // $FlowFixMe
+
+
+ return "." + targetClassName;
+ }
+ });
+
+ Styled.withComponent = function (nextTag, nextOptions) {
+ return createStyled(nextTag, nextOptions !== undefined ? _extends_1({}, options || {}, nextOptions) : options).apply(void 0, styles);
+ };
+
+ return Styled;
+ };
+ };
+
+ var tags = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', // SVG
+ 'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];
+
+ var newStyled = createStyled.bind();
+ tags.forEach(function (tagName) {
+ newStyled[tagName] = newStyled(tagName);
+ });
+
+ var isEdge = function isEdge(element) {
+ return element.data.source && element.data.target;
+ };
+ var separateElements = function separateElements(elements) {
+ return {
+ nodes: elements.filter(function (e) {
+ return !isEdge(e);
+ }),
+ edges: elements.filter(function (e) {
+ return isEdge(e);
+ })
+ };
+ };
+ var getBoundingBox = function getBoundingBox(nodes) {
+ var bbox = nodes.reduce(function (res, node) {
+ var x2 = node.position.x + node.data.__width;
+ var y2 = node.position.y + node.data.__height;
+
+ if (node.position.x < res.minX) {
+ res.minX = node.position.x;
+ }
+
+ if (x2 > res.maxX) {
+ res.maxX = x2;
+ }
+
+ if (node.position.y < res.minY) {
+ res.minY = node.position.y;
+ }
+
+ if (y2 > res.maxY) {
+ res.maxY = y2;
+ }
+
+ return res;
+ }, {
+ minX: Number.MAX_VALUE,
+ minY: Number.MAX_VALUE,
+ maxX: 0,
+ maxY: 0
+ });
+ return {
+ x: bbox.minX,
+ y: bbox.minY,
+ width: bbox.maxX - bbox.minX,
+ height: bbox.maxY - bbox.minY
+ };
+ };
+
+ var noop = {value: function() {}};
+
+ function dispatch() {
+ for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
+ if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
+ _[t] = [];
+ }
+ return new Dispatch(_);
+ }
+
+ function Dispatch(_) {
+ this._ = _;
+ }
+
+ function parseTypenames(typenames, types) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name = "", i = t.indexOf(".");
+ if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+ if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
+ return {type: t, name: name};
+ });
+ }
+
+ Dispatch.prototype = dispatch.prototype = {
+ constructor: Dispatch,
+ on: function(typename, callback) {
+ var _ = this._,
+ T = parseTypenames(typename + "", _),
+ t,
+ i = -1,
+ n = T.length;
+
+ // If no callback was specified, return the callback of the given type and name.
+ if (arguments.length < 2) {
+ while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
+ return;
+ }
+
+ // If a type was specified, set the callback for the given type and name.
+ // Otherwise, if a null callback was specified, remove callbacks of the given name.
+ if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
+ while (++i < n) {
+ if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
+ else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
+ }
+
+ return this;
+ },
+ copy: function() {
+ var copy = {}, _ = this._;
+ for (var t in _) copy[t] = _[t].slice();
+ return new Dispatch(copy);
+ },
+ call: function(type, that) {
+ if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
+ if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+ for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+ },
+ apply: function(type, that, args) {
+ if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+ for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+ }
+ };
+
+ function get(type, name) {
+ for (var i = 0, n = type.length, c; i < n; ++i) {
+ if ((c = type[i]).name === name) {
+ return c.value;
+ }
+ }
+ }
+
+ function set(type, name, callback) {
+ for (var i = 0, n = type.length; i < n; ++i) {
+ if (type[i].name === name) {
+ type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
+ break;
+ }
+ }
+ if (callback != null) type.push({name: name, value: callback});
+ return type;
+ }
+
+ var xhtml = "http://www.w3.org/1999/xhtml";
+
+ var namespaces = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: xhtml,
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+
+ function namespace(name) {
+ var prefix = name += "", i = prefix.indexOf(":");
+ if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+ return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
+ }
+
+ function creatorInherit(name) {
+ return function() {
+ var document = this.ownerDocument,
+ uri = this.namespaceURI;
+ return uri === xhtml && document.documentElement.namespaceURI === xhtml
+ ? document.createElement(name)
+ : document.createElementNS(uri, name);
+ };
+ }
+
+ function creatorFixed(fullname) {
+ return function() {
+ return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+ };
+ }
+
+ function creator(name) {
+ var fullname = namespace(name);
+ return (fullname.local
+ ? creatorFixed
+ : creatorInherit)(fullname);
+ }
+
+ function none() {}
+
+ function selector(selector) {
+ return selector == null ? none : function() {
+ return this.querySelector(selector);
+ };
+ }
+
+ function selection_select(select) {
+ if (typeof select !== "function") select = selector(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+ if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ subgroup[i] = subnode;
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+ }
+
+ function empty() {
+ return [];
+ }
+
+ function selectorAll(selector) {
+ return selector == null ? empty : function() {
+ return this.querySelectorAll(selector);
+ };
+ }
+
+ function selection_selectAll(select) {
+ if (typeof select !== "function") select = selectorAll(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ subgroups.push(select.call(node, node.__data__, i, group));
+ parents.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, parents);
+ }
+
+ function matcher(selector) {
+ return function() {
+ return this.matches(selector);
+ };
+ }
+
+ function selection_filter(match) {
+ if (typeof match !== "function") match = matcher(match);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+ if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+ }
+
+ function sparse(update) {
+ return new Array(update.length);
+ }
+
+ function selection_enter() {
+ return new Selection(this._enter || this._groups.map(sparse), this._parents);
+ }
+
+ function EnterNode(parent, datum) {
+ this.ownerDocument = parent.ownerDocument;
+ this.namespaceURI = parent.namespaceURI;
+ this._next = null;
+ this._parent = parent;
+ this.__data__ = datum;
+ }
+
+ EnterNode.prototype = {
+ constructor: EnterNode,
+ appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
+ insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
+ querySelector: function(selector) { return this._parent.querySelector(selector); },
+ querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
+ };
+
+ function constant(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ var keyPrefix = "$"; // Protect against keys like “__proto__”.
+
+ function bindIndex(parent, group, enter, update, exit, data) {
+ var i = 0,
+ node,
+ groupLength = group.length,
+ dataLength = data.length;
+
+ // Put any non-null nodes that fit into update.
+ // Put any null nodes into enter.
+ // Put any remaining data into enter.
+ for (; i < dataLength; ++i) {
+ if (node = group[i]) {
+ node.__data__ = data[i];
+ update[i] = node;
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Put any non-null nodes that don’t fit into exit.
+ for (; i < groupLength; ++i) {
+ if (node = group[i]) {
+ exit[i] = node;
+ }
+ }
+ }
+
+ function bindKey(parent, group, enter, update, exit, data, key) {
+ var i,
+ node,
+ nodeByKeyValue = {},
+ groupLength = group.length,
+ dataLength = data.length,
+ keyValues = new Array(groupLength),
+ keyValue;
+
+ // Compute the key for each node.
+ // If multiple nodes have the same key, the duplicates are added to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if (node = group[i]) {
+ keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
+ if (keyValue in nodeByKeyValue) {
+ exit[i] = node;
+ } else {
+ nodeByKeyValue[keyValue] = node;
+ }
+ }
+ }
+
+ // Compute the key for each datum.
+ // If there a node associated with this key, join and add it to update.
+ // If there is not (or the key is a duplicate), add it to enter.
+ for (i = 0; i < dataLength; ++i) {
+ keyValue = keyPrefix + key.call(parent, data[i], i, data);
+ if (node = nodeByKeyValue[keyValue]) {
+ update[i] = node;
+ node.__data__ = data[i];
+ nodeByKeyValue[keyValue] = null;
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Add any remaining nodes that were not bound to data to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
+ exit[i] = node;
+ }
+ }
+ }
+
+ function selection_data(value, key) {
+ if (!value) {
+ data = new Array(this.size()), j = -1;
+ this.each(function(d) { data[++j] = d; });
+ return data;
+ }
+
+ var bind = key ? bindKey : bindIndex,
+ parents = this._parents,
+ groups = this._groups;
+
+ if (typeof value !== "function") value = constant(value);
+
+ for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
+ var parent = parents[j],
+ group = groups[j],
+ groupLength = group.length,
+ data = value.call(parent, parent && parent.__data__, j, parents),
+ dataLength = data.length,
+ enterGroup = enter[j] = new Array(dataLength),
+ updateGroup = update[j] = new Array(dataLength),
+ exitGroup = exit[j] = new Array(groupLength);
+
+ bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
+
+ // Now connect the enter nodes to their following update node, such that
+ // appendChild can insert the materialized enter node before this node,
+ // rather than at the end of the parent node.
+ for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+ if (previous = enterGroup[i0]) {
+ if (i0 >= i1) i1 = i0 + 1;
+ while (!(next = updateGroup[i1]) && ++i1 < dataLength);
+ previous._next = next || null;
+ }
+ }
+ }
+
+ update = new Selection(update, parents);
+ update._enter = enter;
+ update._exit = exit;
+ return update;
+ }
+
+ function selection_exit() {
+ return new Selection(this._exit || this._groups.map(sparse), this._parents);
+ }
+
+ function selection_join(onenter, onupdate, onexit) {
+ var enter = this.enter(), update = this, exit = this.exit();
+ enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
+ if (onupdate != null) update = onupdate(update);
+ if (onexit == null) exit.remove(); else onexit(exit);
+ return enter && update ? enter.merge(update).order() : update;
+ }
+
+ function selection_merge(selection) {
+
+ for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+ for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group0[i] || group1[i]) {
+ merge[i] = node;
+ }
+ }
+ }
+
+ for (; j < m0; ++j) {
+ merges[j] = groups0[j];
+ }
+
+ return new Selection(merges, this._parents);
+ }
+
+ function selection_order() {
+
+ for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
+ for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+ if (node = group[i]) {
+ if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+
+ return this;
+ }
+
+ function selection_sort(compare) {
+ if (!compare) compare = ascending;
+
+ function compareNode(a, b) {
+ return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+ }
+
+ for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ sortgroup[i] = node;
+ }
+ }
+ sortgroup.sort(compareNode);
+ }
+
+ return new Selection(sortgroups, this._parents).order();
+ }
+
+ function ascending(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+
+ function selection_call() {
+ var callback = arguments[0];
+ arguments[0] = this;
+ callback.apply(null, arguments);
+ return this;
+ }
+
+ function selection_nodes() {
+ var nodes = new Array(this.size()), i = -1;
+ this.each(function() { nodes[++i] = this; });
+ return nodes;
+ }
+
+ function selection_node() {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+
+ return null;
+ }
+
+ function selection_size() {
+ var size = 0;
+ this.each(function() { ++size; });
+ return size;
+ }
+
+ function selection_empty() {
+ return !this.node();
+ }
+
+ function selection_each(callback) {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+ if (node = group[i]) callback.call(node, node.__data__, i, group);
+ }
+ }
+
+ return this;
+ }
+
+ function attrRemove(name) {
+ return function() {
+ this.removeAttribute(name);
+ };
+ }
+
+ function attrRemoveNS(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+ }
+
+ function attrConstant(name, value) {
+ return function() {
+ this.setAttribute(name, value);
+ };
+ }
+
+ function attrConstantNS(fullname, value) {
+ return function() {
+ this.setAttributeNS(fullname.space, fullname.local, value);
+ };
+ }
+
+ function attrFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttribute(name);
+ else this.setAttribute(name, v);
+ };
+ }
+
+ function attrFunctionNS(fullname, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
+ else this.setAttributeNS(fullname.space, fullname.local, v);
+ };
+ }
+
+ function selection_attr(name, value) {
+ var fullname = namespace(name);
+
+ if (arguments.length < 2) {
+ var node = this.node();
+ return fullname.local
+ ? node.getAttributeNS(fullname.space, fullname.local)
+ : node.getAttribute(fullname);
+ }
+
+ return this.each((value == null
+ ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
+ ? (fullname.local ? attrFunctionNS : attrFunction)
+ : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
+ }
+
+ function defaultView(node) {
+ return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
+ || (node.document && node) // node is a Window
+ || node.defaultView; // node is a Document
+ }
+
+ function styleRemove(name) {
+ return function() {
+ this.style.removeProperty(name);
+ };
+ }
+
+ function styleConstant(name, value, priority) {
+ return function() {
+ this.style.setProperty(name, value, priority);
+ };
+ }
+
+ function styleFunction(name, value, priority) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.style.removeProperty(name);
+ else this.style.setProperty(name, v, priority);
+ };
+ }
+
+ function selection_style(name, value, priority) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? styleRemove : typeof value === "function"
+ ? styleFunction
+ : styleConstant)(name, value, priority == null ? "" : priority))
+ : styleValue(this.node(), name);
+ }
+
+ function styleValue(node, name) {
+ return node.style.getPropertyValue(name)
+ || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
+ }
+
+ function propertyRemove(name) {
+ return function() {
+ delete this[name];
+ };
+ }
+
+ function propertyConstant(name, value) {
+ return function() {
+ this[name] = value;
+ };
+ }
+
+ function propertyFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) delete this[name];
+ else this[name] = v;
+ };
+ }
+
+ function selection_property(name, value) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? propertyRemove : typeof value === "function"
+ ? propertyFunction
+ : propertyConstant)(name, value))
+ : this.node()[name];
+ }
+
+ function classArray(string) {
+ return string.trim().split(/^|\s+/);
+ }
+
+ function classList(node) {
+ return node.classList || new ClassList(node);
+ }
+
+ function ClassList(node) {
+ this._node = node;
+ this._names = classArray(node.getAttribute("class") || "");
+ }
+
+ ClassList.prototype = {
+ add: function(name) {
+ var i = this._names.indexOf(name);
+ if (i < 0) {
+ this._names.push(name);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ remove: function(name) {
+ var i = this._names.indexOf(name);
+ if (i >= 0) {
+ this._names.splice(i, 1);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ contains: function(name) {
+ return this._names.indexOf(name) >= 0;
+ }
+ };
+
+ function classedAdd(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.add(names[i]);
+ }
+
+ function classedRemove(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.remove(names[i]);
+ }
+
+ function classedTrue(names) {
+ return function() {
+ classedAdd(this, names);
+ };
+ }
+
+ function classedFalse(names) {
+ return function() {
+ classedRemove(this, names);
+ };
+ }
+
+ function classedFunction(names, value) {
+ return function() {
+ (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+ };
+ }
+
+ function selection_classed(name, value) {
+ var names = classArray(name + "");
+
+ if (arguments.length < 2) {
+ var list = classList(this.node()), i = -1, n = names.length;
+ while (++i < n) if (!list.contains(names[i])) return false;
+ return true;
+ }
+
+ return this.each((typeof value === "function"
+ ? classedFunction : value
+ ? classedTrue
+ : classedFalse)(names, value));
+ }
+
+ function textRemove() {
+ this.textContent = "";
+ }
+
+ function textConstant(value) {
+ return function() {
+ this.textContent = value;
+ };
+ }
+
+ function textFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ };
+ }
+
+ function selection_text(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? textRemove : (typeof value === "function"
+ ? textFunction
+ : textConstant)(value))
+ : this.node().textContent;
+ }
+
+ function htmlRemove() {
+ this.innerHTML = "";
+ }
+
+ function htmlConstant(value) {
+ return function() {
+ this.innerHTML = value;
+ };
+ }
+
+ function htmlFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ };
+ }
+
+ function selection_html(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? htmlRemove : (typeof value === "function"
+ ? htmlFunction
+ : htmlConstant)(value))
+ : this.node().innerHTML;
+ }
+
+ function raise() {
+ if (this.nextSibling) this.parentNode.appendChild(this);
+ }
+
+ function selection_raise() {
+ return this.each(raise);
+ }
+
+ function lower() {
+ if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+ }
+
+ function selection_lower() {
+ return this.each(lower);
+ }
+
+ function selection_append(name) {
+ var create = typeof name === "function" ? name : creator(name);
+ return this.select(function() {
+ return this.appendChild(create.apply(this, arguments));
+ });
+ }
+
+ function constantNull() {
+ return null;
+ }
+
+ function selection_insert(name, before) {
+ var create = typeof name === "function" ? name : creator(name),
+ select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
+ return this.select(function() {
+ return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
+ });
+ }
+
+ function remove() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+ }
+
+ function selection_remove() {
+ return this.each(remove);
+ }
+
+ function selection_cloneShallow() {
+ return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
+ }
+
+ function selection_cloneDeep() {
+ return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
+ }
+
+ function selection_clone(deep) {
+ return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+ }
+
+ function selection_datum(value) {
+ return arguments.length
+ ? this.property("__data__", value)
+ : this.node().__data__;
+ }
+
+ var filterEvents = {};
+
+ var event = null;
+
+ if (typeof document !== "undefined") {
+ var element = document.documentElement;
+ if (!("onmouseenter" in element)) {
+ filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
+ }
+ }
+
+ function filterContextListener(listener, index, group) {
+ listener = contextListener(listener, index, group);
+ return function(event) {
+ var related = event.relatedTarget;
+ if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
+ listener.call(this, event);
+ }
+ };
+ }
+
+ function contextListener(listener, index, group) {
+ return function(event1) {
+ var event0 = event; // Events can be reentrant (e.g., focus).
+ event = event1;
+ try {
+ listener.call(this, this.__data__, index, group);
+ } finally {
+ event = event0;
+ }
+ };
+ }
+
+ function parseTypenames$1(typenames) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name = "", i = t.indexOf(".");
+ if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+ return {type: t, name: name};
+ });
+ }
+
+ function onRemove(typename) {
+ return function() {
+ var on = this.__on;
+ if (!on) return;
+ for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+ if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.capture);
+ } else {
+ on[++i] = o;
+ }
+ }
+ if (++i) on.length = i;
+ else delete this.__on;
+ };
+ }
+
+ function onAdd(typename, value, capture) {
+ var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
+ return function(d, i, group) {
+ var on = this.__on, o, listener = wrap(value, i, group);
+ if (on) for (var j = 0, m = on.length; j < m; ++j) {
+ if ((o = on[j]).type === typename.type && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.capture);
+ this.addEventListener(o.type, o.listener = listener, o.capture = capture);
+ o.value = value;
+ return;
+ }
+ }
+ this.addEventListener(typename.type, listener, capture);
+ o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
+ if (!on) this.__on = [o];
+ else on.push(o);
+ };
+ }
+
+ function selection_on(typename, value, capture) {
+ var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
+
+ if (arguments.length < 2) {
+ var on = this.node().__on;
+ if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+ for (i = 0, o = on[j]; i < n; ++i) {
+ if ((t = typenames[i]).type === o.type && t.name === o.name) {
+ return o.value;
+ }
+ }
+ }
+ return;
+ }
+
+ on = value ? onAdd : onRemove;
+ if (capture == null) capture = false;
+ for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
+ return this;
+ }
+
+ function customEvent(event1, listener, that, args) {
+ var event0 = event;
+ event1.sourceEvent = event;
+ event = event1;
+ try {
+ return listener.apply(that, args);
+ } finally {
+ event = event0;
+ }
+ }
+
+ function dispatchEvent(node, type, params) {
+ var window = defaultView(node),
+ event = window.CustomEvent;
+
+ if (typeof event === "function") {
+ event = new event(type, params);
+ } else {
+ event = window.document.createEvent("Event");
+ if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
+ else event.initEvent(type, false, false);
+ }
+
+ node.dispatchEvent(event);
+ }
+
+ function dispatchConstant(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params);
+ };
+ }
+
+ function dispatchFunction(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params.apply(this, arguments));
+ };
+ }
+
+ function selection_dispatch(type, params) {
+ return this.each((typeof params === "function"
+ ? dispatchFunction
+ : dispatchConstant)(type, params));
+ }
+
+ var root = [null];
+
+ function Selection(groups, parents) {
+ this._groups = groups;
+ this._parents = parents;
+ }
+
+ function selection() {
+ return new Selection([[document.documentElement]], root);
+ }
+
+ Selection.prototype = selection.prototype = {
+ constructor: Selection,
+ select: selection_select,
+ selectAll: selection_selectAll,
+ filter: selection_filter,
+ data: selection_data,
+ enter: selection_enter,
+ exit: selection_exit,
+ join: selection_join,
+ merge: selection_merge,
+ order: selection_order,
+ sort: selection_sort,
+ call: selection_call,
+ nodes: selection_nodes,
+ node: selection_node,
+ size: selection_size,
+ empty: selection_empty,
+ each: selection_each,
+ attr: selection_attr,
+ style: selection_style,
+ property: selection_property,
+ classed: selection_classed,
+ text: selection_text,
+ html: selection_html,
+ raise: selection_raise,
+ lower: selection_lower,
+ append: selection_append,
+ insert: selection_insert,
+ remove: selection_remove,
+ clone: selection_clone,
+ datum: selection_datum,
+ on: selection_on,
+ dispatch: selection_dispatch
+ };
+
+ function select(selector) {
+ return typeof selector === "string"
+ ? new Selection([[document.querySelector(selector)]], [document.documentElement])
+ : new Selection([[selector]], root);
+ }
+
+ function sourceEvent() {
+ var current = event, source;
+ while (source = current.sourceEvent) current = source;
+ return current;
+ }
+
+ function point(node, event) {
+ var svg = node.ownerSVGElement || node;
+
+ if (svg.createSVGPoint) {
+ var point = svg.createSVGPoint();
+ point.x = event.clientX, point.y = event.clientY;
+ point = point.matrixTransform(node.getScreenCTM().inverse());
+ return [point.x, point.y];
+ }
+
+ var rect = node.getBoundingClientRect();
+ return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
+ }
+
+ function mouse(node) {
+ var event = sourceEvent();
+ if (event.changedTouches) event = event.changedTouches[0];
+ return point(node, event);
+ }
+
+ function touch(node, touches, identifier) {
+ if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
+
+ for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
+ if ((touch = touches[i]).identifier === identifier) {
+ return point(node, touch);
+ }
+ }
+
+ return null;
+ }
+
+ function noevent() {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+
+ function dragDisable(view) {
+ var root = view.document.documentElement,
+ selection = select(view).on("dragstart.drag", noevent, true);
+ if ("onselectstart" in root) {
+ selection.on("selectstart.drag", noevent, true);
+ } else {
+ root.__noselect = root.style.MozUserSelect;
+ root.style.MozUserSelect = "none";
+ }
+ }
+
+ function yesdrag(view, noclick) {
+ var root = view.document.documentElement,
+ selection = select(view).on("dragstart.drag", null);
+ if (noclick) {
+ selection.on("click.drag", noevent, true);
+ setTimeout(function() { selection.on("click.drag", null); }, 0);
+ }
+ if ("onselectstart" in root) {
+ selection.on("selectstart.drag", null);
+ } else {
+ root.style.MozUserSelect = root.__noselect;
+ delete root.__noselect;
+ }
+ }
+
+ function define(constructor, factory, prototype) {
+ constructor.prototype = factory.prototype = prototype;
+ prototype.constructor = constructor;
+ }
+
+ function extend(parent, definition) {
+ var prototype = Object.create(parent.prototype);
+ for (var key in definition) prototype[key] = definition[key];
+ return prototype;
+ }
+
+ function Color() {}
+
+ var darker = 0.7;
+ var brighter = 1 / darker;
+
+ var reI = "\\s*([+-]?\\d+)\\s*",
+ reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
+ reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
+ reHex3 = /^#([0-9a-f]{3})$/,
+ reHex6 = /^#([0-9a-f]{6})$/,
+ reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
+ reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
+ reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
+ reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
+ reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
+ reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
+
+ var named = {
+ aliceblue: 0xf0f8ff,
+ antiquewhite: 0xfaebd7,
+ aqua: 0x00ffff,
+ aquamarine: 0x7fffd4,
+ azure: 0xf0ffff,
+ beige: 0xf5f5dc,
+ bisque: 0xffe4c4,
+ black: 0x000000,
+ blanchedalmond: 0xffebcd,
+ blue: 0x0000ff,
+ blueviolet: 0x8a2be2,
+ brown: 0xa52a2a,
+ burlywood: 0xdeb887,
+ cadetblue: 0x5f9ea0,
+ chartreuse: 0x7fff00,
+ chocolate: 0xd2691e,
+ coral: 0xff7f50,
+ cornflowerblue: 0x6495ed,
+ cornsilk: 0xfff8dc,
+ crimson: 0xdc143c,
+ cyan: 0x00ffff,
+ darkblue: 0x00008b,
+ darkcyan: 0x008b8b,
+ darkgoldenrod: 0xb8860b,
+ darkgray: 0xa9a9a9,
+ darkgreen: 0x006400,
+ darkgrey: 0xa9a9a9,
+ darkkhaki: 0xbdb76b,
+ darkmagenta: 0x8b008b,
+ darkolivegreen: 0x556b2f,
+ darkorange: 0xff8c00,
+ darkorchid: 0x9932cc,
+ darkred: 0x8b0000,
+ darksalmon: 0xe9967a,
+ darkseagreen: 0x8fbc8f,
+ darkslateblue: 0x483d8b,
+ darkslategray: 0x2f4f4f,
+ darkslategrey: 0x2f4f4f,
+ darkturquoise: 0x00ced1,
+ darkviolet: 0x9400d3,
+ deeppink: 0xff1493,
+ deepskyblue: 0x00bfff,
+ dimgray: 0x696969,
+ dimgrey: 0x696969,
+ dodgerblue: 0x1e90ff,
+ firebrick: 0xb22222,
+ floralwhite: 0xfffaf0,
+ forestgreen: 0x228b22,
+ fuchsia: 0xff00ff,
+ gainsboro: 0xdcdcdc,
+ ghostwhite: 0xf8f8ff,
+ gold: 0xffd700,
+ goldenrod: 0xdaa520,
+ gray: 0x808080,
+ green: 0x008000,
+ greenyellow: 0xadff2f,
+ grey: 0x808080,
+ honeydew: 0xf0fff0,
+ hotpink: 0xff69b4,
+ indianred: 0xcd5c5c,
+ indigo: 0x4b0082,
+ ivory: 0xfffff0,
+ khaki: 0xf0e68c,
+ lavender: 0xe6e6fa,
+ lavenderblush: 0xfff0f5,
+ lawngreen: 0x7cfc00,
+ lemonchiffon: 0xfffacd,
+ lightblue: 0xadd8e6,
+ lightcoral: 0xf08080,
+ lightcyan: 0xe0ffff,
+ lightgoldenrodyellow: 0xfafad2,
+ lightgray: 0xd3d3d3,
+ lightgreen: 0x90ee90,
+ lightgrey: 0xd3d3d3,
+ lightpink: 0xffb6c1,
+ lightsalmon: 0xffa07a,
+ lightseagreen: 0x20b2aa,
+ lightskyblue: 0x87cefa,
+ lightslategray: 0x778899,
+ lightslategrey: 0x778899,
+ lightsteelblue: 0xb0c4de,
+ lightyellow: 0xffffe0,
+ lime: 0x00ff00,
+ limegreen: 0x32cd32,
+ linen: 0xfaf0e6,
+ magenta: 0xff00ff,
+ maroon: 0x800000,
+ mediumaquamarine: 0x66cdaa,
+ mediumblue: 0x0000cd,
+ mediumorchid: 0xba55d3,
+ mediumpurple: 0x9370db,
+ mediumseagreen: 0x3cb371,
+ mediumslateblue: 0x7b68ee,
+ mediumspringgreen: 0x00fa9a,
+ mediumturquoise: 0x48d1cc,
+ mediumvioletred: 0xc71585,
+ midnightblue: 0x191970,
+ mintcream: 0xf5fffa,
+ mistyrose: 0xffe4e1,
+ moccasin: 0xffe4b5,
+ navajowhite: 0xffdead,
+ navy: 0x000080,
+ oldlace: 0xfdf5e6,
+ olive: 0x808000,
+ olivedrab: 0x6b8e23,
+ orange: 0xffa500,
+ orangered: 0xff4500,
+ orchid: 0xda70d6,
+ palegoldenrod: 0xeee8aa,
+ palegreen: 0x98fb98,
+ paleturquoise: 0xafeeee,
+ palevioletred: 0xdb7093,
+ papayawhip: 0xffefd5,
+ peachpuff: 0xffdab9,
+ peru: 0xcd853f,
+ pink: 0xffc0cb,
+ plum: 0xdda0dd,
+ powderblue: 0xb0e0e6,
+ purple: 0x800080,
+ rebeccapurple: 0x663399,
+ red: 0xff0000,
+ rosybrown: 0xbc8f8f,
+ royalblue: 0x4169e1,
+ saddlebrown: 0x8b4513,
+ salmon: 0xfa8072,
+ sandybrown: 0xf4a460,
+ seagreen: 0x2e8b57,
+ seashell: 0xfff5ee,
+ sienna: 0xa0522d,
+ silver: 0xc0c0c0,
+ skyblue: 0x87ceeb,
+ slateblue: 0x6a5acd,
+ slategray: 0x708090,
+ slategrey: 0x708090,
+ snow: 0xfffafa,
+ springgreen: 0x00ff7f,
+ steelblue: 0x4682b4,
+ tan: 0xd2b48c,
+ teal: 0x008080,
+ thistle: 0xd8bfd8,
+ tomato: 0xff6347,
+ turquoise: 0x40e0d0,
+ violet: 0xee82ee,
+ wheat: 0xf5deb3,
+ white: 0xffffff,
+ whitesmoke: 0xf5f5f5,
+ yellow: 0xffff00,
+ yellowgreen: 0x9acd32
+ };
+
+ define(Color, color, {
+ displayable: function() {
+ return this.rgb().displayable();
+ },
+ hex: function() {
+ return this.rgb().hex();
+ },
+ toString: function() {
+ return this.rgb() + "";
+ }
+ });
+
+ function color(format) {
+ var m;
+ format = (format + "").trim().toLowerCase();
+ return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
+ : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
+ : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
+ : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
+ : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
+ : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
+ : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
+ : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
+ : named.hasOwnProperty(format) ? rgbn(named[format])
+ : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
+ : null;
+ }
+
+ function rgbn(n) {
+ return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
+ }
+
+ function rgba(r, g, b, a) {
+ if (a <= 0) r = g = b = NaN;
+ return new Rgb(r, g, b, a);
+ }
+
+ function rgbConvert(o) {
+ if (!(o instanceof Color)) o = color(o);
+ if (!o) return new Rgb;
+ o = o.rgb();
+ return new Rgb(o.r, o.g, o.b, o.opacity);
+ }
+
+ function rgb(r, g, b, opacity) {
+ return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
+ }
+
+ function Rgb(r, g, b, opacity) {
+ this.r = +r;
+ this.g = +g;
+ this.b = +b;
+ this.opacity = +opacity;
+ }
+
+ define(Rgb, rgb, extend(Color, {
+ brighter: function(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ darker: function(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ rgb: function() {
+ return this;
+ },
+ displayable: function() {
+ return (-0.5 <= this.r && this.r < 255.5)
+ && (-0.5 <= this.g && this.g < 255.5)
+ && (-0.5 <= this.b && this.b < 255.5)
+ && (0 <= this.opacity && this.opacity <= 1);
+ },
+ hex: function() {
+ return "#" + hex(this.r) + hex(this.g) + hex(this.b);
+ },
+ toString: function() {
+ var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
+ return (a === 1 ? "rgb(" : "rgba(")
+ + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
+ + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
+ + Math.max(0, Math.min(255, Math.round(this.b) || 0))
+ + (a === 1 ? ")" : ", " + a + ")");
+ }
+ }));
+
+ function hex(value) {
+ value = Math.max(0, Math.min(255, Math.round(value) || 0));
+ return (value < 16 ? "0" : "") + value.toString(16);
+ }
+
+ function hsla(h, s, l, a) {
+ if (a <= 0) h = s = l = NaN;
+ else if (l <= 0 || l >= 1) h = s = NaN;
+ else if (s <= 0) h = NaN;
+ return new Hsl(h, s, l, a);
+ }
+
+ function hslConvert(o) {
+ if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
+ if (!(o instanceof Color)) o = color(o);
+ if (!o) return new Hsl;
+ if (o instanceof Hsl) return o;
+ o = o.rgb();
+ var r = o.r / 255,
+ g = o.g / 255,
+ b = o.b / 255,
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ h = NaN,
+ s = max - min,
+ l = (max + min) / 2;
+ if (s) {
+ if (r === max) h = (g - b) / s + (g < b) * 6;
+ else if (g === max) h = (b - r) / s + 2;
+ else h = (r - g) / s + 4;
+ s /= l < 0.5 ? max + min : 2 - max - min;
+ h *= 60;
+ } else {
+ s = l > 0 && l < 1 ? 0 : h;
+ }
+ return new Hsl(h, s, l, o.opacity);
+ }
+
+ function hsl(h, s, l, opacity) {
+ return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
+ }
+
+ function Hsl(h, s, l, opacity) {
+ this.h = +h;
+ this.s = +s;
+ this.l = +l;
+ this.opacity = +opacity;
+ }
+
+ define(Hsl, hsl, extend(Color, {
+ brighter: function(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker: function(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb: function() {
+ var h = this.h % 360 + (this.h < 0) * 360,
+ s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
+ l = this.l,
+ m2 = l + (l < 0.5 ? l : 1 - l) * s,
+ m1 = 2 * l - m2;
+ return new Rgb(
+ hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
+ hsl2rgb(h, m1, m2),
+ hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
+ this.opacity
+ );
+ },
+ displayable: function() {
+ return (0 <= this.s && this.s <= 1 || isNaN(this.s))
+ && (0 <= this.l && this.l <= 1)
+ && (0 <= this.opacity && this.opacity <= 1);
+ }
+ }));
+
+ /* From FvD 13.37, CSS Color Module Level 3 */
+ function hsl2rgb(h, m1, m2) {
+ return (h < 60 ? m1 + (m2 - m1) * h / 60
+ : h < 180 ? m2
+ : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
+ : m1) * 255;
+ }
+
+ var deg2rad = Math.PI / 180;
+ var rad2deg = 180 / Math.PI;
+
+ // https://observablehq.com/@mbostock/lab-and-rgb
+ var K = 18,
+ Xn = 0.96422,
+ Yn = 1,
+ Zn = 0.82521,
+ t0 = 4 / 29,
+ t1 = 6 / 29,
+ t2 = 3 * t1 * t1,
+ t3 = t1 * t1 * t1;
+
+ function labConvert(o) {
+ if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
+ if (o instanceof Hcl) return hcl2lab(o);
+ if (!(o instanceof Rgb)) o = rgbConvert(o);
+ var r = rgb2lrgb(o.r),
+ g = rgb2lrgb(o.g),
+ b = rgb2lrgb(o.b),
+ y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
+ if (r === g && g === b) x = z = y; else {
+ x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
+ z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
+ }
+ return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
+ }
+
+ function lab(l, a, b, opacity) {
+ return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
+ }
+
+ function Lab(l, a, b, opacity) {
+ this.l = +l;
+ this.a = +a;
+ this.b = +b;
+ this.opacity = +opacity;
+ }
+
+ define(Lab, lab, extend(Color, {
+ brighter: function(k) {
+ return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
+ },
+ darker: function(k) {
+ return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
+ },
+ rgb: function() {
+ var y = (this.l + 16) / 116,
+ x = isNaN(this.a) ? y : y + this.a / 500,
+ z = isNaN(this.b) ? y : y - this.b / 200;
+ x = Xn * lab2xyz(x);
+ y = Yn * lab2xyz(y);
+ z = Zn * lab2xyz(z);
+ return new Rgb(
+ lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
+ lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
+ lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
+ this.opacity
+ );
+ }
+ }));
+
+ function xyz2lab(t) {
+ return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
+ }
+
+ function lab2xyz(t) {
+ return t > t1 ? t * t * t : t2 * (t - t0);
+ }
+
+ function lrgb2rgb(x) {
+ return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
+ }
+
+ function rgb2lrgb(x) {
+ return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
+ }
+
+ function hclConvert(o) {
+ if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
+ if (!(o instanceof Lab)) o = labConvert(o);
+ if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);
+ var h = Math.atan2(o.b, o.a) * rad2deg;
+ return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
+ }
+
+ function hcl(h, c, l, opacity) {
+ return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
+ }
+
+ function Hcl(h, c, l, opacity) {
+ this.h = +h;
+ this.c = +c;
+ this.l = +l;
+ this.opacity = +opacity;
+ }
+
+ function hcl2lab(o) {
+ if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
+ var h = o.h * deg2rad;
+ return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
+ }
+
+ define(Hcl, hcl, extend(Color, {
+ brighter: function(k) {
+ return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
+ },
+ darker: function(k) {
+ return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
+ },
+ rgb: function() {
+ return hcl2lab(this).rgb();
+ }
+ }));
+
+ var A = -0.14861,
+ B = +1.78277,
+ C = -0.29227,
+ D = -0.90649,
+ E = +1.97294,
+ ED = E * D,
+ EB = E * B,
+ BC_DA = B * C - D * A;
+
+ function cubehelixConvert(o) {
+ if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
+ if (!(o instanceof Rgb)) o = rgbConvert(o);
+ var r = o.r / 255,
+ g = o.g / 255,
+ b = o.b / 255,
+ l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
+ bl = b - l,
+ k = (E * (g - l) - C * bl) / D,
+ s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
+ h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
+ return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
+ }
+
+ function cubehelix(h, s, l, opacity) {
+ return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
+ }
+
+ function Cubehelix(h, s, l, opacity) {
+ this.h = +h;
+ this.s = +s;
+ this.l = +l;
+ this.opacity = +opacity;
+ }
+
+ define(Cubehelix, cubehelix, extend(Color, {
+ brighter: function(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker: function(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb: function() {
+ var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
+ l = +this.l,
+ a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
+ cosh = Math.cos(h),
+ sinh = Math.sin(h);
+ return new Rgb(
+ 255 * (l + a * (A * cosh + B * sinh)),
+ 255 * (l + a * (C * cosh + D * sinh)),
+ 255 * (l + a * (E * cosh)),
+ this.opacity
+ );
+ }
+ }));
+
+ function constant$1(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ function linear(a, d) {
+ return function(t) {
+ return a + t * d;
+ };
+ }
+
+ function exponential(a, b, y) {
+ return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
+ return Math.pow(a + t * b, y);
+ };
+ }
+
+ function gamma(y) {
+ return (y = +y) === 1 ? nogamma : function(a, b) {
+ return b - a ? exponential(a, b, y) : constant$1(isNaN(a) ? b : a);
+ };
+ }
+
+ function nogamma(a, b) {
+ var d = b - a;
+ return d ? linear(a, d) : constant$1(isNaN(a) ? b : a);
+ }
+
+ var interpolateRgb = (function rgbGamma(y) {
+ var color = gamma(y);
+
+ function rgb$1(start, end) {
+ var r = color((start = rgb(start)).r, (end = rgb(end)).r),
+ g = color(start.g, end.g),
+ b = color(start.b, end.b),
+ opacity = nogamma(start.opacity, end.opacity);
+ return function(t) {
+ start.r = r(t);
+ start.g = g(t);
+ start.b = b(t);
+ start.opacity = opacity(t);
+ return start + "";
+ };
+ }
+
+ rgb$1.gamma = rgbGamma;
+
+ return rgb$1;
+ })(1);
+
+ function interpolateNumber(a, b) {
+ return a = +a, b -= a, function(t) {
+ return a + b * t;
+ };
+ }
+
+ var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
+ reB = new RegExp(reA.source, "g");
+
+ function zero(b) {
+ return function() {
+ return b;
+ };
+ }
+
+ function one(b) {
+ return function(t) {
+ return b(t) + "";
+ };
+ }
+
+ function interpolateString(a, b) {
+ var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
+ am, // current match in a
+ bm, // current match in b
+ bs, // string preceding current number in b, if any
+ i = -1, // index in s
+ s = [], // string constants and placeholders
+ q = []; // number interpolators
+
+ // Coerce inputs to strings.
+ a = a + "", b = b + "";
+
+ // Interpolate pairs of numbers in a & b.
+ while ((am = reA.exec(a))
+ && (bm = reB.exec(b))) {
+ if ((bs = bm.index) > bi) { // a string precedes the next number in b
+ bs = b.slice(bi, bs);
+ if (s[i]) s[i] += bs; // coalesce with previous string
+ else s[++i] = bs;
+ }
+ if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
+ if (s[i]) s[i] += bm; // coalesce with previous string
+ else s[++i] = bm;
+ } else { // interpolate non-matching numbers
+ s[++i] = null;
+ q.push({i: i, x: interpolateNumber(am, bm)});
+ }
+ bi = reB.lastIndex;
+ }
+
+ // Add remains of b.
+ if (bi < b.length) {
+ bs = b.slice(bi);
+ if (s[i]) s[i] += bs; // coalesce with previous string
+ else s[++i] = bs;
+ }
+
+ // Special optimization for only a single match.
+ // Otherwise, interpolate each of the numbers and rejoin the string.
+ return s.length < 2 ? (q[0]
+ ? one(q[0].x)
+ : zero(b))
+ : (b = q.length, function(t) {
+ for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ });
+ }
+
+ var degrees = 180 / Math.PI;
+
+ var identity = {
+ translateX: 0,
+ translateY: 0,
+ rotate: 0,
+ skewX: 0,
+ scaleX: 1,
+ scaleY: 1
+ };
+
+ function decompose(a, b, c, d, e, f) {
+ var scaleX, scaleY, skewX;
+ if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
+ if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
+ if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
+ if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
+ return {
+ translateX: e,
+ translateY: f,
+ rotate: Math.atan2(b, a) * degrees,
+ skewX: Math.atan(skewX) * degrees,
+ scaleX: scaleX,
+ scaleY: scaleY
+ };
+ }
+
+ var cssNode,
+ cssRoot,
+ cssView,
+ svgNode;
+
+ function parseCss(value) {
+ if (value === "none") return identity;
+ if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
+ cssNode.style.transform = value;
+ value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
+ cssRoot.removeChild(cssNode);
+ value = value.slice(7, -1).split(",");
+ return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
+ }
+
+ function parseSvg(value) {
+ if (value == null) return identity;
+ if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+ svgNode.setAttribute("transform", value);
+ if (!(value = svgNode.transform.baseVal.consolidate())) return identity;
+ value = value.matrix;
+ return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
+ }
+
+ function interpolateTransform(parse, pxComma, pxParen, degParen) {
+
+ function pop(s) {
+ return s.length ? s.pop() + " " : "";
+ }
+
+ function translate(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push("translate(", null, pxComma, null, pxParen);
+ q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
+ } else if (xb || yb) {
+ s.push("translate(" + xb + pxComma + yb + pxParen);
+ }
+ }
+
+ function rotate(a, b, s, q) {
+ if (a !== b) {
+ if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
+ q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
+ } else if (b) {
+ s.push(pop(s) + "rotate(" + b + degParen);
+ }
+ }
+
+ function skewX(a, b, s, q) {
+ if (a !== b) {
+ q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
+ } else if (b) {
+ s.push(pop(s) + "skewX(" + b + degParen);
+ }
+ }
+
+ function scale(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push(pop(s) + "scale(", null, ",", null, ")");
+ q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
+ } else if (xb !== 1 || yb !== 1) {
+ s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+ }
+ }
+
+ return function(a, b) {
+ var s = [], // string constants and placeholders
+ q = []; // number interpolators
+ a = parse(a), b = parse(b);
+ translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
+ rotate(a.rotate, b.rotate, s, q);
+ skewX(a.skewX, b.skewX, s, q);
+ scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
+ a = b = null; // gc
+ return function(t) {
+ var i = -1, n = q.length, o;
+ while (++i < n) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+ };
+ }
+
+ var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
+ var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
+
+ var rho = Math.SQRT2,
+ rho2 = 2,
+ rho4 = 4,
+ epsilon2 = 1e-12;
+
+ function cosh(x) {
+ return ((x = Math.exp(x)) + 1 / x) / 2;
+ }
+
+ function sinh(x) {
+ return ((x = Math.exp(x)) - 1 / x) / 2;
+ }
+
+ function tanh(x) {
+ return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+ }
+
+ // p0 = [ux0, uy0, w0]
+ // p1 = [ux1, uy1, w1]
+ function interpolateZoom(p0, p1) {
+ var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
+ ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
+ dx = ux1 - ux0,
+ dy = uy1 - uy0,
+ d2 = dx * dx + dy * dy,
+ i,
+ S;
+
+ // Special case for u0 ≅ u1.
+ if (d2 < epsilon2) {
+ S = Math.log(w1 / w0) / rho;
+ i = function(t) {
+ return [
+ ux0 + t * dx,
+ uy0 + t * dy,
+ w0 * Math.exp(rho * t * S)
+ ];
+ };
+ }
+
+ // General case.
+ else {
+ var d1 = Math.sqrt(d2),
+ b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
+ b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
+ r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
+ r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
+ S = (r1 - r0) / rho;
+ i = function(t) {
+ var s = t * S,
+ coshr0 = cosh(r0),
+ u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
+ return [
+ ux0 + u * dx,
+ uy0 + u * dy,
+ w0 * coshr0 / cosh(rho * s + r0)
+ ];
+ };
+ }
+
+ i.duration = S * 1000;
+
+ return i;
+ }
+
+ var frame = 0, // is an animation frame pending?
+ timeout = 0, // is a timeout pending?
+ interval = 0, // are any timers active?
+ pokeDelay = 1000, // how frequently we check for clock skew
+ taskHead,
+ taskTail,
+ clockLast = 0,
+ clockNow = 0,
+ clockSkew = 0,
+ clock = typeof performance === "object" && performance.now ? performance : Date,
+ setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
+
+ function now() {
+ return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
+ }
+
+ function clearNow() {
+ clockNow = 0;
+ }
+
+ function Timer() {
+ this._call =
+ this._time =
+ this._next = null;
+ }
+
+ Timer.prototype = timer.prototype = {
+ constructor: Timer,
+ restart: function(callback, delay, time) {
+ if (typeof callback !== "function") throw new TypeError("callback is not a function");
+ time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
+ if (!this._next && taskTail !== this) {
+ if (taskTail) taskTail._next = this;
+ else taskHead = this;
+ taskTail = this;
+ }
+ this._call = callback;
+ this._time = time;
+ sleep();
+ },
+ stop: function() {
+ if (this._call) {
+ this._call = null;
+ this._time = Infinity;
+ sleep();
+ }
+ }
+ };
+
+ function timer(callback, delay, time) {
+ var t = new Timer;
+ t.restart(callback, delay, time);
+ return t;
+ }
+
+ function timerFlush() {
+ now(); // Get the current time, if not already set.
+ ++frame; // Pretend we’ve set an alarm, if we haven’t already.
+ var t = taskHead, e;
+ while (t) {
+ if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
+ t = t._next;
+ }
+ --frame;
+ }
+
+ function wake() {
+ clockNow = (clockLast = clock.now()) + clockSkew;
+ frame = timeout = 0;
+ try {
+ timerFlush();
+ } finally {
+ frame = 0;
+ nap();
+ clockNow = 0;
+ }
+ }
+
+ function poke() {
+ var now = clock.now(), delay = now - clockLast;
+ if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
+ }
+
+ function nap() {
+ var t0, t1 = taskHead, t2, time = Infinity;
+ while (t1) {
+ if (t1._call) {
+ if (time > t1._time) time = t1._time;
+ t0 = t1, t1 = t1._next;
+ } else {
+ t2 = t1._next, t1._next = null;
+ t1 = t0 ? t0._next = t2 : taskHead = t2;
+ }
+ }
+ taskTail = t0;
+ sleep(time);
+ }
+
+ function sleep(time) {
+ if (frame) return; // Soonest alarm already set, or will be.
+ if (timeout) timeout = clearTimeout(timeout);
+ var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
+ if (delay > 24) {
+ if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
+ if (interval) interval = clearInterval(interval);
+ } else {
+ if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
+ frame = 1, setFrame(wake);
+ }
+ }
+
+ function timeout$1(callback, delay, time) {
+ var t = new Timer;
+ delay = delay == null ? 0 : +delay;
+ t.restart(function(elapsed) {
+ t.stop();
+ callback(elapsed + delay);
+ }, delay, time);
+ return t;
+ }
+
+ var emptyOn = dispatch("start", "end", "cancel", "interrupt");
+ var emptyTween = [];
+
+ var CREATED = 0;
+ var SCHEDULED = 1;
+ var STARTING = 2;
+ var STARTED = 3;
+ var RUNNING = 4;
+ var ENDING = 5;
+ var ENDED = 6;
+
+ function schedule(node, name, id, index, group, timing) {
+ var schedules = node.__transition;
+ if (!schedules) node.__transition = {};
+ else if (id in schedules) return;
+ create(node, id, {
+ name: name,
+ index: index, // For context during callback.
+ group: group, // For context during callback.
+ on: emptyOn,
+ tween: emptyTween,
+ time: timing.time,
+ delay: timing.delay,
+ duration: timing.duration,
+ ease: timing.ease,
+ timer: null,
+ state: CREATED
+ });
+ }
+
+ function init(node, id) {
+ var schedule = get$1(node, id);
+ if (schedule.state > CREATED) throw new Error("too late; already scheduled");
+ return schedule;
+ }
+
+ function set$1(node, id) {
+ var schedule = get$1(node, id);
+ if (schedule.state > STARTED) throw new Error("too late; already running");
+ return schedule;
+ }
+
+ function get$1(node, id) {
+ var schedule = node.__transition;
+ if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
+ return schedule;
+ }
+
+ function create(node, id, self) {
+ var schedules = node.__transition,
+ tween;
+
+ // Initialize the self timer when the transition is created.
+ // Note the actual delay is not known until the first callback!
+ schedules[id] = self;
+ self.timer = timer(schedule, 0, self.time);
+
+ function schedule(elapsed) {
+ self.state = SCHEDULED;
+ self.timer.restart(start, self.delay, self.time);
+
+ // If the elapsed delay is less than our first sleep, start immediately.
+ if (self.delay <= elapsed) start(elapsed - self.delay);
+ }
+
+ function start(elapsed) {
+ var i, j, n, o;
+
+ // If the state is not SCHEDULED, then we previously errored on start.
+ if (self.state !== SCHEDULED) return stop();
+
+ for (i in schedules) {
+ o = schedules[i];
+ if (o.name !== self.name) continue;
+
+ // While this element already has a starting transition during this frame,
+ // defer starting an interrupting transition until that transition has a
+ // chance to tick (and possibly end); see d3/d3-transition#54!
+ if (o.state === STARTED) return timeout$1(start);
+
+ // Interrupt the active transition, if any.
+ if (o.state === RUNNING) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("interrupt", node, node.__data__, o.index, o.group);
+ delete schedules[i];
+ }
+
+ // Cancel any pre-empted transitions.
+ else if (+i < id) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("cancel", node, node.__data__, o.index, o.group);
+ delete schedules[i];
+ }
+ }
+
+ // Defer the first tick to end of the current frame; see d3/d3#1576.
+ // Note the transition may be canceled after start and before the first tick!
+ // Note this must be scheduled before the start event; see d3/d3-transition#16!
+ // Assuming this is successful, subsequent callbacks go straight to tick.
+ timeout$1(function() {
+ if (self.state === STARTED) {
+ self.state = RUNNING;
+ self.timer.restart(tick, self.delay, self.time);
+ tick(elapsed);
+ }
+ });
+
+ // Dispatch the start event.
+ // Note this must be done before the tween are initialized.
+ self.state = STARTING;
+ self.on.call("start", node, node.__data__, self.index, self.group);
+ if (self.state !== STARTING) return; // interrupted
+ self.state = STARTED;
+
+ // Initialize the tween, deleting null tween.
+ tween = new Array(n = self.tween.length);
+ for (i = 0, j = -1; i < n; ++i) {
+ if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
+ tween[++j] = o;
+ }
+ }
+ tween.length = j + 1;
+ }
+
+ function tick(elapsed) {
+ var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
+ i = -1,
+ n = tween.length;
+
+ while (++i < n) {
+ tween[i].call(node, t);
+ }
+
+ // Dispatch the end event.
+ if (self.state === ENDING) {
+ self.on.call("end", node, node.__data__, self.index, self.group);
+ stop();
+ }
+ }
+
+ function stop() {
+ self.state = ENDED;
+ self.timer.stop();
+ delete schedules[id];
+ for (var i in schedules) return; // eslint-disable-line no-unused-vars
+ delete node.__transition;
+ }
+ }
+
+ function interrupt(node, name) {
+ var schedules = node.__transition,
+ schedule,
+ active,
+ empty = true,
+ i;
+
+ if (!schedules) return;
+
+ name = name == null ? null : name + "";
+
+ for (i in schedules) {
+ if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
+ active = schedule.state > STARTING && schedule.state < ENDING;
+ schedule.state = ENDED;
+ schedule.timer.stop();
+ schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
+ delete schedules[i];
+ }
+
+ if (empty) delete node.__transition;
+ }
+
+ function selection_interrupt(name) {
+ return this.each(function() {
+ interrupt(this, name);
+ });
+ }
+
+ function tweenRemove(id, name) {
+ var tween0, tween1;
+ return function() {
+ var schedule = set$1(this, id),
+ tween = schedule.tween;
+
+ // If this node shared tween with the previous node,
+ // just assign the updated shared tween and we’re done!
+ // Otherwise, copy-on-write.
+ if (tween !== tween0) {
+ tween1 = tween0 = tween;
+ for (var i = 0, n = tween1.length; i < n; ++i) {
+ if (tween1[i].name === name) {
+ tween1 = tween1.slice();
+ tween1.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ schedule.tween = tween1;
+ };
+ }
+
+ function tweenFunction(id, name, value) {
+ var tween0, tween1;
+ if (typeof value !== "function") throw new Error;
+ return function() {
+ var schedule = set$1(this, id),
+ tween = schedule.tween;
+
+ // If this node shared tween with the previous node,
+ // just assign the updated shared tween and we’re done!
+ // Otherwise, copy-on-write.
+ if (tween !== tween0) {
+ tween1 = (tween0 = tween).slice();
+ for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
+ if (tween1[i].name === name) {
+ tween1[i] = t;
+ break;
+ }
+ }
+ if (i === n) tween1.push(t);
+ }
+
+ schedule.tween = tween1;
+ };
+ }
+
+ function transition_tween(name, value) {
+ var id = this._id;
+
+ name += "";
+
+ if (arguments.length < 2) {
+ var tween = get$1(this.node(), id).tween;
+ for (var i = 0, n = tween.length, t; i < n; ++i) {
+ if ((t = tween[i]).name === name) {
+ return t.value;
+ }
+ }
+ return null;
+ }
+
+ return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
+ }
+
+ function tweenValue(transition, name, value) {
+ var id = transition._id;
+
+ transition.each(function() {
+ var schedule = set$1(this, id);
+ (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
+ });
+
+ return function(node) {
+ return get$1(node, id).value[name];
+ };
+ }
+
+ function interpolate(a, b) {
+ var c;
+ return (typeof b === "number" ? interpolateNumber
+ : b instanceof color ? interpolateRgb
+ : (c = color(b)) ? (b = c, interpolateRgb)
+ : interpolateString)(a, b);
+ }
+
+ function attrRemove$1(name) {
+ return function() {
+ this.removeAttribute(name);
+ };
+ }
+
+ function attrRemoveNS$1(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+ }
+
+ function attrConstant$1(name, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = this.getAttribute(name);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+
+ function attrConstantNS$1(fullname, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = this.getAttributeNS(fullname.space, fullname.local);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+
+ function attrFunction$1(name, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null) return void this.removeAttribute(name);
+ string0 = this.getAttribute(name);
+ string1 = value1 + "";
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+
+ function attrFunctionNS$1(fullname, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
+ string0 = this.getAttributeNS(fullname.space, fullname.local);
+ string1 = value1 + "";
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+
+ function transition_attr(name, value) {
+ var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
+ return this.attrTween(name, typeof value === "function"
+ ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
+ : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
+ : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
+ }
+
+ function attrInterpolate(name, i) {
+ return function(t) {
+ this.setAttribute(name, i(t));
+ };
+ }
+
+ function attrInterpolateNS(fullname, i) {
+ return function(t) {
+ this.setAttributeNS(fullname.space, fullname.local, i(t));
+ };
+ }
+
+ function attrTweenNS(fullname, value) {
+ var t0, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+ }
+
+ function attrTween(name, value) {
+ var t0, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+ }
+
+ function transition_attrTween(name, value) {
+ var key = "attr." + name;
+ if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+ if (value == null) return this.tween(key, null);
+ if (typeof value !== "function") throw new Error;
+ var fullname = namespace(name);
+ return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
+ }
+
+ function delayFunction(id, value) {
+ return function() {
+ init(this, id).delay = +value.apply(this, arguments);
+ };
+ }
+
+ function delayConstant(id, value) {
+ return value = +value, function() {
+ init(this, id).delay = value;
+ };
+ }
+
+ function transition_delay(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each((typeof value === "function"
+ ? delayFunction
+ : delayConstant)(id, value))
+ : get$1(this.node(), id).delay;
+ }
+
+ function durationFunction(id, value) {
+ return function() {
+ set$1(this, id).duration = +value.apply(this, arguments);
+ };
+ }
+
+ function durationConstant(id, value) {
+ return value = +value, function() {
+ set$1(this, id).duration = value;
+ };
+ }
+
+ function transition_duration(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each((typeof value === "function"
+ ? durationFunction
+ : durationConstant)(id, value))
+ : get$1(this.node(), id).duration;
+ }
+
+ function easeConstant(id, value) {
+ if (typeof value !== "function") throw new Error;
+ return function() {
+ set$1(this, id).ease = value;
+ };
+ }
+
+ function transition_ease(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each(easeConstant(id, value))
+ : get$1(this.node(), id).ease;
+ }
+
+ function transition_filter(match) {
+ if (typeof match !== "function") match = matcher(match);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+ if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return new Transition(subgroups, this._parents, this._name, this._id);
+ }
+
+ function transition_merge(transition) {
+ if (transition._id !== this._id) throw new Error;
+
+ for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+ for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group0[i] || group1[i]) {
+ merge[i] = node;
+ }
+ }
+ }
+
+ for (; j < m0; ++j) {
+ merges[j] = groups0[j];
+ }
+
+ return new Transition(merges, this._parents, this._name, this._id);
+ }
+
+ function start(name) {
+ return (name + "").trim().split(/^|\s+/).every(function(t) {
+ var i = t.indexOf(".");
+ if (i >= 0) t = t.slice(0, i);
+ return !t || t === "start";
+ });
+ }
+
+ function onFunction(id, name, listener) {
+ var on0, on1, sit = start(name) ? init : set$1;
+ return function() {
+ var schedule = sit(this, id),
+ on = schedule.on;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
+
+ schedule.on = on1;
+ };
+ }
+
+ function transition_on(name, listener) {
+ var id = this._id;
+
+ return arguments.length < 2
+ ? get$1(this.node(), id).on.on(name)
+ : this.each(onFunction(id, name, listener));
+ }
+
+ function removeFunction(id) {
+ return function() {
+ var parent = this.parentNode;
+ for (var i in this.__transition) if (+i !== id) return;
+ if (parent) parent.removeChild(this);
+ };
+ }
+
+ function transition_remove() {
+ return this.on("end.remove", removeFunction(this._id));
+ }
+
+ function transition_select(select) {
+ var name = this._name,
+ id = this._id;
+
+ if (typeof select !== "function") select = selector(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+ if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ subgroup[i] = subnode;
+ schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
+ }
+ }
+ }
+
+ return new Transition(subgroups, this._parents, name, id);
+ }
+
+ function transition_selectAll(select) {
+ var name = this._name,
+ id = this._id;
+
+ if (typeof select !== "function") select = selectorAll(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
+ if (child = children[k]) {
+ schedule(child, name, id, k, children, inherit);
+ }
+ }
+ subgroups.push(children);
+ parents.push(node);
+ }
+ }
+ }
+
+ return new Transition(subgroups, parents, name, id);
+ }
+
+ var Selection$1 = selection.prototype.constructor;
+
+ function transition_selection() {
+ return new Selection$1(this._groups, this._parents);
+ }
+
+ function styleNull(name, interpolate) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name),
+ string1 = (this.style.removeProperty(name), styleValue(this, name));
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, string10 = string1);
+ };
+ }
+
+ function styleRemove$1(name) {
+ return function() {
+ this.style.removeProperty(name);
+ };
+ }
+
+ function styleConstant$1(name, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+ }
+
+ function styleFunction$1(name, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name),
+ value1 = value(this),
+ string1 = value1 + "";
+ if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+ }
+
+ function styleMaybeRemove(id, name) {
+ var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
+ return function() {
+ var schedule = set$1(this, id),
+ on = schedule.on,
+ listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
+
+ schedule.on = on1;
+ };
+ }
+
+ function transition_style(name, value, priority) {
+ var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
+ return value == null ? this
+ .styleTween(name, styleNull(name, i))
+ .on("end.style." + name, styleRemove$1(name))
+ : typeof value === "function" ? this
+ .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
+ .each(styleMaybeRemove(this._id, name))
+ : this
+ .styleTween(name, styleConstant$1(name, i, value), priority)
+ .on("end.style." + name, null);
+ }
+
+ function styleInterpolate(name, i, priority) {
+ return function(t) {
+ this.style.setProperty(name, i(t), priority);
+ };
+ }
+
+ function styleTween(name, value, priority) {
+ var t, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
+ return t;
+ }
+ tween._value = value;
+ return tween;
+ }
+
+ function transition_styleTween(name, value, priority) {
+ var key = "style." + (name += "");
+ if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+ if (value == null) return this.tween(key, null);
+ if (typeof value !== "function") throw new Error;
+ return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
+ }
+
+ function textConstant$1(value) {
+ return function() {
+ this.textContent = value;
+ };
+ }
+
+ function textFunction$1(value) {
+ return function() {
+ var value1 = value(this);
+ this.textContent = value1 == null ? "" : value1;
+ };
+ }
+
+ function transition_text(value) {
+ return this.tween("text", typeof value === "function"
+ ? textFunction$1(tweenValue(this, "text", value))
+ : textConstant$1(value == null ? "" : value + ""));
+ }
+
+ function transition_transition() {
+ var name = this._name,
+ id0 = this._id,
+ id1 = newId();
+
+ for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ var inherit = get$1(node, id0);
+ schedule(node, name, id1, i, group, {
+ time: inherit.time + inherit.delay + inherit.duration,
+ delay: 0,
+ duration: inherit.duration,
+ ease: inherit.ease
+ });
+ }
+ }
+ }
+
+ return new Transition(groups, this._parents, name, id1);
+ }
+
+ function transition_end() {
+ var on0, on1, that = this, id = that._id, size = that.size();
+ return new Promise(function(resolve, reject) {
+ var cancel = {value: reject},
+ end = {value: function() { if (--size === 0) resolve(); }};
+
+ that.each(function() {
+ var schedule = set$1(this, id),
+ on = schedule.on;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0) {
+ on1 = (on0 = on).copy();
+ on1._.cancel.push(cancel);
+ on1._.interrupt.push(cancel);
+ on1._.end.push(end);
+ }
+
+ schedule.on = on1;
+ });
+ });
+ }
+
+ var id = 0;
+
+ function Transition(groups, parents, name, id) {
+ this._groups = groups;
+ this._parents = parents;
+ this._name = name;
+ this._id = id;
+ }
+
+ function transition(name) {
+ return selection().transition(name);
+ }
+
+ function newId() {
+ return ++id;
+ }
+
+ var selection_prototype = selection.prototype;
+
+ Transition.prototype = transition.prototype = {
+ constructor: Transition,
+ select: transition_select,
+ selectAll: transition_selectAll,
+ filter: transition_filter,
+ merge: transition_merge,
+ selection: transition_selection,
+ transition: transition_transition,
+ call: selection_prototype.call,
+ nodes: selection_prototype.nodes,
+ node: selection_prototype.node,
+ size: selection_prototype.size,
+ empty: selection_prototype.empty,
+ each: selection_prototype.each,
+ on: transition_on,
+ attr: transition_attr,
+ attrTween: transition_attrTween,
+ style: transition_style,
+ styleTween: transition_styleTween,
+ text: transition_text,
+ remove: transition_remove,
+ tween: transition_tween,
+ delay: transition_delay,
+ duration: transition_duration,
+ ease: transition_ease,
+ end: transition_end
+ };
+
+ function cubicInOut(t) {
+ return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
+ }
+
+ var pi = Math.PI;
+
+ var tau = 2 * Math.PI;
+
+ var defaultTiming = {
+ time: null, // Set on use.
+ delay: 0,
+ duration: 250,
+ ease: cubicInOut
+ };
+
+ function inherit(node, id) {
+ var timing;
+ while (!(timing = node.__transition) || !(timing = timing[id])) {
+ if (!(node = node.parentNode)) {
+ return defaultTiming.time = now(), defaultTiming;
+ }
+ }
+ return timing;
+ }
+
+ function selection_transition(name) {
+ var id,
+ timing;
+
+ if (name instanceof Transition) {
+ id = name._id, name = name._name;
+ } else {
+ id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
+ }
+
+ for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ schedule(node, name, id, i, group, timing || inherit(node, id));
+ }
+ }
+ }
+
+ return new Transition(groups, this._parents, name, id);
+ }
+
+ selection.prototype.interrupt = selection_interrupt;
+ selection.prototype.transition = selection_transition;
+
+ function constant$2(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ function ZoomEvent(target, type, transform) {
+ this.target = target;
+ this.type = type;
+ this.transform = transform;
+ }
+
+ function Transform(k, x, y) {
+ this.k = k;
+ this.x = x;
+ this.y = y;
+ }
+
+ Transform.prototype = {
+ constructor: Transform,
+ scale: function(k) {
+ return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
+ },
+ translate: function(x, y) {
+ return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
+ },
+ apply: function(point) {
+ return [point[0] * this.k + this.x, point[1] * this.k + this.y];
+ },
+ applyX: function(x) {
+ return x * this.k + this.x;
+ },
+ applyY: function(y) {
+ return y * this.k + this.y;
+ },
+ invert: function(location) {
+ return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
+ },
+ invertX: function(x) {
+ return (x - this.x) / this.k;
+ },
+ invertY: function(y) {
+ return (y - this.y) / this.k;
+ },
+ rescaleX: function(x) {
+ return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
+ },
+ rescaleY: function(y) {
+ return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
+ },
+ toString: function() {
+ return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
+ }
+ };
+
+ var identity$1 = new Transform(1, 0, 0);
+
+ function nopropagation() {
+ event.stopImmediatePropagation();
+ }
+
+ function noevent$1() {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+
+ // Ignore right-click, since that should open the context menu.
+ function defaultFilter() {
+ return !event.button;
+ }
+
+ function defaultExtent() {
+ var e = this, w, h;
+ if (e instanceof SVGElement) {
+ e = e.ownerSVGElement || e;
+ w = e.width.baseVal.value;
+ h = e.height.baseVal.value;
+ } else {
+ w = e.clientWidth;
+ h = e.clientHeight;
+ }
+ return [[0, 0], [w, h]];
+ }
+
+ function defaultTransform() {
+ return this.__zoom || identity$1;
+ }
+
+ function defaultWheelDelta() {
+ return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
+ }
+
+ function defaultTouchable() {
+ return "ontouchstart" in this;
+ }
+
+ function defaultConstrain(transform, extent, translateExtent) {
+ var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
+ dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
+ dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
+ dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
+ return transform.translate(
+ dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
+ dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
+ );
+ }
+
+ function zoom() {
+ var filter = defaultFilter,
+ extent = defaultExtent,
+ constrain = defaultConstrain,
+ wheelDelta = defaultWheelDelta,
+ touchable = defaultTouchable,
+ scaleExtent = [0, Infinity],
+ translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
+ duration = 250,
+ interpolate = interpolateZoom,
+ gestures = [],
+ listeners = dispatch("start", "zoom", "end"),
+ touchstarting,
+ touchending,
+ touchDelay = 500,
+ wheelDelay = 150,
+ clickDistance2 = 0;
+
+ function zoom(selection) {
+ selection
+ .property("__zoom", defaultTransform)
+ .on("wheel.zoom", wheeled)
+ .on("mousedown.zoom", mousedowned)
+ .on("dblclick.zoom", dblclicked)
+ .filter(touchable)
+ .on("touchstart.zoom", touchstarted)
+ .on("touchmove.zoom", touchmoved)
+ .on("touchend.zoom touchcancel.zoom", touchended)
+ .style("touch-action", "none")
+ .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ }
+
+ zoom.transform = function(collection, transform) {
+ var selection = collection.selection ? collection.selection() : collection;
+ selection.property("__zoom", defaultTransform);
+ if (collection !== selection) {
+ schedule(collection, transform);
+ } else {
+ selection.interrupt().each(function() {
+ gesture(this, arguments)
+ .start()
+ .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
+ .end();
+ });
+ }
+ };
+
+ zoom.scaleBy = function(selection, k) {
+ zoom.scaleTo(selection, function() {
+ var k0 = this.__zoom.k,
+ k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return k0 * k1;
+ });
+ };
+
+ zoom.scaleTo = function(selection, k) {
+ zoom.transform(selection, function() {
+ var e = extent.apply(this, arguments),
+ t0 = this.__zoom,
+ p0 = centroid(e),
+ p1 = t0.invert(p0),
+ k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
+ });
+ };
+
+ zoom.translateBy = function(selection, x, y) {
+ zoom.transform(selection, function() {
+ return constrain(this.__zoom.translate(
+ typeof x === "function" ? x.apply(this, arguments) : x,
+ typeof y === "function" ? y.apply(this, arguments) : y
+ ), extent.apply(this, arguments), translateExtent);
+ });
+ };
+
+ zoom.translateTo = function(selection, x, y) {
+ zoom.transform(selection, function() {
+ var e = extent.apply(this, arguments),
+ t = this.__zoom,
+ p = centroid(e);
+ return constrain(identity$1.translate(p[0], p[1]).scale(t.k).translate(
+ typeof x === "function" ? -x.apply(this, arguments) : -x,
+ typeof y === "function" ? -y.apply(this, arguments) : -y
+ ), e, translateExtent);
+ });
+ };
+
+ function scale(transform, k) {
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+ return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
+ }
+
+ function translate(transform, p0, p1) {
+ var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
+ return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
+ }
+
+ function centroid(extent) {
+ return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
+ }
+
+ function schedule(transition, transform, center) {
+ transition
+ .on("start.zoom", function() { gesture(this, arguments).start(); })
+ .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
+ .tween("zoom", function() {
+ var that = this,
+ args = arguments,
+ g = gesture(that, args),
+ e = extent.apply(that, args),
+ p = center || centroid(e),
+ w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
+ a = that.__zoom,
+ b = typeof transform === "function" ? transform.apply(that, args) : transform,
+ i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+ return function(t) {
+ if (t === 1) t = b; // Avoid rounding error on end.
+ else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
+ g.zoom(null, t);
+ };
+ });
+ }
+
+ function gesture(that, args) {
+ for (var i = 0, n = gestures.length, g; i < n; ++i) {
+ if ((g = gestures[i]).that === that) {
+ return g;
+ }
+ }
+ return new Gesture(that, args);
+ }
+
+ function Gesture(that, args) {
+ this.that = that;
+ this.args = args;
+ this.index = -1;
+ this.active = 0;
+ this.extent = extent.apply(that, args);
+ }
+
+ Gesture.prototype = {
+ start: function() {
+ if (++this.active === 1) {
+ this.index = gestures.push(this) - 1;
+ this.emit("start");
+ }
+ return this;
+ },
+ zoom: function(key, transform) {
+ if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
+ if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
+ if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
+ this.that.__zoom = transform;
+ this.emit("zoom");
+ return this;
+ },
+ end: function() {
+ if (--this.active === 0) {
+ gestures.splice(this.index, 1);
+ this.index = -1;
+ this.emit("end");
+ }
+ return this;
+ },
+ emit: function(type) {
+ customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
+ }
+ };
+
+ function wheeled() {
+ if (!filter.apply(this, arguments)) return;
+ var g = gesture(this, arguments),
+ t = this.__zoom,
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+ p = mouse(this);
+
+ // If the mouse is in the same location as before, reuse it.
+ // If there were recent wheel events, reset the wheel idle timeout.
+ if (g.wheel) {
+ if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+ g.mouse[1] = t.invert(g.mouse[0] = p);
+ }
+ clearTimeout(g.wheel);
+ }
+
+ // If this wheel event won’t trigger a transform change, ignore it.
+ else if (t.k === k) return;
+
+ // Otherwise, capture the mouse point and location at the start.
+ else {
+ g.mouse = [p, t.invert(p)];
+ interrupt(this);
+ g.start();
+ }
+
+ noevent$1();
+ g.wheel = setTimeout(wheelidled, wheelDelay);
+ g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+
+ function wheelidled() {
+ g.wheel = null;
+ g.end();
+ }
+ }
+
+ function mousedowned() {
+ if (touchending || !filter.apply(this, arguments)) return;
+ var g = gesture(this, arguments),
+ v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
+ p = mouse(this),
+ x0 = event.clientX,
+ y0 = event.clientY;
+
+ dragDisable(event.view);
+ nopropagation();
+ g.mouse = [p, this.__zoom.invert(p)];
+ interrupt(this);
+ g.start();
+
+ function mousemoved() {
+ noevent$1();
+ if (!g.moved) {
+ var dx = event.clientX - x0, dy = event.clientY - y0;
+ g.moved = dx * dx + dy * dy > clickDistance2;
+ }
+ g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
+ }
+
+ function mouseupped() {
+ v.on("mousemove.zoom mouseup.zoom", null);
+ yesdrag(event.view, g.moved);
+ noevent$1();
+ g.end();
+ }
+ }
+
+ function dblclicked() {
+ if (!filter.apply(this, arguments)) return;
+ var t0 = this.__zoom,
+ p0 = mouse(this),
+ p1 = t0.invert(p0),
+ k1 = t0.k * (event.shiftKey ? 0.5 : 2),
+ t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
+
+ noevent$1();
+ if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
+ else select(this).call(zoom.transform, t1);
+ }
+
+ function touchstarted() {
+ if (!filter.apply(this, arguments)) return;
+ var g = gesture(this, arguments),
+ touches = event.changedTouches,
+ started,
+ n = touches.length, i, t, p;
+
+ nopropagation();
+ for (i = 0; i < n; ++i) {
+ t = touches[i], p = touch(this, touches, t.identifier);
+ p = [p, this.__zoom.invert(p), t.identifier];
+ if (!g.touch0) g.touch0 = p, started = true;
+ else if (!g.touch1) g.touch1 = p;
+ }
+
+ // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
+ if (touchstarting) {
+ touchstarting = clearTimeout(touchstarting);
+ if (!g.touch1) {
+ g.end();
+ p = select(this).on("dblclick.zoom");
+ if (p) p.apply(this, arguments);
+ return;
+ }
+ }
+
+ if (started) {
+ touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
+ interrupt(this);
+ g.start();
+ }
+ }
+
+ function touchmoved() {
+ var g = gesture(this, arguments),
+ touches = event.changedTouches,
+ n = touches.length, i, t, p, l;
+
+ noevent$1();
+ if (touchstarting) touchstarting = clearTimeout(touchstarting);
+ for (i = 0; i < n; ++i) {
+ t = touches[i], p = touch(this, touches, t.identifier);
+ if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
+ else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
+ }
+ t = g.that.__zoom;
+ if (g.touch1) {
+ var p0 = g.touch0[0], l0 = g.touch0[1],
+ p1 = g.touch1[0], l1 = g.touch1[1],
+ dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
+ dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+ t = scale(t, Math.sqrt(dp / dl));
+ p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+ l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+ }
+ else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
+ else return;
+ g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
+ }
+
+ function touchended() {
+ var g = gesture(this, arguments),
+ touches = event.changedTouches,
+ n = touches.length, i, t;
+
+ nopropagation();
+ if (touchending) clearTimeout(touchending);
+ touchending = setTimeout(function() { touchending = null; }, touchDelay);
+ for (i = 0; i < n; ++i) {
+ t = touches[i];
+ if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
+ else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
+ }
+ if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
+ if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
+ else g.end();
+ }
+
+ zoom.wheelDelta = function(_) {
+ return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$2(+_), zoom) : wheelDelta;
+ };
+
+ zoom.filter = function(_) {
+ return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), zoom) : filter;
+ };
+
+ zoom.touchable = function(_) {
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), zoom) : touchable;
+ };
+
+ zoom.extent = function(_) {
+ return arguments.length ? (extent = typeof _ === "function" ? _ : constant$2([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+ };
+
+ zoom.scaleExtent = function(_) {
+ return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+ };
+
+ zoom.translateExtent = function(_) {
+ return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
+ };
+
+ zoom.constrain = function(_) {
+ return arguments.length ? (constrain = _, zoom) : constrain;
+ };
+
+ zoom.duration = function(_) {
+ return arguments.length ? (duration = +_, zoom) : duration;
+ };
+
+ zoom.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, zoom) : interpolate;
+ };
+
+ zoom.on = function() {
+ var value = listeners.on.apply(listeners, arguments);
+ return value === listeners ? zoom : value;
+ };
+
+ zoom.clickDistance = function(_) {
+ return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
+ };
+
+ return zoom;
+ }
+
+ var collectionUtils = createCommonjsModule(function (module) {
+
+ var utils = module.exports = {};
+
+ /**
+ * Loops through the collection and calls the callback for each element. if the callback returns truthy, the loop is broken and returns the same value.
+ * @public
+ * @param {*} collection The collection to loop through. Needs to have a length property set and have indices set from 0 to length - 1.
+ * @param {function} callback The callback to be called for each element. The element will be given as a parameter to the callback. If this callback returns truthy, the loop is broken and the same value is returned.
+ * @returns {*} The value that a callback has returned (if truthy). Otherwise nothing.
+ */
+ utils.forEach = function(collection, callback) {
+ for(var i = 0; i < collection.length; i++) {
+ var result = callback(collection[i]);
+ if(result) {
+ return result;
+ }
+ }
+ };
+ });
+
+ var elementUtils = function(options) {
+ var getState = options.stateHandler.getState;
+
+ /**
+ * Tells if the element has been made detectable and ready to be listened for resize events.
+ * @public
+ * @param {element} The element to check.
+ * @returns {boolean} True or false depending on if the element is detectable or not.
+ */
+ function isDetectable(element) {
+ var state = getState(element);
+ return state && !!state.isDetectable;
+ }
+
+ /**
+ * Marks the element that it has been made detectable and ready to be listened for resize events.
+ * @public
+ * @param {element} The element to mark.
+ */
+ function markAsDetectable(element) {
+ getState(element).isDetectable = true;
+ }
+
+ /**
+ * Tells if the element is busy or not.
+ * @public
+ * @param {element} The element to check.
+ * @returns {boolean} True or false depending on if the element is busy or not.
+ */
+ function isBusy(element) {
+ return !!getState(element).busy;
+ }
+
+ /**
+ * Marks the object is busy and should not be made detectable.
+ * @public
+ * @param {element} element The element to mark.
+ * @param {boolean} busy If the element is busy or not.
+ */
+ function markBusy(element, busy) {
+ getState(element).busy = !!busy;
+ }
+
+ return {
+ isDetectable: isDetectable,
+ markAsDetectable: markAsDetectable,
+ isBusy: isBusy,
+ markBusy: markBusy
+ };
+ };
+
+ var listenerHandler = function(idHandler) {
+ var eventListeners = {};
+
+ /**
+ * Gets all listeners for the given element.
+ * @public
+ * @param {element} element The element to get all listeners for.
+ * @returns All listeners for the given element.
+ */
+ function getListeners(element) {
+ var id = idHandler.get(element);
+
+ if (id === undefined) {
+ return [];
+ }
+
+ return eventListeners[id] || [];
+ }
+
+ /**
+ * Stores the given listener for the given element. Will not actually add the listener to the element.
+ * @public
+ * @param {element} element The element that should have the listener added.
+ * @param {function} listener The callback that the element has added.
+ */
+ function addListener(element, listener) {
+ var id = idHandler.get(element);
+
+ if(!eventListeners[id]) {
+ eventListeners[id] = [];
+ }
+
+ eventListeners[id].push(listener);
+ }
+
+ function removeListener(element, listener) {
+ var listeners = getListeners(element);
+ for (var i = 0, len = listeners.length; i < len; ++i) {
+ if (listeners[i] === listener) {
+ listeners.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ function removeAllListeners(element) {
+ var listeners = getListeners(element);
+ if (!listeners) { return; }
+ listeners.length = 0;
+ }
+
+ return {
+ get: getListeners,
+ add: addListener,
+ removeListener: removeListener,
+ removeAllListeners: removeAllListeners
+ };
+ };
+
+ var idGenerator = function() {
+ var idCount = 1;
+
+ /**
+ * Generates a new unique id in the context.
+ * @public
+ * @returns {number} A unique id in the context.
+ */
+ function generate() {
+ return idCount++;
+ }
+
+ return {
+ generate: generate
+ };
+ };
+
+ var idHandler = function(options) {
+ var idGenerator = options.idGenerator;
+ var getState = options.stateHandler.getState;
+
+ /**
+ * Gets the resize detector id of the element.
+ * @public
+ * @param {element} element The target element to get the id of.
+ * @returns {string|number|null} The id of the element. Null if it has no id.
+ */
+ function getId(element) {
+ var state = getState(element);
+
+ if (state && state.id !== undefined) {
+ return state.id;
+ }
+
+ return null;
+ }
+
+ /**
+ * Sets the resize detector id of the element. Requires the element to have a resize detector state initialized.
+ * @public
+ * @param {element} element The target element to set the id of.
+ * @returns {string|number|null} The id of the element.
+ */
+ function setId(element) {
+ var state = getState(element);
+
+ if (!state) {
+ throw new Error("setId required the element to have a resize detection state.");
+ }
+
+ var id = idGenerator.generate();
+
+ state.id = id;
+
+ return id;
+ }
+
+ return {
+ get: getId,
+ set: setId
+ };
+ };
+
+ /* global console: false */
+
+ /**
+ * Reporter that handles the reporting of logs, warnings and errors.
+ * @public
+ * @param {boolean} quiet Tells if the reporter should be quiet or not.
+ */
+ var reporter = function(quiet) {
+ function noop() {
+ //Does nothing.
+ }
+
+ var reporter = {
+ log: noop,
+ warn: noop,
+ error: noop
+ };
+
+ if(!quiet && window.console) {
+ var attachFunction = function(reporter, name) {
+ //The proxy is needed to be able to call the method with the console context,
+ //since we cannot use bind.
+ reporter[name] = function reporterProxy() {
+ var f = console[name];
+ if (f.apply) { //IE9 does not support console.log.apply :)
+ f.apply(console, arguments);
+ } else {
+ for (var i = 0; i < arguments.length; i++) {
+ f(arguments[i]);
+ }
+ }
+ };
+ };
+
+ attachFunction(reporter, "log");
+ attachFunction(reporter, "warn");
+ attachFunction(reporter, "error");
+ }
+
+ return reporter;
+ };
+
+ var browserDetector = createCommonjsModule(function (module) {
+
+ var detector = module.exports = {};
+
+ detector.isIE = function(version) {
+ function isAnyIeVersion() {
+ var agent = navigator.userAgent.toLowerCase();
+ return agent.indexOf("msie") !== -1 || agent.indexOf("trident") !== -1 || agent.indexOf(" edge/") !== -1;
+ }
+
+ if(!isAnyIeVersion()) {
+ return false;
+ }
+
+ if(!version) {
+ return true;
+ }
+
+ //Shamelessly stolen from https://gist.github.com/padolsey/527683
+ var ieVersion = (function(){
+ var undef,
+ v = 3,
+ div = document.createElement("div"),
+ all = div.getElementsByTagName("i");
+
+ do {
+ div.innerHTML = "";
+ }
+ while (all[0]);
+
+ return v > 4 ? v : undef;
+ }());
+
+ return version === ieVersion;
+ };
+
+ detector.isLegacyOpera = function() {
+ return !!window.opera;
+ };
+ });
+
+ var utils_1 = createCommonjsModule(function (module) {
+
+ var utils = module.exports = {};
+
+ utils.getOption = getOption;
+
+ function getOption(options, name, defaultValue) {
+ var value = options[name];
+
+ if((value === undefined || value === null) && defaultValue !== undefined) {
+ return defaultValue;
+ }
+
+ return value;
+ }
+ });
+
+ var batchProcessor = function batchProcessorMaker(options) {
+ options = options || {};
+ var reporter = options.reporter;
+ var asyncProcess = utils_1.getOption(options, "async", true);
+ var autoProcess = utils_1.getOption(options, "auto", true);
+
+ if(autoProcess && !asyncProcess) {
+ reporter && reporter.warn("Invalid options combination. auto=true and async=false is invalid. Setting async=true.");
+ asyncProcess = true;
+ }
+
+ var batch = Batch();
+ var asyncFrameHandler;
+ var isProcessing = false;
+
+ function addFunction(level, fn) {
+ if(!isProcessing && autoProcess && asyncProcess && batch.size() === 0) {
+ // Since this is async, it is guaranteed to be executed after that the fn is added to the batch.
+ // This needs to be done before, since we're checking the size of the batch to be 0.
+ processBatchAsync();
+ }
+
+ batch.add(level, fn);
+ }
+
+ function processBatch() {
+ // Save the current batch, and create a new batch so that incoming functions are not added into the currently processing batch.
+ // Continue processing until the top-level batch is empty (functions may be added to the new batch while processing, and so on).
+ isProcessing = true;
+ while (batch.size()) {
+ var processingBatch = batch;
+ batch = Batch();
+ processingBatch.process();
+ }
+ isProcessing = false;
+ }
+
+ function forceProcessBatch(localAsyncProcess) {
+ if (isProcessing) {
+ return;
+ }
+
+ if(localAsyncProcess === undefined) {
+ localAsyncProcess = asyncProcess;
+ }
+
+ if(asyncFrameHandler) {
+ cancelFrame(asyncFrameHandler);
+ asyncFrameHandler = null;
+ }
+
+ if(localAsyncProcess) {
+ processBatchAsync();
+ } else {
+ processBatch();
+ }
+ }
+
+ function processBatchAsync() {
+ asyncFrameHandler = requestFrame(processBatch);
+ }
+
+ function cancelFrame(listener) {
+ // var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout;
+ var cancel = clearTimeout;
+ return cancel(listener);
+ }
+
+ function requestFrame(callback) {
+ // var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function(fn) { return window.setTimeout(fn, 20); };
+ var raf = function(fn) { return setTimeout(fn, 0); };
+ return raf(callback);
+ }
+
+ return {
+ add: addFunction,
+ force: forceProcessBatch
+ };
+ };
+
+ function Batch() {
+ var batch = {};
+ var size = 0;
+ var topLevel = 0;
+ var bottomLevel = 0;
+
+ function add(level, fn) {
+ if(!fn) {
+ fn = level;
+ level = 0;
+ }
+
+ if(level > topLevel) {
+ topLevel = level;
+ } else if(level < bottomLevel) {
+ bottomLevel = level;
+ }
+
+ if(!batch[level]) {
+ batch[level] = [];
+ }
+
+ batch[level].push(fn);
+ size++;
+ }
+
+ function process() {
+ for(var level = bottomLevel; level <= topLevel; level++) {
+ var fns = batch[level];
+
+ for(var i = 0; i < fns.length; i++) {
+ var fn = fns[i];
+ fn();
+ }
+ }
+ }
+
+ function getSize() {
+ return size;
+ }
+
+ return {
+ add: add,
+ process: process,
+ size: getSize
+ };
+ }
+
+ var prop = "_erd";
+
+ function initState(element) {
+ element[prop] = {};
+ return getState(element);
+ }
+
+ function getState(element) {
+ return element[prop];
+ }
+
+ function cleanState(element) {
+ delete element[prop];
+ }
+
+ var stateHandler = {
+ initState: initState,
+ getState: getState,
+ cleanState: cleanState
+ };
+
+ var object = function(options) {
+ options = options || {};
+ var reporter = options.reporter;
+ var batchProcessor = options.batchProcessor;
+ var getState = options.stateHandler.getState;
+
+ if(!reporter) {
+ throw new Error("Missing required dependency: reporter.");
+ }
+
+ /**
+ * Adds a resize event listener to the element.
+ * @public
+ * @param {element} element The element that should have the listener added.
+ * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.
+ */
+ function addListener(element, listener) {
+ if(!getObject(element)) {
+ throw new Error("Element is not detectable by this strategy.");
+ }
+
+ function listenerProxy() {
+ listener(element);
+ }
+
+ if(browserDetector.isIE(8)) {
+ //IE 8 does not support object, but supports the resize event directly on elements.
+ getState(element).object = {
+ proxy: listenerProxy
+ };
+ element.attachEvent("onresize", listenerProxy);
+ } else {
+ var object = getObject(element);
+ object.contentDocument.defaultView.addEventListener("resize", listenerProxy);
+ }
+ }
+
+ /**
+ * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.
+ * @private
+ * @param {object} options Optional options object.
+ * @param {element} element The element to make detectable
+ * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.
+ */
+ function makeDetectable(options, element, callback) {
+ if (!callback) {
+ callback = element;
+ element = options;
+ options = null;
+ }
+
+ options = options || {};
+ var debug = options.debug;
+
+ function injectObject(element, callback) {
+ var OBJECT_STYLE = "display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; padding: 0; margin: 0; opacity: 0; z-index: -1000; pointer-events: none;";
+
+ //The target element needs to be positioned (everything except static) so the absolute positioned object will be positioned relative to the target element.
+
+ // Position altering may be performed directly or on object load, depending on if style resolution is possible directly or not.
+ var positionCheckPerformed = false;
+
+ // The element may not yet be attached to the DOM, and therefore the style object may be empty in some browsers.
+ // Since the style object is a reference, it will be updated as soon as the element is attached to the DOM.
+ var style = window.getComputedStyle(element);
+ var width = element.offsetWidth;
+ var height = element.offsetHeight;
+
+ getState(element).startSize = {
+ width: width,
+ height: height
+ };
+
+ function mutateDom() {
+ function alterPositionStyles() {
+ if(style.position === "static") {
+ element.style.position = "relative";
+
+ var removeRelativeStyles = function(reporter, element, style, property) {
+ function getNumericalValue(value) {
+ return value.replace(/[^-\d\.]/g, "");
+ }
+
+ var value = style[property];
+
+ if(value !== "auto" && getNumericalValue(value) !== "0") {
+ reporter.warn("An element that is positioned static has style." + property + "=" + value + " which is ignored due to the static positioning. The element will need to be positioned relative, so the style." + property + " will be set to 0. Element: ", element);
+ element.style[property] = 0;
+ }
+ };
+
+ //Check so that there are no accidental styles that will make the element styled differently now that is is relative.
+ //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).
+ removeRelativeStyles(reporter, element, style, "top");
+ removeRelativeStyles(reporter, element, style, "right");
+ removeRelativeStyles(reporter, element, style, "bottom");
+ removeRelativeStyles(reporter, element, style, "left");
+ }
+ }
+
+ function onObjectLoad() {
+ // The object has been loaded, which means that the element now is guaranteed to be attached to the DOM.
+ if (!positionCheckPerformed) {
+ alterPositionStyles();
+ }
+
+ /*jshint validthis: true */
+
+ function getDocument(element, callback) {
+ //Opera 12 seem to call the object.onload before the actual document has been created.
+ //So if it is not present, poll it with an timeout until it is present.
+ //TODO: Could maybe be handled better with object.onreadystatechange or similar.
+ if(!element.contentDocument) {
+ setTimeout(function checkForObjectDocument() {
+ getDocument(element, callback);
+ }, 100);
+
+ return;
+ }
+
+ callback(element.contentDocument);
+ }
+
+ //Mutating the object element here seems to fire another load event.
+ //Mutating the inner document of the object element is fine though.
+ var objectElement = this;
+
+ //Create the style element to be added to the object.
+ getDocument(objectElement, function onObjectDocumentReady(objectDocument) {
+ //Notify that the element is ready to be listened to.
+ callback(element);
+ });
+ }
+
+ // The element may be detached from the DOM, and some browsers does not support style resolving of detached elements.
+ // The alterPositionStyles needs to be delayed until we know the element has been attached to the DOM (which we are sure of when the onObjectLoad has been fired), if style resolution is not possible.
+ if (style.position !== "") {
+ alterPositionStyles();
+ positionCheckPerformed = true;
+ }
+
+ //Add an object element as a child to the target element that will be listened to for resize events.
+ var object = document.createElement("object");
+ object.style.cssText = OBJECT_STYLE;
+ object.tabIndex = -1;
+ object.type = "text/html";
+ object.setAttribute("aria-hidden", "true");
+ object.onload = onObjectLoad;
+
+ //Safari: This must occur before adding the object to the DOM.
+ //IE: Does not like that this happens before, even if it is also added after.
+ if(!browserDetector.isIE()) {
+ object.data = "about:blank";
+ }
+
+ element.appendChild(object);
+ getState(element).object = object;
+
+ //IE: This must occur after adding the object to the DOM.
+ if(browserDetector.isIE()) {
+ object.data = "about:blank";
+ }
+ }
+
+ if(batchProcessor) {
+ batchProcessor.add(mutateDom);
+ } else {
+ mutateDom();
+ }
+ }
+
+ if(browserDetector.isIE(8)) {
+ //IE 8 does not support objects properly. Luckily they do support the resize event.
+ //So do not inject the object and notify that the element is already ready to be listened to.
+ //The event handler for the resize event is attached in the utils.addListener instead.
+ callback(element);
+ } else {
+ injectObject(element, callback);
+ }
+ }
+
+ /**
+ * Returns the child object of the target element.
+ * @private
+ * @param {element} element The target element.
+ * @returns The object element of the target.
+ */
+ function getObject(element) {
+ return getState(element).object;
+ }
+
+ function uninstall(element) {
+ if(browserDetector.isIE(8)) {
+ element.detachEvent("onresize", getState(element).object.proxy);
+ } else {
+ element.removeChild(getObject(element));
+ }
+ delete getState(element).object;
+ }
+
+ return {
+ makeDetectable: makeDetectable,
+ addListener: addListener,
+ uninstall: uninstall
+ };
+ };
+
+ var forEach = collectionUtils.forEach;
+
+ var scroll = function(options) {
+ options = options || {};
+ var reporter = options.reporter;
+ var batchProcessor = options.batchProcessor;
+ var getState = options.stateHandler.getState;
+ var hasState = options.stateHandler.hasState;
+ var idHandler = options.idHandler;
+
+ if (!batchProcessor) {
+ throw new Error("Missing required dependency: batchProcessor");
+ }
+
+ if (!reporter) {
+ throw new Error("Missing required dependency: reporter.");
+ }
+
+ //TODO: Could this perhaps be done at installation time?
+ var scrollbarSizes = getScrollbarSizes();
+
+ // Inject the scrollbar styling that prevents them from appearing sometimes in Chrome.
+ // The injected container needs to have a class, so that it may be styled with CSS (pseudo elements).
+ var styleId = "erd_scroll_detection_scrollbar_style";
+ var detectionContainerClass = "erd_scroll_detection_container";
+ injectScrollStyle(styleId, detectionContainerClass);
+
+ function getScrollbarSizes() {
+ var width = 500;
+ var height = 500;
+
+ var child = document.createElement("div");
+ child.style.cssText = "position: absolute; width: " + width*2 + "px; height: " + height*2 + "px; visibility: hidden; margin: 0; padding: 0;";
+
+ var container = document.createElement("div");
+ container.style.cssText = "position: absolute; width: " + width + "px; height: " + height + "px; overflow: scroll; visibility: none; top: " + -width*3 + "px; left: " + -height*3 + "px; visibility: hidden; margin: 0; padding: 0;";
+
+ container.appendChild(child);
+
+ document.body.insertBefore(container, document.body.firstChild);
+
+ var widthSize = width - container.clientWidth;
+ var heightSize = height - container.clientHeight;
+
+ document.body.removeChild(container);
+
+ return {
+ width: widthSize,
+ height: heightSize
+ };
+ }
+
+ function injectScrollStyle(styleId, containerClass) {
+ function injectStyle(style, method) {
+ method = method || function (element) {
+ document.head.appendChild(element);
+ };
+
+ var styleElement = document.createElement("style");
+ styleElement.innerHTML = style;
+ styleElement.id = styleId;
+ method(styleElement);
+ return styleElement;
+ }
+
+ if (!document.getElementById(styleId)) {
+ var containerAnimationClass = containerClass + "_animation";
+ var containerAnimationActiveClass = containerClass + "_animation_active";
+ var style = "/* Created by the element-resize-detector library. */\n";
+ style += "." + containerClass + " > div::-webkit-scrollbar { display: none; }\n\n";
+ style += "." + containerAnimationActiveClass + " { -webkit-animation-duration: 0.1s; animation-duration: 0.1s; -webkit-animation-name: " + containerAnimationClass + "; animation-name: " + containerAnimationClass + "; }\n";
+ style += "@-webkit-keyframes " + containerAnimationClass + " { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }\n";
+ style += "@keyframes " + containerAnimationClass + " { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }";
+ injectStyle(style);
+ }
+ }
+
+ function addAnimationClass(element) {
+ element.className += " " + detectionContainerClass + "_animation_active";
+ }
+
+ function addEvent(el, name, cb) {
+ if (el.addEventListener) {
+ el.addEventListener(name, cb);
+ } else if(el.attachEvent) {
+ el.attachEvent("on" + name, cb);
+ } else {
+ return reporter.error("[scroll] Don't know how to add event listeners.");
+ }
+ }
+
+ function removeEvent(el, name, cb) {
+ if (el.removeEventListener) {
+ el.removeEventListener(name, cb);
+ } else if(el.detachEvent) {
+ el.detachEvent("on" + name, cb);
+ } else {
+ return reporter.error("[scroll] Don't know how to remove event listeners.");
+ }
+ }
+
+ function getExpandElement(element) {
+ return getState(element).container.childNodes[0].childNodes[0].childNodes[0];
+ }
+
+ function getShrinkElement(element) {
+ return getState(element).container.childNodes[0].childNodes[0].childNodes[1];
+ }
+
+ /**
+ * Adds a resize event listener to the element.
+ * @public
+ * @param {element} element The element that should have the listener added.
+ * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.
+ */
+ function addListener(element, listener) {
+ var listeners = getState(element).listeners;
+
+ if (!listeners.push) {
+ throw new Error("Cannot add listener to an element that is not detectable.");
+ }
+
+ getState(element).listeners.push(listener);
+ }
+
+ /**
+ * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.
+ * @private
+ * @param {object} options Optional options object.
+ * @param {element} element The element to make detectable
+ * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.
+ */
+ function makeDetectable(options, element, callback) {
+ if (!callback) {
+ callback = element;
+ element = options;
+ options = null;
+ }
+
+ options = options || {};
+
+ function debug() {
+ if (options.debug) {
+ var args = Array.prototype.slice.call(arguments);
+ args.unshift(idHandler.get(element), "Scroll: ");
+ if (reporter.log.apply) {
+ reporter.log.apply(null, args);
+ } else {
+ for (var i = 0; i < args.length; i++) {
+ reporter.log(args[i]);
+ }
+ }
+ }
+ }
+
+ function isDetached(element) {
+ function isInDocument(element) {
+ return element === element.ownerDocument.body || element.ownerDocument.body.contains(element);
+ }
+
+ if (!isInDocument(element)) {
+ return true;
+ }
+
+ // FireFox returns null style in hidden iframes. See https://github.com/wnr/element-resize-detector/issues/68 and https://bugzilla.mozilla.org/show_bug.cgi?id=795520
+ if (window.getComputedStyle(element) === null) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function isUnrendered(element) {
+ // Check the absolute positioned container since the top level container is display: inline.
+ var container = getState(element).container.childNodes[0];
+ var style = window.getComputedStyle(container);
+ return !style.width || style.width.indexOf("px") === -1; //Can only compute pixel value when rendered.
+ }
+
+ function getStyle() {
+ // Some browsers only force layouts when actually reading the style properties of the style object, so make sure that they are all read here,
+ // so that the user of the function can be sure that it will perform the layout here, instead of later (important for batching).
+ var elementStyle = window.getComputedStyle(element);
+ var style = {};
+ style.position = elementStyle.position;
+ style.width = element.offsetWidth;
+ style.height = element.offsetHeight;
+ style.top = elementStyle.top;
+ style.right = elementStyle.right;
+ style.bottom = elementStyle.bottom;
+ style.left = elementStyle.left;
+ style.widthCSS = elementStyle.width;
+ style.heightCSS = elementStyle.height;
+ return style;
+ }
+
+ function storeStartSize() {
+ var style = getStyle();
+ getState(element).startSize = {
+ width: style.width,
+ height: style.height
+ };
+ debug("Element start size", getState(element).startSize);
+ }
+
+ function initListeners() {
+ getState(element).listeners = [];
+ }
+
+ function storeStyle() {
+ debug("storeStyle invoked.");
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ var style = getStyle();
+ getState(element).style = style;
+ }
+
+ function storeCurrentSize(element, width, height) {
+ getState(element).lastWidth = width;
+ getState(element).lastHeight = height;
+ }
+
+ function getExpandChildElement(element) {
+ return getExpandElement(element).childNodes[0];
+ }
+
+ function getWidthOffset() {
+ return 2 * scrollbarSizes.width + 1;
+ }
+
+ function getHeightOffset() {
+ return 2 * scrollbarSizes.height + 1;
+ }
+
+ function getExpandWidth(width) {
+ return width + 10 + getWidthOffset();
+ }
+
+ function getExpandHeight(height) {
+ return height + 10 + getHeightOffset();
+ }
+
+ function getShrinkWidth(width) {
+ return width * 2 + getWidthOffset();
+ }
+
+ function getShrinkHeight(height) {
+ return height * 2 + getHeightOffset();
+ }
+
+ function positionScrollbars(element, width, height) {
+ var expand = getExpandElement(element);
+ var shrink = getShrinkElement(element);
+ var expandWidth = getExpandWidth(width);
+ var expandHeight = getExpandHeight(height);
+ var shrinkWidth = getShrinkWidth(width);
+ var shrinkHeight = getShrinkHeight(height);
+ expand.scrollLeft = expandWidth;
+ expand.scrollTop = expandHeight;
+ shrink.scrollLeft = shrinkWidth;
+ shrink.scrollTop = shrinkHeight;
+ }
+
+ function injectContainerElement() {
+ var container = getState(element).container;
+
+ if (!container) {
+ container = document.createElement("div");
+ container.className = detectionContainerClass;
+ container.style.cssText = "visibility: hidden; display: inline; width: 0px; height: 0px; z-index: -1; overflow: hidden; margin: 0; padding: 0;";
+ getState(element).container = container;
+ addAnimationClass(container);
+ element.appendChild(container);
+
+ var onAnimationStart = function () {
+ getState(element).onRendered && getState(element).onRendered();
+ };
+
+ addEvent(container, "animationstart", onAnimationStart);
+
+ // Store the event handler here so that they may be removed when uninstall is called.
+ // See uninstall function for an explanation why it is needed.
+ getState(element).onAnimationStart = onAnimationStart;
+ }
+
+ return container;
+ }
+
+ function injectScrollElements() {
+ function alterPositionStyles() {
+ var style = getState(element).style;
+
+ if(style.position === "static") {
+ element.style.position = "relative";
+
+ var removeRelativeStyles = function(reporter, element, style, property) {
+ function getNumericalValue(value) {
+ return value.replace(/[^-\d\.]/g, "");
+ }
+
+ var value = style[property];
+
+ if(value !== "auto" && getNumericalValue(value) !== "0") {
+ reporter.warn("An element that is positioned static has style." + property + "=" + value + " which is ignored due to the static positioning. The element will need to be positioned relative, so the style." + property + " will be set to 0. Element: ", element);
+ element.style[property] = 0;
+ }
+ };
+
+ //Check so that there are no accidental styles that will make the element styled differently now that is is relative.
+ //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).
+ removeRelativeStyles(reporter, element, style, "top");
+ removeRelativeStyles(reporter, element, style, "right");
+ removeRelativeStyles(reporter, element, style, "bottom");
+ removeRelativeStyles(reporter, element, style, "left");
+ }
+ }
+
+ function getLeftTopBottomRightCssText(left, top, bottom, right) {
+ left = (!left ? "0" : (left + "px"));
+ top = (!top ? "0" : (top + "px"));
+ bottom = (!bottom ? "0" : (bottom + "px"));
+ right = (!right ? "0" : (right + "px"));
+
+ return "left: " + left + "; top: " + top + "; right: " + right + "; bottom: " + bottom + ";";
+ }
+
+ debug("Injecting elements");
+
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ alterPositionStyles();
+
+ var rootContainer = getState(element).container;
+
+ if (!rootContainer) {
+ rootContainer = injectContainerElement();
+ }
+
+ // Due to this WebKit bug https://bugs.webkit.org/show_bug.cgi?id=80808 (currently fixed in Blink, but still present in WebKit browsers such as Safari),
+ // we need to inject two containers, one that is width/height 100% and another that is left/top -1px so that the final container always is 1x1 pixels bigger than
+ // the targeted element.
+ // When the bug is resolved, "containerContainer" may be removed.
+
+ // The outer container can occasionally be less wide than the targeted when inside inline elements element in WebKit (see https://bugs.webkit.org/show_bug.cgi?id=152980).
+ // This should be no problem since the inner container either way makes sure the injected scroll elements are at least 1x1 px.
+
+ var scrollbarWidth = scrollbarSizes.width;
+ var scrollbarHeight = scrollbarSizes.height;
+ var containerContainerStyle = "position: absolute; flex: none; overflow: hidden; z-index: -1; visibility: hidden; width: 100%; height: 100%; left: 0px; top: 0px;";
+ var containerStyle = "position: absolute; flex: none; overflow: hidden; z-index: -1; visibility: hidden; " + getLeftTopBottomRightCssText(-(1 + scrollbarWidth), -(1 + scrollbarHeight), -scrollbarHeight, -scrollbarWidth);
+ var expandStyle = "position: absolute; flex: none; overflow: scroll; z-index: -1; visibility: hidden; width: 100%; height: 100%;";
+ var shrinkStyle = "position: absolute; flex: none; overflow: scroll; z-index: -1; visibility: hidden; width: 100%; height: 100%;";
+ var expandChildStyle = "position: absolute; left: 0; top: 0;";
+ var shrinkChildStyle = "position: absolute; width: 200%; height: 200%;";
+
+ var containerContainer = document.createElement("div");
+ var container = document.createElement("div");
+ var expand = document.createElement("div");
+ var expandChild = document.createElement("div");
+ var shrink = document.createElement("div");
+ var shrinkChild = document.createElement("div");
+
+ // Some browsers choke on the resize system being rtl, so force it to ltr. https://github.com/wnr/element-resize-detector/issues/56
+ // However, dir should not be set on the top level container as it alters the dimensions of the target element in some browsers.
+ containerContainer.dir = "ltr";
+
+ containerContainer.style.cssText = containerContainerStyle;
+ containerContainer.className = detectionContainerClass;
+ container.className = detectionContainerClass;
+ container.style.cssText = containerStyle;
+ expand.style.cssText = expandStyle;
+ expandChild.style.cssText = expandChildStyle;
+ shrink.style.cssText = shrinkStyle;
+ shrinkChild.style.cssText = shrinkChildStyle;
+
+ expand.appendChild(expandChild);
+ shrink.appendChild(shrinkChild);
+ container.appendChild(expand);
+ container.appendChild(shrink);
+ containerContainer.appendChild(container);
+ rootContainer.appendChild(containerContainer);
+
+ function onExpandScroll() {
+ getState(element).onExpand && getState(element).onExpand();
+ }
+
+ function onShrinkScroll() {
+ getState(element).onShrink && getState(element).onShrink();
+ }
+
+ addEvent(expand, "scroll", onExpandScroll);
+ addEvent(shrink, "scroll", onShrinkScroll);
+
+ // Store the event handlers here so that they may be removed when uninstall is called.
+ // See uninstall function for an explanation why it is needed.
+ getState(element).onExpandScroll = onExpandScroll;
+ getState(element).onShrinkScroll = onShrinkScroll;
+ }
+
+ function registerListenersAndPositionElements() {
+ function updateChildSizes(element, width, height) {
+ var expandChild = getExpandChildElement(element);
+ var expandWidth = getExpandWidth(width);
+ var expandHeight = getExpandHeight(height);
+ expandChild.style.width = expandWidth + "px";
+ expandChild.style.height = expandHeight + "px";
+ }
+
+ function updateDetectorElements(done) {
+ var width = element.offsetWidth;
+ var height = element.offsetHeight;
+
+ debug("Storing current size", width, height);
+
+ // Store the size of the element sync here, so that multiple scroll events may be ignored in the event listeners.
+ // Otherwise the if-check in handleScroll is useless.
+ storeCurrentSize(element, width, height);
+
+ // Since we delay the processing of the batch, there is a risk that uninstall has been called before the batch gets to execute.
+ // Since there is no way to cancel the fn executions, we need to add an uninstall guard to all fns of the batch.
+
+ batchProcessor.add(0, function performUpdateChildSizes() {
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ if (!areElementsInjected()) {
+ debug("Aborting because element container has not been initialized");
+ return;
+ }
+
+ if (options.debug) {
+ var w = element.offsetWidth;
+ var h = element.offsetHeight;
+
+ if (w !== width || h !== height) {
+ reporter.warn(idHandler.get(element), "Scroll: Size changed before updating detector elements.");
+ }
+ }
+
+ updateChildSizes(element, width, height);
+ });
+
+ batchProcessor.add(1, function updateScrollbars() {
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ if (!areElementsInjected()) {
+ debug("Aborting because element container has not been initialized");
+ return;
+ }
+
+ positionScrollbars(element, width, height);
+ });
+
+ if (done) {
+ batchProcessor.add(2, function () {
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ if (!areElementsInjected()) {
+ debug("Aborting because element container has not been initialized");
+ return;
+ }
+
+ done();
+ });
+ }
+ }
+
+ function areElementsInjected() {
+ return !!getState(element).container;
+ }
+
+ function notifyListenersIfNeeded() {
+ function isFirstNotify() {
+ return getState(element).lastNotifiedWidth === undefined;
+ }
+
+ debug("notifyListenersIfNeeded invoked");
+
+ var state = getState(element);
+
+ // Don't notify the if the current size is the start size, and this is the first notification.
+ if (isFirstNotify() && state.lastWidth === state.startSize.width && state.lastHeight === state.startSize.height) {
+ return debug("Not notifying: Size is the same as the start size, and there has been no notification yet.");
+ }
+
+ // Don't notify if the size already has been notified.
+ if (state.lastWidth === state.lastNotifiedWidth && state.lastHeight === state.lastNotifiedHeight) {
+ return debug("Not notifying: Size already notified");
+ }
+
+
+ debug("Current size not notified, notifying...");
+ state.lastNotifiedWidth = state.lastWidth;
+ state.lastNotifiedHeight = state.lastHeight;
+ forEach(getState(element).listeners, function (listener) {
+ listener(element);
+ });
+ }
+
+ function handleRender() {
+ debug("startanimation triggered.");
+
+ if (isUnrendered(element)) {
+ debug("Ignoring since element is still unrendered...");
+ return;
+ }
+
+ debug("Element rendered.");
+ var expand = getExpandElement(element);
+ var shrink = getShrinkElement(element);
+ if (expand.scrollLeft === 0 || expand.scrollTop === 0 || shrink.scrollLeft === 0 || shrink.scrollTop === 0) {
+ debug("Scrollbars out of sync. Updating detector elements...");
+ updateDetectorElements(notifyListenersIfNeeded);
+ }
+ }
+
+ function handleScroll() {
+ debug("Scroll detected.");
+
+ if (isUnrendered(element)) {
+ // Element is still unrendered. Skip this scroll event.
+ debug("Scroll event fired while unrendered. Ignoring...");
+ return;
+ }
+
+ var width = element.offsetWidth;
+ var height = element.offsetHeight;
+
+ if (width !== getState(element).lastWidth || height !== getState(element).lastHeight) {
+ debug("Element size changed.");
+ updateDetectorElements(notifyListenersIfNeeded);
+ } else {
+ debug("Element size has not changed (" + width + "x" + height + ").");
+ }
+ }
+
+ debug("registerListenersAndPositionElements invoked.");
+
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ getState(element).onRendered = handleRender;
+ getState(element).onExpand = handleScroll;
+ getState(element).onShrink = handleScroll;
+
+ var style = getState(element).style;
+ updateChildSizes(element, style.width, style.height);
+ }
+
+ function finalizeDomMutation() {
+ debug("finalizeDomMutation invoked.");
+
+ if (!getState(element)) {
+ debug("Aborting because element has been uninstalled");
+ return;
+ }
+
+ var style = getState(element).style;
+ storeCurrentSize(element, style.width, style.height);
+ positionScrollbars(element, style.width, style.height);
+ }
+
+ function ready() {
+ callback(element);
+ }
+
+ function install() {
+ debug("Installing...");
+ initListeners();
+ storeStartSize();
+
+ batchProcessor.add(0, storeStyle);
+ batchProcessor.add(1, injectScrollElements);
+ batchProcessor.add(2, registerListenersAndPositionElements);
+ batchProcessor.add(3, finalizeDomMutation);
+ batchProcessor.add(4, ready);
+ }
+
+ debug("Making detectable...");
+
+ if (isDetached(element)) {
+ debug("Element is detached");
+
+ injectContainerElement();
+
+ debug("Waiting until element is attached...");
+
+ getState(element).onRendered = function () {
+ debug("Element is now attached");
+ install();
+ };
+ } else {
+ install();
+ }
+ }
+
+ function uninstall(element) {
+ var state = getState(element);
+
+ if (!state) {
+ // Uninstall has been called on a non-erd element.
+ return;
+ }
+
+ // Uninstall may have been called in the following scenarios:
+ // (1) Right between the sync code and async batch (here state.busy = true, but nothing have been registered or injected).
+ // (2) In the ready callback of the last level of the batch by another element (here, state.busy = true, but all the stuff has been injected).
+ // (3) After the installation process (here, state.busy = false and all the stuff has been injected).
+ // So to be on the safe side, let's check for each thing before removing.
+
+ // We need to remove the event listeners, because otherwise the event might fire on an uninstall element which results in an error when trying to get the state of the element.
+ state.onExpandScroll && removeEvent(getExpandElement(element), "scroll", state.onExpandScroll);
+ state.onShrinkScroll && removeEvent(getShrinkElement(element), "scroll", state.onShrinkScroll);
+ state.onAnimationStart && removeEvent(state.container, "animationstart", state.onAnimationStart);
+
+ state.container && element.removeChild(state.container);
+ }
+
+ return {
+ makeDetectable: makeDetectable,
+ addListener: addListener,
+ uninstall: uninstall
+ };
+ };
+
+ var forEach$1 = collectionUtils.forEach;
+
+
+
+
+
+
+
+
+
+ //Detection strategies.
+
+
+
+ function isCollection(obj) {
+ return Array.isArray(obj) || obj.length !== undefined;
+ }
+
+ function toArray(collection) {
+ if (!Array.isArray(collection)) {
+ var array = [];
+ forEach$1(collection, function (obj) {
+ array.push(obj);
+ });
+ return array;
+ } else {
+ return collection;
+ }
+ }
+
+ function isElement(obj) {
+ return obj && obj.nodeType === 1;
+ }
+
+ /**
+ * @typedef idHandler
+ * @type {object}
+ * @property {function} get Gets the resize detector id of the element.
+ * @property {function} set Generate and sets the resize detector id of the element.
+ */
+
+ /**
+ * @typedef Options
+ * @type {object}
+ * @property {boolean} callOnAdd Determines if listeners should be called when they are getting added.
+ Default is true. If true, the listener is guaranteed to be called when it has been added.
+ If false, the listener will not be guarenteed to be called when it has been added (does not prevent it from being called).
+ * @property {idHandler} idHandler A custom id handler that is responsible for generating, setting and retrieving id's for elements.
+ If not provided, a default id handler will be used.
+ * @property {reporter} reporter A custom reporter that handles reporting logs, warnings and errors.
+ If not provided, a default id handler will be used.
+ If set to false, then nothing will be reported.
+ * @property {boolean} debug If set to true, the the system will report debug messages as default for the listenTo method.
+ */
+
+ /**
+ * Creates an element resize detector instance.
+ * @public
+ * @param {Options?} options Optional global options object that will decide how this instance will work.
+ */
+ var elementResizeDetector = function(options) {
+ options = options || {};
+
+ //idHandler is currently not an option to the listenTo function, so it should not be added to globalOptions.
+ var idHandler$1;
+
+ if (options.idHandler) {
+ // To maintain compatability with idHandler.get(element, readonly), make sure to wrap the given idHandler
+ // so that readonly flag always is true when it's used here. This may be removed next major version bump.
+ idHandler$1 = {
+ get: function (element) { return options.idHandler.get(element, true); },
+ set: options.idHandler.set
+ };
+ } else {
+ var idGenerator$1 = idGenerator();
+ var defaultIdHandler = idHandler({
+ idGenerator: idGenerator$1,
+ stateHandler: stateHandler
+ });
+ idHandler$1 = defaultIdHandler;
+ }
+
+ //reporter is currently not an option to the listenTo function, so it should not be added to globalOptions.
+ var reporter$1 = options.reporter;
+
+ if(!reporter$1) {
+ //If options.reporter is false, then the reporter should be quiet.
+ var quiet = reporter$1 === false;
+ reporter$1 = reporter(quiet);
+ }
+
+ //batchProcessor is currently not an option to the listenTo function, so it should not be added to globalOptions.
+ var batchProcessor$1 = getOption(options, "batchProcessor", batchProcessor({ reporter: reporter$1 }));
+
+ //Options to be used as default for the listenTo function.
+ var globalOptions = {};
+ globalOptions.callOnAdd = !!getOption(options, "callOnAdd", true);
+ globalOptions.debug = !!getOption(options, "debug", false);
+
+ var eventListenerHandler = listenerHandler(idHandler$1);
+ var elementUtils$1 = elementUtils({
+ stateHandler: stateHandler
+ });
+
+ //The detection strategy to be used.
+ var detectionStrategy;
+ var desiredStrategy = getOption(options, "strategy", "object");
+ var strategyOptions = {
+ reporter: reporter$1,
+ batchProcessor: batchProcessor$1,
+ stateHandler: stateHandler,
+ idHandler: idHandler$1
+ };
+
+ if(desiredStrategy === "scroll") {
+ if (browserDetector.isLegacyOpera()) {
+ reporter$1.warn("Scroll strategy is not supported on legacy Opera. Changing to object strategy.");
+ desiredStrategy = "object";
+ } else if (browserDetector.isIE(9)) {
+ reporter$1.warn("Scroll strategy is not supported on IE9. Changing to object strategy.");
+ desiredStrategy = "object";
+ }
+ }
+
+ if(desiredStrategy === "scroll") {
+ detectionStrategy = scroll(strategyOptions);
+ } else if(desiredStrategy === "object") {
+ detectionStrategy = object(strategyOptions);
+ } else {
+ throw new Error("Invalid strategy name: " + desiredStrategy);
+ }
+
+ //Calls can be made to listenTo with elements that are still being installed.
+ //Also, same elements can occur in the elements list in the listenTo function.
+ //With this map, the ready callbacks can be synchronized between the calls
+ //so that the ready callback can always be called when an element is ready - even if
+ //it wasn't installed from the function itself.
+ var onReadyCallbacks = {};
+
+ /**
+ * Makes the given elements resize-detectable and starts listening to resize events on the elements. Calls the event callback for each event for each element.
+ * @public
+ * @param {Options?} options Optional options object. These options will override the global options. Some options may not be overriden, such as idHandler.
+ * @param {element[]|element} elements The given array of elements to detect resize events of. Single element is also valid.
+ * @param {function} listener The callback to be executed for each resize event for each element.
+ */
+ function listenTo(options, elements, listener) {
+ function onResizeCallback(element) {
+ var listeners = eventListenerHandler.get(element);
+ forEach$1(listeners, function callListenerProxy(listener) {
+ listener(element);
+ });
+ }
+
+ function addListener(callOnAdd, element, listener) {
+ eventListenerHandler.add(element, listener);
+
+ if(callOnAdd) {
+ listener(element);
+ }
+ }
+
+ //Options object may be omitted.
+ if(!listener) {
+ listener = elements;
+ elements = options;
+ options = {};
+ }
+
+ if(!elements) {
+ throw new Error("At least one element required.");
+ }
+
+ if(!listener) {
+ throw new Error("Listener required.");
+ }
+
+ if (isElement(elements)) {
+ // A single element has been passed in.
+ elements = [elements];
+ } else if (isCollection(elements)) {
+ // Convert collection to array for plugins.
+ // TODO: May want to check so that all the elements in the collection are valid elements.
+ elements = toArray(elements);
+ } else {
+ return reporter$1.error("Invalid arguments. Must be a DOM element or a collection of DOM elements.");
+ }
+
+ var elementsReady = 0;
+
+ var callOnAdd = getOption(options, "callOnAdd", globalOptions.callOnAdd);
+ var onReadyCallback = getOption(options, "onReady", function noop() {});
+ var debug = getOption(options, "debug", globalOptions.debug);
+
+ forEach$1(elements, function attachListenerToElement(element) {
+ if (!stateHandler.getState(element)) {
+ stateHandler.initState(element);
+ idHandler$1.set(element);
+ }
+
+ var id = idHandler$1.get(element);
+
+ debug && reporter$1.log("Attaching listener to element", id, element);
+
+ if(!elementUtils$1.isDetectable(element)) {
+ debug && reporter$1.log(id, "Not detectable.");
+ if(elementUtils$1.isBusy(element)) {
+ debug && reporter$1.log(id, "System busy making it detectable");
+
+ //The element is being prepared to be detectable. Do not make it detectable.
+ //Just add the listener, because the element will soon be detectable.
+ addListener(callOnAdd, element, listener);
+ onReadyCallbacks[id] = onReadyCallbacks[id] || [];
+ onReadyCallbacks[id].push(function onReady() {
+ elementsReady++;
+
+ if(elementsReady === elements.length) {
+ onReadyCallback();
+ }
+ });
+ return;
+ }
+
+ debug && reporter$1.log(id, "Making detectable...");
+ //The element is not prepared to be detectable, so do prepare it and add a listener to it.
+ elementUtils$1.markBusy(element, true);
+ return detectionStrategy.makeDetectable({ debug: debug }, element, function onElementDetectable(element) {
+ debug && reporter$1.log(id, "onElementDetectable");
+
+ if (stateHandler.getState(element)) {
+ elementUtils$1.markAsDetectable(element);
+ elementUtils$1.markBusy(element, false);
+ detectionStrategy.addListener(element, onResizeCallback);
+ addListener(callOnAdd, element, listener);
+
+ // Since the element size might have changed since the call to "listenTo", we need to check for this change,
+ // so that a resize event may be emitted.
+ // Having the startSize object is optional (since it does not make sense in some cases such as unrendered elements), so check for its existance before.
+ // Also, check the state existance before since the element may have been uninstalled in the installation process.
+ var state = stateHandler.getState(element);
+ if (state && state.startSize) {
+ var width = element.offsetWidth;
+ var height = element.offsetHeight;
+ if (state.startSize.width !== width || state.startSize.height !== height) {
+ onResizeCallback(element);
+ }
+ }
+
+ if(onReadyCallbacks[id]) {
+ forEach$1(onReadyCallbacks[id], function(callback) {
+ callback();
+ });
+ }
+ } else {
+ // The element has been unisntalled before being detectable.
+ debug && reporter$1.log(id, "Element uninstalled before being detectable.");
+ }
+
+ delete onReadyCallbacks[id];
+
+ elementsReady++;
+ if(elementsReady === elements.length) {
+ onReadyCallback();
+ }
+ });
+ }
+
+ debug && reporter$1.log(id, "Already detecable, adding listener.");
+
+ //The element has been prepared to be detectable and is ready to be listened to.
+ addListener(callOnAdd, element, listener);
+ elementsReady++;
+ });
+
+ if(elementsReady === elements.length) {
+ onReadyCallback();
+ }
+ }
+
+ function uninstall(elements) {
+ if(!elements) {
+ return reporter$1.error("At least one element is required.");
+ }
+
+ if (isElement(elements)) {
+ // A single element has been passed in.
+ elements = [elements];
+ } else if (isCollection(elements)) {
+ // Convert collection to array for plugins.
+ // TODO: May want to check so that all the elements in the collection are valid elements.
+ elements = toArray(elements);
+ } else {
+ return reporter$1.error("Invalid arguments. Must be a DOM element or a collection of DOM elements.");
+ }
+
+ forEach$1(elements, function (element) {
+ eventListenerHandler.removeAllListeners(element);
+ detectionStrategy.uninstall(element);
+ stateHandler.cleanState(element);
+ });
+ }
+
+ return {
+ listenTo: listenTo,
+ removeListener: eventListenerHandler.removeListener,
+ removeAllListeners: eventListenerHandler.removeAllListeners,
+ uninstall: uninstall
+ };
+ };
+
+ function getOption(options, name, defaultValue) {
+ var value = options[name];
+
+ if((value === undefined || value === null) && defaultValue !== undefined) {
+ return defaultValue;
+ }
+
+ return value;
+ }
+
+ /*
+ object-assign
+ (c) Sindre Sorhus
+ @license MIT
+ */
+ /* eslint-disable no-unused-vars */
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+ var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+ var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+ function toObject(val) {
+ if (val === null || val === undefined) {
+ throw new TypeError('Object.assign cannot be called with null or undefined');
+ }
+
+ return Object(val);
+ }
+
+ function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+
+ // Detect buggy property enumeration order in older V8 versions.
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+ var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
+ test1[5] = 'de';
+ if (Object.getOwnPropertyNames(test1)[0] === '5') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2['_' + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+ return test2[n];
+ });
+ if (order2.join('') !== '0123456789') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test3 = {};
+ 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+ test3[letter] = letter;
+ });
+ if (Object.keys(Object.assign({}, test3)).join('') !==
+ 'abcdefghijklmnopqrst') {
+ return false;
+ }
+
+ return true;
+ } catch (err) {
+ // We don't expect any of the above to throw, but better to be safe.
+ return false;
+ }
+ }
+
+ var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
+ var from;
+ var to = toObject(target);
+ var symbols;
+
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+
+ for (var key in from) {
+ if (hasOwnProperty$1.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+
+ return to;
+ };
+
+ var scheduler_production_min = createCommonjsModule(function (module, exports) {
+ Object.defineProperty(exports,"__esModule",{value:!0});var d=null,e=!1,g=3,k=-1,l=-1,m=!1,n=!1;function p(){if(!m){var a=d.expirationTime;n?q():n=!0;r(t,a);}}
+ function u(){var a=d,b=d.next;if(d===b)d=null;else{var c=d.previous;d=c.next=b;b.previous=c;}a.next=a.previous=null;c=a.callback;b=a.expirationTime;a=a.priorityLevel;var f=g,Q=l;g=a;l=b;try{var h=c();}finally{g=f,l=Q;}if("function"===typeof h)if(h={callback:h,priorityLevel:a,expirationTime:b,next:null,previous:null},null===d)d=h.next=h.previous=h;else{c=null;a=d;do{if(a.expirationTime>=b){c=a;break}a=a.next;}while(a!==d);null===c?c=d:c===d&&(d=h,p());b=c.previous;b.next=c.previous=h;h.next=c;h.previous=
+ b;}}function v(){if(-1===k&&null!==d&&1===d.priorityLevel){m=!0;try{do u();while(null!==d&&1===d.priorityLevel)}finally{m=!1,null!==d?p():n=!1;}}}function t(a){m=!0;var b=e;e=a;try{if(a)for(;null!==d;){var c=exports.unstable_now();if(d.expirationTime<=c){do u();while(null!==d&&d.expirationTime<=c)}else break}else if(null!==d){do u();while(null!==d&&!w())}}finally{m=!1,e=b,null!==d?p():n=!1,v();}}
+ var x=Date,y="function"===typeof setTimeout?setTimeout:void 0,z="function"===typeof clearTimeout?clearTimeout:void 0,A="function"===typeof requestAnimationFrame?requestAnimationFrame:void 0,B="function"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,C,D;function E(a){C=A(function(b){z(D);a(b);});D=y(function(){B(C);a(exports.unstable_now());},100);}
+ if("object"===typeof performance&&"function"===typeof performance.now){var F=performance;exports.unstable_now=function(){return F.now()};}else exports.unstable_now=function(){return x.now()};var r,q,w,G=null;"undefined"!==typeof window?G=window:"undefined"!==typeof commonjsGlobal&&(G=commonjsGlobal);
+ if(G&&G._schedMock){var H=G._schedMock;r=H[0];q=H[1];w=H[2];exports.unstable_now=H[3];}else if("undefined"===typeof window||"function"!==typeof MessageChannel){var I=null,J=function(a){if(null!==I)try{I(a);}finally{I=null;}};r=function(a){null!==I?setTimeout(r,0,a):(I=a,setTimeout(J,0,!1));};q=function(){I=null;};w=function(){return !1};}else{"undefined"!==typeof console&&("function"!==typeof A&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),
+ "function"!==typeof B&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var K=null,L=!1,M=-1,N=!1,O=!1,P=0,R=33,S=33;w=function(){return P<=exports.unstable_now()};var T=new MessageChannel,U=T.port2;T.port1.onmessage=function(){L=!1;var a=K,b=M;K=null;M=-1;var c=exports.unstable_now(),f=!1;if(0>=P-c)if(-1!==b&&b<=c)f=!0;else{N||(N=!0,E(V));K=a;M=b;return}if(null!==a){O=!0;try{a(f);}finally{O=!1;}}};
+ var V=function(a){if(null!==K){E(V);var b=a-P+S;bb&&(b=8),S=bb?U.postMessage(void 0):N||(N=!0,E(V));};q=function(){K=null;L=!1;M=-1;};}exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;
+ exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3;}var c=g,f=k;g=a;k=exports.unstable_now();try{return b()}finally{g=c,k=f,v();}};exports.unstable_next=function(a){switch(g){case 1:case 2:case 3:var b=3;break;default:b=g;}var c=g,f=k;g=b;k=exports.unstable_now();try{return a()}finally{g=c,k=f,v();}};
+ exports.unstable_scheduleCallback=function(a,b){var c=-1!==k?k:exports.unstable_now();if("object"===typeof b&&null!==b&&"number"===typeof b.timeout)b=c+b.timeout;else switch(g){case 1:b=c+-1;break;case 2:b=c+250;break;case 5:b=c+1073741823;break;case 4:b=c+1E4;break;default:b=c+5E3;}a={callback:a,priorityLevel:g,expirationTime:b,next:null,previous:null};if(null===d)d=a.next=a.previous=a,p();else{c=null;var f=d;do{if(f.expirationTime>b){c=f;break}f=f.next;}while(f!==d);null===c?c=d:c===d&&(d=a,p());
+ b=c.previous;b.next=c.previous=a;a.next=c;a.previous=b;}return a};exports.unstable_cancelCallback=function(a){var b=a.next;if(null!==b){if(b===a)d=null;else{a===d&&(d=b);var c=a.previous;c.next=b;b.previous=c;}a.next=a.previous=null;}};exports.unstable_wrapCallback=function(a){var b=g;return function(){var c=g,f=k;g=b;k=exports.unstable_now();try{return a.apply(this,arguments)}finally{g=c,k=f,v();}}};exports.unstable_getCurrentPriorityLevel=function(){return g};
+ exports.unstable_shouldYield=function(){return !e&&(null!==d&&d.expirationTime= expirationTime) {
+ // This callback expires at or after the continuation. We will insert
+ // the continuation *before* this callback.
+ nextAfterContinuation = node;
+ break;
+ }
+ node = node.next;
+ } while (node !== firstCallbackNode);
+
+ if (nextAfterContinuation === null) {
+ // No equal or lower priority callback was found, which means the new
+ // callback is the lowest priority callback in the list.
+ nextAfterContinuation = firstCallbackNode;
+ } else if (nextAfterContinuation === firstCallbackNode) {
+ // The new callback is the highest priority callback in the list.
+ firstCallbackNode = continuationNode;
+ ensureHostCallbackIsScheduled();
+ }
+
+ var previous = nextAfterContinuation.previous;
+ previous.next = nextAfterContinuation.previous = continuationNode;
+ continuationNode.next = nextAfterContinuation;
+ continuationNode.previous = previous;
+ }
+ }
+ }
+
+ function flushImmediateWork() {
+ if (
+ // Confirm we've exited the outer most event handler
+ currentEventStartTime === -1 && firstCallbackNode !== null && firstCallbackNode.priorityLevel === ImmediatePriority) {
+ isExecutingCallback = true;
+ try {
+ do {
+ flushFirstCallback();
+ } while (
+ // Keep flushing until there are no more immediate callbacks
+ firstCallbackNode !== null && firstCallbackNode.priorityLevel === ImmediatePriority);
+ } finally {
+ isExecutingCallback = false;
+ if (firstCallbackNode !== null) {
+ // There's still work remaining. Request another callback.
+ ensureHostCallbackIsScheduled();
+ } else {
+ isHostCallbackScheduled = false;
+ }
+ }
+ }
+ }
+
+ function flushWork(didTimeout) {
+
+ isExecutingCallback = true;
+ var previousDidTimeout = currentDidTimeout;
+ currentDidTimeout = didTimeout;
+ try {
+ if (didTimeout) {
+ // Flush all the expired callbacks without yielding.
+ while (firstCallbackNode !== null && !(enableSchedulerDebugging && isSchedulerPaused)) {
+ // TODO Wrap in feature flag
+ // Read the current time. Flush all the callbacks that expire at or
+ // earlier than that time. Then read the current time again and repeat.
+ // This optimizes for as few performance.now calls as possible.
+ var currentTime = exports.unstable_now();
+ if (firstCallbackNode.expirationTime <= currentTime) {
+ do {
+ flushFirstCallback();
+ } while (firstCallbackNode !== null && firstCallbackNode.expirationTime <= currentTime && !(enableSchedulerDebugging && isSchedulerPaused));
+ continue;
+ }
+ break;
+ }
+ } else {
+ // Keep flushing callbacks until we run out of time in the frame.
+ if (firstCallbackNode !== null) {
+ do {
+ if (enableSchedulerDebugging && isSchedulerPaused) {
+ break;
+ }
+ flushFirstCallback();
+ } while (firstCallbackNode !== null && !shouldYieldToHost());
+ }
+ }
+ } finally {
+ isExecutingCallback = false;
+ currentDidTimeout = previousDidTimeout;
+ if (firstCallbackNode !== null) {
+ // There's still work remaining. Request another callback.
+ ensureHostCallbackIsScheduled();
+ } else {
+ isHostCallbackScheduled = false;
+ }
+ // Before exiting, flush all the immediate work that was scheduled.
+ flushImmediateWork();
+ }
+ }
+
+ function unstable_runWithPriority(priorityLevel, eventHandler) {
+ switch (priorityLevel) {
+ case ImmediatePriority:
+ case UserBlockingPriority:
+ case NormalPriority:
+ case LowPriority:
+ case IdlePriority:
+ break;
+ default:
+ priorityLevel = NormalPriority;
+ }
+
+ var previousPriorityLevel = currentPriorityLevel;
+ var previousEventStartTime = currentEventStartTime;
+ currentPriorityLevel = priorityLevel;
+ currentEventStartTime = exports.unstable_now();
+
+ try {
+ return eventHandler();
+ } finally {
+ currentPriorityLevel = previousPriorityLevel;
+ currentEventStartTime = previousEventStartTime;
+
+ // Before exiting, flush all the immediate work that was scheduled.
+ flushImmediateWork();
+ }
+ }
+
+ function unstable_next(eventHandler) {
+ var priorityLevel = void 0;
+ switch (currentPriorityLevel) {
+ case ImmediatePriority:
+ case UserBlockingPriority:
+ case NormalPriority:
+ // Shift down to normal priority
+ priorityLevel = NormalPriority;
+ break;
+ default:
+ // Anything lower than normal priority should remain at the current level.
+ priorityLevel = currentPriorityLevel;
+ break;
+ }
+
+ var previousPriorityLevel = currentPriorityLevel;
+ var previousEventStartTime = currentEventStartTime;
+ currentPriorityLevel = priorityLevel;
+ currentEventStartTime = exports.unstable_now();
+
+ try {
+ return eventHandler();
+ } finally {
+ currentPriorityLevel = previousPriorityLevel;
+ currentEventStartTime = previousEventStartTime;
+
+ // Before exiting, flush all the immediate work that was scheduled.
+ flushImmediateWork();
+ }
+ }
+
+ function unstable_wrapCallback(callback) {
+ var parentPriorityLevel = currentPriorityLevel;
+ return function () {
+ // This is a fork of runWithPriority, inlined for performance.
+ var previousPriorityLevel = currentPriorityLevel;
+ var previousEventStartTime = currentEventStartTime;
+ currentPriorityLevel = parentPriorityLevel;
+ currentEventStartTime = exports.unstable_now();
+
+ try {
+ return callback.apply(this, arguments);
+ } finally {
+ currentPriorityLevel = previousPriorityLevel;
+ currentEventStartTime = previousEventStartTime;
+ flushImmediateWork();
+ }
+ };
+ }
+
+ function unstable_scheduleCallback(callback, deprecated_options) {
+ var startTime = currentEventStartTime !== -1 ? currentEventStartTime : exports.unstable_now();
+
+ var expirationTime;
+ if (typeof deprecated_options === 'object' && deprecated_options !== null && typeof deprecated_options.timeout === 'number') {
+ // FIXME: Remove this branch once we lift expiration times out of React.
+ expirationTime = startTime + deprecated_options.timeout;
+ } else {
+ switch (currentPriorityLevel) {
+ case ImmediatePriority:
+ expirationTime = startTime + IMMEDIATE_PRIORITY_TIMEOUT;
+ break;
+ case UserBlockingPriority:
+ expirationTime = startTime + USER_BLOCKING_PRIORITY;
+ break;
+ case IdlePriority:
+ expirationTime = startTime + IDLE_PRIORITY;
+ break;
+ case LowPriority:
+ expirationTime = startTime + LOW_PRIORITY_TIMEOUT;
+ break;
+ case NormalPriority:
+ default:
+ expirationTime = startTime + NORMAL_PRIORITY_TIMEOUT;
+ }
+ }
+
+ var newNode = {
+ callback: callback,
+ priorityLevel: currentPriorityLevel,
+ expirationTime: expirationTime,
+ next: null,
+ previous: null
+ };
+
+ // Insert the new callback into the list, ordered first by expiration, then
+ // by insertion. So the new callback is inserted any other callback with
+ // equal expiration.
+ if (firstCallbackNode === null) {
+ // This is the first callback in the list.
+ firstCallbackNode = newNode.next = newNode.previous = newNode;
+ ensureHostCallbackIsScheduled();
+ } else {
+ var next = null;
+ var node = firstCallbackNode;
+ do {
+ if (node.expirationTime > expirationTime) {
+ // The new callback expires before this one.
+ next = node;
+ break;
+ }
+ node = node.next;
+ } while (node !== firstCallbackNode);
+
+ if (next === null) {
+ // No callback with a later expiration was found, which means the new
+ // callback has the latest expiration in the list.
+ next = firstCallbackNode;
+ } else if (next === firstCallbackNode) {
+ // The new callback has the earliest expiration in the entire list.
+ firstCallbackNode = newNode;
+ ensureHostCallbackIsScheduled();
+ }
+
+ var previous = next.previous;
+ previous.next = next.previous = newNode;
+ newNode.next = next;
+ newNode.previous = previous;
+ }
+
+ return newNode;
+ }
+
+ function unstable_pauseExecution() {
+ isSchedulerPaused = true;
+ }
+
+ function unstable_continueExecution() {
+ isSchedulerPaused = false;
+ if (firstCallbackNode !== null) {
+ ensureHostCallbackIsScheduled();
+ }
+ }
+
+ function unstable_getFirstCallbackNode() {
+ return firstCallbackNode;
+ }
+
+ function unstable_cancelCallback(callbackNode) {
+ var next = callbackNode.next;
+ if (next === null) {
+ // Already cancelled.
+ return;
+ }
+
+ if (next === callbackNode) {
+ // This is the only scheduled callback. Clear the list.
+ firstCallbackNode = null;
+ } else {
+ // Remove the callback from its position in the list.
+ if (callbackNode === firstCallbackNode) {
+ firstCallbackNode = next;
+ }
+ var previous = callbackNode.previous;
+ previous.next = next;
+ next.previous = previous;
+ }
+
+ callbackNode.next = callbackNode.previous = null;
+ }
+
+ function unstable_getCurrentPriorityLevel() {
+ return currentPriorityLevel;
+ }
+
+ function unstable_shouldYield() {
+ return !currentDidTimeout && (firstCallbackNode !== null && firstCallbackNode.expirationTime < currentExpirationTime || shouldYieldToHost());
+ }
+
+ // The remaining code is essentially a polyfill for requestIdleCallback. It
+ // works by scheduling a requestAnimationFrame, storing the time for the start
+ // of the frame, then scheduling a postMessage which gets scheduled after paint.
+ // Within the postMessage handler do as much work as possible until time + frame
+ // rate. By separating the idle call into a separate event tick we ensure that
+ // layout, paint and other browser work is counted against the available time.
+ // The frame rate is dynamically adjusted.
+
+ // We capture a local reference to any global, in case it gets polyfilled after
+ // this module is initially evaluated. We want to be using a
+ // consistent implementation.
+ var localDate = Date;
+
+ // This initialization code may run even on server environments if a component
+ // just imports ReactDOM (e.g. for findDOMNode). Some environments might not
+ // have setTimeout or clearTimeout. However, we always expect them to be defined
+ // on the client. https://github.com/facebook/react/pull/13088
+ var localSetTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
+ var localClearTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
+
+ // We don't expect either of these to necessarily be defined, but we will error
+ // later if they are missing on the client.
+ var localRequestAnimationFrame = typeof requestAnimationFrame === 'function' ? requestAnimationFrame : undefined;
+ var localCancelAnimationFrame = typeof cancelAnimationFrame === 'function' ? cancelAnimationFrame : undefined;
+
+ // requestAnimationFrame does not run when the tab is in the background. If
+ // we're backgrounded we prefer for that work to happen so that the page
+ // continues to load in the background. So we also schedule a 'setTimeout' as
+ // a fallback.
+ // TODO: Need a better heuristic for backgrounded work.
+ var ANIMATION_FRAME_TIMEOUT = 100;
+ var rAFID;
+ var rAFTimeoutID;
+ var requestAnimationFrameWithTimeout = function (callback) {
+ // schedule rAF and also a setTimeout
+ rAFID = localRequestAnimationFrame(function (timestamp) {
+ // cancel the setTimeout
+ localClearTimeout(rAFTimeoutID);
+ callback(timestamp);
+ });
+ rAFTimeoutID = localSetTimeout(function () {
+ // cancel the requestAnimationFrame
+ localCancelAnimationFrame(rAFID);
+ callback(exports.unstable_now());
+ }, ANIMATION_FRAME_TIMEOUT);
+ };
+
+ if (hasNativePerformanceNow) {
+ var Performance = performance;
+ exports.unstable_now = function () {
+ return Performance.now();
+ };
+ } else {
+ exports.unstable_now = function () {
+ return localDate.now();
+ };
+ }
+
+ var requestHostCallback;
+ var cancelHostCallback;
+ var shouldYieldToHost;
+
+ var globalValue = null;
+ if (typeof window !== 'undefined') {
+ globalValue = window;
+ } else if (typeof commonjsGlobal !== 'undefined') {
+ globalValue = commonjsGlobal;
+ }
+
+ if (globalValue && globalValue._schedMock) {
+ // Dynamic injection, only for testing purposes.
+ var globalImpl = globalValue._schedMock;
+ requestHostCallback = globalImpl[0];
+ cancelHostCallback = globalImpl[1];
+ shouldYieldToHost = globalImpl[2];
+ exports.unstable_now = globalImpl[3];
+ } else if (
+ // If Scheduler runs in a non-DOM environment, it falls back to a naive
+ // implementation using setTimeout.
+ typeof window === 'undefined' ||
+ // Check if MessageChannel is supported, too.
+ typeof MessageChannel !== 'function') {
+ // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,
+ // fallback to a naive implementation.
+ var _callback = null;
+ var _flushCallback = function (didTimeout) {
+ if (_callback !== null) {
+ try {
+ _callback(didTimeout);
+ } finally {
+ _callback = null;
+ }
+ }
+ };
+ requestHostCallback = function (cb, ms) {
+ if (_callback !== null) {
+ // Protect against re-entrancy.
+ setTimeout(requestHostCallback, 0, cb);
+ } else {
+ _callback = cb;
+ setTimeout(_flushCallback, 0, false);
+ }
+ };
+ cancelHostCallback = function () {
+ _callback = null;
+ };
+ shouldYieldToHost = function () {
+ return false;
+ };
+ } else {
+ if (typeof console !== 'undefined') {
+ // TODO: Remove fb.me link
+ if (typeof localRequestAnimationFrame !== 'function') {
+ console.error("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+ }
+ if (typeof localCancelAnimationFrame !== 'function') {
+ console.error("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+ }
+ }
+
+ var scheduledHostCallback = null;
+ var isMessageEventScheduled = false;
+ var timeoutTime = -1;
+
+ var isAnimationFrameScheduled = false;
+
+ var isFlushingHostCallback = false;
+
+ var frameDeadline = 0;
+ // We start out assuming that we run at 30fps but then the heuristic tracking
+ // will adjust this value to a faster fps if we get more frequent animation
+ // frames.
+ var previousFrameTime = 33;
+ var activeFrameTime = 33;
+
+ shouldYieldToHost = function () {
+ return frameDeadline <= exports.unstable_now();
+ };
+
+ // We use the postMessage trick to defer idle work until after the repaint.
+ var channel = new MessageChannel();
+ var port = channel.port2;
+ channel.port1.onmessage = function (event) {
+ isMessageEventScheduled = false;
+
+ var prevScheduledCallback = scheduledHostCallback;
+ var prevTimeoutTime = timeoutTime;
+ scheduledHostCallback = null;
+ timeoutTime = -1;
+
+ var currentTime = exports.unstable_now();
+
+ var didTimeout = false;
+ if (frameDeadline - currentTime <= 0) {
+ // There's no time left in this idle period. Check if the callback has
+ // a timeout and whether it's been exceeded.
+ if (prevTimeoutTime !== -1 && prevTimeoutTime <= currentTime) {
+ // Exceeded the timeout. Invoke the callback even though there's no
+ // time left.
+ didTimeout = true;
+ } else {
+ // No timeout.
+ if (!isAnimationFrameScheduled) {
+ // Schedule another animation callback so we retry later.
+ isAnimationFrameScheduled = true;
+ requestAnimationFrameWithTimeout(animationTick);
+ }
+ // Exit without invoking the callback.
+ scheduledHostCallback = prevScheduledCallback;
+ timeoutTime = prevTimeoutTime;
+ return;
+ }
+ }
+
+ if (prevScheduledCallback !== null) {
+ isFlushingHostCallback = true;
+ try {
+ prevScheduledCallback(didTimeout);
+ } finally {
+ isFlushingHostCallback = false;
+ }
+ }
+ };
+
+ var animationTick = function (rafTime) {
+ if (scheduledHostCallback !== null) {
+ // Eagerly schedule the next animation callback at the beginning of the
+ // frame. If the scheduler queue is not empty at the end of the frame, it
+ // will continue flushing inside that callback. If the queue *is* empty,
+ // then it will exit immediately. Posting the callback at the start of the
+ // frame ensures it's fired within the earliest possible frame. If we
+ // waited until the end of the frame to post the callback, we risk the
+ // browser skipping a frame and not firing the callback until the frame
+ // after that.
+ requestAnimationFrameWithTimeout(animationTick);
+ } else {
+ // No pending work. Exit.
+ isAnimationFrameScheduled = false;
+ return;
+ }
+
+ var nextFrameTime = rafTime - frameDeadline + activeFrameTime;
+ if (nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime) {
+ if (nextFrameTime < 8) {
+ // Defensive coding. We don't support higher frame rates than 120hz.
+ // If the calculated frame time gets lower than 8, it is probably a bug.
+ nextFrameTime = 8;
+ }
+ // If one frame goes long, then the next one can be short to catch up.
+ // If two frames are short in a row, then that's an indication that we
+ // actually have a higher frame rate than what we're currently optimizing.
+ // We adjust our heuristic dynamically accordingly. For example, if we're
+ // running on 120hz display or 90hz VR display.
+ // Take the max of the two in case one of them was an anomaly due to
+ // missed frame deadlines.
+ activeFrameTime = nextFrameTime < previousFrameTime ? previousFrameTime : nextFrameTime;
+ } else {
+ previousFrameTime = nextFrameTime;
+ }
+ frameDeadline = rafTime + activeFrameTime;
+ if (!isMessageEventScheduled) {
+ isMessageEventScheduled = true;
+ port.postMessage(undefined);
+ }
+ };
+
+ requestHostCallback = function (callback, absoluteTimeout) {
+ scheduledHostCallback = callback;
+ timeoutTime = absoluteTimeout;
+ if (isFlushingHostCallback || absoluteTimeout < 0) {
+ // Don't wait for the next frame. Continue working ASAP, in a new event.
+ port.postMessage(undefined);
+ } else if (!isAnimationFrameScheduled) {
+ // If rAF didn't already schedule one, we need to schedule a frame.
+ // TODO: If this rAF doesn't materialize because the browser throttles, we
+ // might want to still have setTimeout trigger rIC as a backup to ensure
+ // that we keep performing work.
+ isAnimationFrameScheduled = true;
+ requestAnimationFrameWithTimeout(animationTick);
+ }
+ };
+
+ cancelHostCallback = function () {
+ scheduledHostCallback = null;
+ isMessageEventScheduled = false;
+ timeoutTime = -1;
+ };
+ }
+
+ exports.unstable_ImmediatePriority = ImmediatePriority;
+ exports.unstable_UserBlockingPriority = UserBlockingPriority;
+ exports.unstable_NormalPriority = NormalPriority;
+ exports.unstable_IdlePriority = IdlePriority;
+ exports.unstable_LowPriority = LowPriority;
+ exports.unstable_runWithPriority = unstable_runWithPriority;
+ exports.unstable_next = unstable_next;
+ exports.unstable_scheduleCallback = unstable_scheduleCallback;
+ exports.unstable_cancelCallback = unstable_cancelCallback;
+ exports.unstable_wrapCallback = unstable_wrapCallback;
+ exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
+ exports.unstable_shouldYield = unstable_shouldYield;
+ exports.unstable_continueExecution = unstable_continueExecution;
+ exports.unstable_pauseExecution = unstable_pauseExecution;
+ exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;
+ })();
+ }
+ });
+
+ unwrapExports(scheduler_development);
+ var scheduler_development_1 = scheduler_development.unstable_now;
+ var scheduler_development_2 = scheduler_development.unstable_ImmediatePriority;
+ var scheduler_development_3 = scheduler_development.unstable_UserBlockingPriority;
+ var scheduler_development_4 = scheduler_development.unstable_NormalPriority;
+ var scheduler_development_5 = scheduler_development.unstable_IdlePriority;
+ var scheduler_development_6 = scheduler_development.unstable_LowPriority;
+ var scheduler_development_7 = scheduler_development.unstable_runWithPriority;
+ var scheduler_development_8 = scheduler_development.unstable_next;
+ var scheduler_development_9 = scheduler_development.unstable_scheduleCallback;
+ var scheduler_development_10 = scheduler_development.unstable_cancelCallback;
+ var scheduler_development_11 = scheduler_development.unstable_wrapCallback;
+ var scheduler_development_12 = scheduler_development.unstable_getCurrentPriorityLevel;
+ var scheduler_development_13 = scheduler_development.unstable_shouldYield;
+ var scheduler_development_14 = scheduler_development.unstable_continueExecution;
+ var scheduler_development_15 = scheduler_development.unstable_pauseExecution;
+ var scheduler_development_16 = scheduler_development.unstable_getFirstCallbackNode;
+
+ var scheduler = createCommonjsModule(function (module) {
+
+ if (process.env.NODE_ENV === 'production') {
+ module.exports = scheduler_production_min;
+ } else {
+ module.exports = scheduler_development;
+ }
+ });
+
+ function ba(a,b,c,d,e,f,g,h){if(!a){a=void 0;if(void 0===b)a=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[c,d,e,f,g,h],k=0;a=Error(b.replace(/%s/g,function(){return l[k++]}));a.name="Invariant Violation";}a.framesToPop=1;throw a;}}
+ function x(a){for(var b=arguments.length-1,c="https://reactjs.org/docs/error-decoder.html?invariant="+a,d=0;dthis.eventPool.length&&this.eventPool.push(a);}
+ function hb(a){a.eventPool=[];a.getPooled=ib;a.release=jb;}var kb=y.extend({data:null}),lb=y.extend({data:null}),mb=[9,13,27,32],nb=Ra&&"CompositionEvent"in window,ob=null;Ra&&"documentMode"in document&&(ob=document.documentMode);
+ var pb=Ra&&"TextEvent"in window&&!ob,qb=Ra&&(!nb||ob&&8=ob),rb=String.fromCharCode(32),sb={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",
+ captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},tb=!1;
+ function ub(a,b){switch(a){case "keyup":return -1!==mb.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return !0;default:return !1}}function vb(a){a=a.detail;return "object"===typeof a&&"data"in a?a.data:null}var wb=!1;function xb(a,b){switch(a){case "compositionend":return vb(b);case "keypress":if(32!==b.which)return null;tb=!0;return rb;case "textInput":return a=b.data,a===rb&&tb?null:a;default:return null}}
+ function yb(a,b){if(wb)return "compositionend"===a||!nb&&ub(a,b)?(a=eb(),db=cb=bb=null,wb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1b}return !1}function C$1(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;}var D$1={};
+ "children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){D$1[a]=new C$1(a,0,!1,a,null);});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];D$1[b]=new C$1(b,1,!1,a[1],null);});["contentEditable","draggable","spellCheck","value"].forEach(function(a){D$1[a]=new C$1(a,2,!1,a.toLowerCase(),null);});
+ ["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){D$1[a]=new C$1(a,2,!1,a,null);});"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){D$1[a]=new C$1(a,3,!1,a.toLowerCase(),null);});["checked","multiple","muted","selected"].forEach(function(a){D$1[a]=new C$1(a,3,!0,a,null);});
+ ["capture","download"].forEach(function(a){D$1[a]=new C$1(a,4,!1,a,null);});["cols","rows","size","span"].forEach(function(a){D$1[a]=new C$1(a,6,!1,a,null);});["rowSpan","start"].forEach(function(a){D$1[a]=new C$1(a,5,!1,a.toLowerCase(),null);});var rc=/[\-:]([a-z])/g;function sc(a){return a[1].toUpperCase()}
+ "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(rc,
+ sc);D$1[b]=new C$1(b,1,!1,a,null);});"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(rc,sc);D$1[b]=new C$1(b,1,!1,a,"http://www.w3.org/1999/xlink");});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(rc,sc);D$1[b]=new C$1(b,1,!1,a,"http://www.w3.org/XML/1998/namespace");});["tabIndex","crossOrigin"].forEach(function(a){D$1[a]=new C$1(a,1,!1,a.toLowerCase(),null);});
+ function tc(a,b,c,d){var e=D$1.hasOwnProperty(b)?D$1[b]:null;var f=null!==e?0===e.type:d?!1:!(2zd.length&&zd.push(a);}}}var Fd={},Gd=0,Hd="_reactListenersID"+(""+Math.random()).slice(2);
+ function Id(a){Object.prototype.hasOwnProperty.call(a,Hd)||(a[Hd]=Gd++,Fd[a[Hd]]={});return Fd[a[Hd]]}function Jd(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Kd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}
+ function Ld(a,b){var c=Kd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return {node:c,offset:b-a};a=d;}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode;}c=void 0;}c=Kd(c);}}function Md(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Md(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}
+ function Nd(){for(var a=window,b=Jd();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href;}catch(d){c=!1;}if(c)a=b.contentWindow;else break;b=Jd(a.document);}return b}function Od(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}
+ function Pd(){var a=Nd();if(Od(a)){if("selectionStart"in a)var b={start:a.selectionStart,end:a.selectionEnd};else a:{b=(b=a.ownerDocument)&&b.defaultView||window;var c=b.getSelection&&b.getSelection();if(c&&0!==c.rangeCount){b=c.anchorNode;var d=c.anchorOffset,e=c.focusNode;c=c.focusOffset;try{b.nodeType,e.nodeType;}catch(A){b=null;break a}var f=0,g=-1,h=-1,l=0,k=0,m=a,p=null;b:for(;;){for(var t;;){m!==b||0!==d&&3!==m.nodeType||(g=f+d);m!==e||0!==c&&3!==m.nodeType||(h=f+c);3===m.nodeType&&(f+=m.nodeValue.length);
+ if(null===(t=m.firstChild))break;p=m;m=t;}for(;;){if(m===a)break b;p===b&&++l===d&&(g=f);p===e&&++k===c&&(h=f);if(null!==(t=m.nextSibling))break;m=p;p=m.parentNode;}m=t;}b=-1===g||-1===h?null:{start:g,end:h};}else b=null;}b=b||{start:0,end:0};}else b=null;return {focusedElem:a,selectionRange:b}}
+ function Qd(a){var b=Nd(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Md(c.ownerDocument.documentElement,c)){if(null!==d&&Od(c))if(b=d.start,a=d.end,void 0===a&&(a=b),"selectionStart"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ld(c,f);var g=Ld(c,
+ d);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)));}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});"function"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Sd={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},Td=null,Ud=null,Vd=null,Wd=!1;
+ function Xd(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(Wd||null==Td||Td!==Jd(c))return null;c=Td;"selectionStart"in c&&Od(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Vd&&dd(Vd,c)?null:(Vd=c,a=y.getPooled(Sd.select,Ud,a,b),a.type="select",a.target=Td,Qa(a),a)}
+ var Yd={eventTypes:Sd,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=Id(e);f=sa.onSelect;for(var g=0;g=b.length?void 0:x("93"),b=b[0]),c=b),null==c&&(c=""));a._wrapperState={initialValue:uc(c)};}
+ function de(a,b){var c=uc(b.value),d=uc(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d);}function ee(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b);}var fe={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};
+ function ge(a){switch(a){case "svg":return "http://www.w3.org/2000/svg";case "math":return "http://www.w3.org/1998/Math/MathML";default:return "http://www.w3.org/1999/xhtml"}}function he(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?ge(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}
+ var ie=void 0,je=function(a){return "undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)});}:a}(function(a,b){if(a.namespaceURI!==fe.svg||"innerHTML"in a)a.innerHTML=b;else{ie=ie||document.createElement("div");ie.innerHTML="";for(b=ie.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild);}});
+ function ke(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b;}
+ var le={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,
+ floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];Object.keys(le).forEach(function(a){me.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);le[b]=le[a];});});function ne(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||le.hasOwnProperty(a)&&le[a]?(""+b).trim():b+"px"}
+ function oe(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=ne(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e;}}var pe=objectAssign({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});
+ function qe(a,b){b&&(pe[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?x("137",a,""):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?x("60"):void 0,"object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML?void 0:x("61")),null!=b.style&&"object"!==typeof b.style?x("62",""):void 0);}
+ function re(a,b){if(-1===a.indexOf("-"))return "string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return !1;default:return !0}}
+ function se(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Id(a);b=sa[b];for(var d=0;dGe||(a.current=Fe[Ge],Fe[Ge]=null,Ge--);}function G(a,b){Ge++;Fe[Ge]=a.current;a.current=b;}var He={},H={current:He},I={current:!1},Ie=He;
+ function Je(a,b){var c=a.type.contextTypes;if(!c)return He;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function J(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Ke(a){F(I);F(H);}function Le(a){F(I);F(H);}
+ function Me(a,b,c){H.current!==He?x("168"):void 0;G(H,b);G(I,c);}function Ne(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)e in a?void 0:x("108",ic(b)||"Unknown",e);return objectAssign({},c,d)}function Oe(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||He;Ie=H.current;G(H,b);G(I,I.current);return !0}
+ function Pe(a,b,c){var d=a.stateNode;d?void 0:x("169");c?(b=Ne(a,b,Ie),d.__reactInternalMemoizedMergedChildContext=b,F(I),F(H),G(H,b)):F(I);G(I,c);}var Qe=null,Re=null;function Se(a){return function(b){try{return a(b)}catch(c){}}}
+ function Te(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return !1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return !0;try{var c=b.inject(a);Qe=Se(function(a){return b.onCommitFiberRoot(c,a)});Re=Se(function(a){return b.onCommitFiberUnmount(c,a)});}catch(d){}return !0}
+ function Ue(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.contextDependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null;}function K$1(a,b,c,d){return new Ue(a,b,c,d)}
+ function Ve(a){a=a.prototype;return !(!a||!a.isReactComponent)}function We(a){if("function"===typeof a)return Ve(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===cc)return 11;if(a===ec)return 14}return 2}
+ function Xe(a,b){var c=a.alternate;null===c?(c=K$1(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;c.contextDependencies=a.contextDependencies;c.sibling=a.sibling;
+ c.index=a.index;c.ref=a.ref;return c}
+ function Ye(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)Ve(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case Xb:return Ze(c.children,e,f,b);case bc:return $e(c,e|3,f,b);case Yb:return $e(c,e|2,f,b);case Zb:return a=K$1(12,c,b,e|4),a.elementType=Zb,a.type=Zb,a.expirationTime=f,a;case dc:return a=K$1(13,c,b,e),a.elementType=dc,a.type=dc,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case $b:g=10;break a;case ac:g=9;break a;case cc:g=11;break a;case ec:g=
+ 14;break a;case fc:g=16;d=null;break a}x("130",null==a?a:typeof a,"");}b=K$1(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ze(a,b,c,d){a=K$1(7,a,d,b);a.expirationTime=c;return a}function $e(a,b,c,d){a=K$1(8,a,d,b);b=0===(b&1)?Yb:bc;a.elementType=b;a.type=b;a.expirationTime=c;return a}function af(a,b,c){a=K$1(6,a,null,b);a.expirationTime=c;return a}
+ function bf(a,b,c){b=K$1(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function cf(a,b){a.didError=!1;var c=a.earliestPendingTime;0===c?a.earliestPendingTime=a.latestPendingTime=b:cb&&(a.latestPendingTime=b);df(b,a);}
+ function ef(a,b){a.didError=!1;if(0===b)a.earliestPendingTime=0,a.latestPendingTime=0,a.earliestSuspendedTime=0,a.latestSuspendedTime=0,a.latestPingedTime=0;else{bb?a.earliestPendingTime=a.latestPendingTime=0:a.earliestPendingTime>b&&(a.earliestPendingTime=a.latestPendingTime));c=a.earliestSuspendedTime;0===c?cf(a,b):bc&&cf(a,b);}df(0,a);}function ff(a,b){a.didError=!1;a.latestPingedTime>=b&&(a.latestPingedTime=0);var c=a.earliestPendingTime,d=a.latestPendingTime;c===b?a.earliestPendingTime=d===b?a.latestPendingTime=0:d:d===b&&(a.latestPendingTime=c);c=a.earliestSuspendedTime;d=a.latestSuspendedTime;0===c?a.earliestSuspendedTime=a.latestSuspendedTime=b:cb&&(a.latestSuspendedTime=b);df(b,a);}
+ function gf(a,b){var c=a.earliestPendingTime;a=a.earliestSuspendedTime;c>b&&(b=c);a>b&&(b=a);return b}function df(a,b){var c=b.earliestSuspendedTime,d=b.latestSuspendedTime,e=b.earliestPendingTime,f=b.latestPingedTime;e=0!==e?e:f;0===e&&(0===a||da&&(a=c);b.nextExpirationTimeToWorkOn=e;b.expirationTime=a;}function L(a,b){if(a&&a.defaultProps){b=objectAssign({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);}return b}
+ function hf(a){var b=a._result;switch(a._status){case 1:return b;case 2:throw b;case 0:throw b;default:a._status=0;b=a._ctor;b=b();b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b);},function(b){0===a._status&&(a._status=2,a._result=b);});switch(a._status){case 1:return a._result;case 2:throw a._result;}a._result=b;throw b;}}var jf=(new React__default.Component).refs;
+ function kf(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:objectAssign({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c);}
+ var tf={isMounted:function(a){return (a=a._reactInternalFiber)?2===ed(a):!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d);},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=lf();d=mf(d,a);var e=nf(d);e.tag=rf;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);of();pf(a,e);qf(a,d);},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=lf();c=mf(c,a);var d=nf(c);d.tag=
+ sf;void 0!==b&&null!==b&&(d.callback=b);of();pf(a,d);qf(a,c);}};function uf(a,b,c,d,e,f,g){a=a.stateNode;return "function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!dd(c,d)||!dd(e,f):!0}
+ function vf(a,b,c){var d=!1,e=He;var f=b.contextType;"object"===typeof f&&null!==f?f=M(f):(e=J(b)?Ie:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Je(a,e):He);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=tf;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}
+ function wf(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&tf.enqueueReplaceState(b,b.state,null);}
+ function xf(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=jf;var f=b.contextType;"object"===typeof f&&null!==f?e.context=M(f):(f=J(b)?Ie:H.current,e.context=Je(a,f));f=a.updateQueue;null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;"function"===typeof f&&(kf(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==
+ typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&tf.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(yf(a,f,c,e,d),e.state=a.memoizedState));"function"===typeof e.componentDidMount&&(a.effectTag|=4);}var zf=Array.isArray;
+ function Af(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(1!==c.tag?x("309"):void 0,d=c.stateNode);d?void 0:x("147",a);var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===jf&&(b=d.refs={});null===a?delete b[e]:b[e]=a;};b._stringRef=e;return b}"string"!==typeof a?x("284"):void 0;c._owner?void 0:x("290",a);}return a}
+ function Bf(a,b){"textarea"!==a.type&&x("31","[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,"");}
+ function Cf(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8;}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Xe(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,du?(B=q,q=null):B=q.sibling;var w=t(e,q,h[u],k);if(null===w){null===q&&(q=B);break}a&&
+ q&&null===w.alternate&&b(e,q);g=f(w,g,u);null===m?l=w:m.sibling=w;m=w;q=B;}if(u===h.length)return c(e,q),l;if(null===q){for(;uu?(B=q,q=null):B=q.sibling;var v=t(e,q,w.value,k);if(null===v){q||(q=B);break}a&&q&&null===v.alternate&&b(e,q);g=f(v,g,u);null===m?l=v:m.sibling=v;m=v;q=B;}if(w.done)return c(e,q),l;if(null===q){for(;!w.done;u++,w=h.next())w=p(e,w.value,k),null!==w&&(g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);return l}for(q=d(e,q);!w.done;u++,w=h.next())w=A(q,e,u,w.value,k),null!==w&&(a&&null!==w.alternate&&q.delete(null===w.key?u:
+ w.key),g=f(w,g,u),null===m?l=w:m.sibling=w,m=w);a&&q.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!==f&&f.type===Xb&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Vb:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===Xb:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Xb?f.props.children:f.props);d.ref=Af(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=
+ k.sibling;}f.type===Xb?(d=Ze(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ye(f.type,f.key,f.props,null,a.mode,h),h.ref=Af(a,d,f),h.return=a,a=h);}return g(a);case Wb:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling;}d=bf(f,a.mode,h);d.return=a;a=d;}return g(a)}if("string"===typeof f||"number"===typeof f)return f=
+ ""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=af(f,a.mode,h),d.return=a,a=d),g(a);if(zf(f))return v(a,d,f,h);if(hc(f))return R(a,d,f,h);l&&Bf(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 0:h=a.type,x("152",h.displayName||h.name||"Component");}return c(a,d)}}var Df=Cf(!0),Ef=Cf(!1),Ff={},N={current:Ff},Gf={current:Ff},Hf={current:Ff};function If(a){a===Ff?x("174"):void 0;return a}
+ function Jf(a,b){G(Hf,b);G(Gf,a);G(N,Ff);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:he(null,"");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=he(b,c);}F(N);G(N,b);}function Kf(a){F(N);F(Gf);F(Hf);}function Lf(a){If(Hf.current);var b=If(N.current);var c=he(b,a.type);b!==c&&(G(Gf,a),G(N,c));}function Mf(a){Gf.current===a&&(F(N),F(Gf));}
+ var Nf=0,Of=2,Pf=4,Qf=8,Rf=16,Sf=32,Tf=64,Uf=128,Vf=Tb.ReactCurrentDispatcher,Wf=0,Xf=null,O=null,P=null,Yf=null,Q=null,Zf=null,$f=0,ag=null,bg=0,cg=!1,dg=null,eg=0;function fg(){x("321");}function gg(a,b){if(null===b)return !1;for(var c=0;c$f&&($f=m)):f=l.eagerReducer===a?l.eagerState:a(f,l.action);g=l;l=l.next;}while(null!==l&&l!==d);k||(h=g,e=f);bd(f,b.memoizedState)||(qg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f;}return [b.memoizedState,c.dispatch]}
+ function rg(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ag?(ag={lastEffect:null},ag.lastEffect=a.next=a):(b=ag.lastEffect,null===b?ag.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ag.lastEffect=a));return a}function sg(a,b,c,d){var e=mg();bg|=a;e.memoizedState=rg(b,c,void 0,void 0===d?null:d);}
+ function tg(a,b,c,d){var e=ng();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&gg(d,g.deps)){rg(Nf,c,f,d);return}}bg|=a;e.memoizedState=rg(b,c,f,d);}function ug(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null);};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null;}}function vg(){}
+ function wg(a,b,c){25>eg?void 0:x("301");var d=a.alternate;if(a===Xf||null!==d&&d===Xf)if(cg=!0,a={expirationTime:Wf,action:c,eagerReducer:null,eagerState:null,next:null},null===dg&&(dg=new Map),c=dg.get(b),void 0===c)dg.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a;}else{of();var e=lf();e=mf(e,a);var f={expirationTime:e,action:c,eagerReducer:null,eagerState:null,next:null},g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&(f.next=h);g.next=f;}b.last=f;if(0===a.expirationTime&&(null===
+ d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var l=b.lastRenderedState,k=d(l,c);f.eagerReducer=d;f.eagerState=k;if(bd(k,l))return}catch(m){}finally{}qf(a,e);}}
+ var kg={readContext:M,useCallback:fg,useContext:fg,useEffect:fg,useImperativeHandle:fg,useLayoutEffect:fg,useMemo:fg,useReducer:fg,useRef:fg,useState:fg,useDebugValue:fg},ig={readContext:M,useCallback:function(a,b){mg().memoizedState=[a,void 0===b?null:b];return a},useContext:M,useEffect:function(a,b){return sg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return sg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,b){return sg(4,Pf|Sf,a,b)},
+ useMemo:function(a,b){var c=mg();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=mg();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=wg.bind(null,Xf,a);return [d.memoizedState,a]},useRef:function(a){var b=mg();a={current:a};return b.memoizedState=a},useState:function(a){var b=mg();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,
+ lastRenderedReducer:og,lastRenderedState:a};a=a.dispatch=wg.bind(null,Xf,a);return [b.memoizedState,a]},useDebugValue:vg},jg={readContext:M,useCallback:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];c.memoizedState=[a,b];return a},useContext:M,useEffect:function(a,b){return tg(516,Uf|Tf,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return tg(4,Pf|Sf,ug.bind(null,b,a),c)},useLayoutEffect:function(a,
+ b){return tg(4,Pf|Sf,a,b)},useMemo:function(a,b){var c=ng();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&gg(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:pg,useRef:function(){return ng().memoizedState},useState:function(a){return pg(og)},useDebugValue:vg},xg=null,yg=null,zg=!1;
+ function Ag(a,b){var c=K$1(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c;}function Bg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return !1;default:return !1}}
+ function Cg(a){if(zg){var b=yg;if(b){var c=b;if(!Bg(a,b)){b=De(c);if(!b||!Bg(a,b)){a.effectTag|=2;zg=!1;xg=a;return}Ag(xg,c);}xg=a;yg=Ee(b);}else a.effectTag|=2,zg=!1,xg=a;}}function Dg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&18!==a.tag;)a=a.return;xg=a;}function Eg(a){if(a!==xg)return !1;if(!zg)return Dg(a),zg=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!xe(b,a.memoizedProps))for(b=yg;b;)Ag(a,b),b=De(b);Dg(a);yg=xg?De(a.stateNode):null;return !0}function Fg(){yg=xg=null;zg=!1;}
+ var Gg=Tb.ReactCurrentOwner,qg=!1;function S(a,b,c,d){b.child=null===a?Ef(b,null,c,d):Df(b,a.child,c,d);}function Hg(a,b,c,d,e){c=c.render;var f=b.ref;Ig(b,e);d=hg(a,b,c,d,f,e);if(null!==a&&!qg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),Jg(a,b,e);b.effectTag|=1;S(a,b,d,e);return b.child}
+ function Kg(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Ve(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,Lg(a,b,g,d,e,f);a=Ye(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e=c)return Sg(a,b,c);b=Jg(a,b,c);return null!==b?b.sibling:null}}return Jg(a,b,c)}}else qg=!1;b.expirationTime=0;switch(b.tag){case 2:d=
+ b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;var e=Je(b,H.current);Ig(b,c);e=hg(null,b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;lg();if(J(d)){var f=!0;Oe(b);}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;"function"===typeof g&&kf(b,d,g,a);e.updater=tf;b.stateNode=e;e._reactInternalFiber=b;xf(b,d,a,c);b=Qg(null,b,d,!0,f,
+ c);}else b.tag=0,S(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);f=b.pendingProps;a=hf(e);b.type=a;e=b.tag=We(a);f=L(a,f);g=void 0;switch(e){case 0:g=Mg(null,b,a,f,c);break;case 1:g=Og(null,b,a,f,c);break;case 11:g=Hg(null,b,a,f,c);break;case 14:g=Kg(null,b,a,L(a.type,f),d,c);break;default:x("306",a,"");}return g;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Mg(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,
+ e=b.elementType===d?e:L(d,e),Og(a,b,d,e,c);case 3:Rg(b);d=b.updateQueue;null===d?x("282"):void 0;e=b.memoizedState;e=null!==e?e.element:null;yf(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Fg(),b=Jg(a,b,c);else{e=b.stateNode;if(e=(null===a||null===a.child)&&e.hydrate)yg=Ee(b.stateNode.containerInfo),xg=b,e=zg=!0;e?(b.effectTag|=2,b.child=Ef(b,null,d,c)):(S(a,b,d,c),Fg());b=b.child;}return b;case 5:return Lf(b),null===a&&Cg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,
+ g=e.children,xe(d,e)?g=null:null!==f&&xe(d,f)&&(b.effectTag|=16),Ng(a,b),1!==c&&b.mode&1&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(S(a,b,g,c),b=b.child),b;case 6:return null===a&&Cg(b),null;case 13:return Sg(a,b,c);case 4:return Jf(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Df(b,null,d,c):S(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:L(d,e),Hg(a,b,d,e,c);case 7:return S(a,b,b.pendingProps,c),b.child;case 8:return S(a,b,b.pendingProps.children,
+ c),b.child;case 12:return S(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;Ug(b,f);if(null!==g){var h=g.value;f=bd(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!I.current){b=Jg(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var l=h.contextDependencies;if(null!==l){g=h.child;for(var k=l.first;null!==k;){if(k.context===d&&0!==
+ (k.observedBits&f)){1===h.tag&&(k=nf(c),k.tag=sf,pf(h,k));h.expirationTime=b&&(qg=!0);a.contextDependencies=null;}
+ function M(a,b){if(Yg!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Yg=a,b=1073741823;b={context:a,observedBits:b,next:null};null===Xg?(null===Wg?x("308"):void 0,Xg=b,Wg.contextDependencies={first:b,expirationTime:0}):Xg=Xg.next=b;}return a._currentValue}var $g=0,rf=1,sf=2,ah=3,Pg=!1;function bh(a){return {baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}
+ function ch(a){return {baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function nf(a){return {expirationTime:a,tag:$g,payload:null,callback:null,next:null,nextEffect:null}}function dh(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b);}
+ function pf(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=bh(a.memoizedState));}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=bh(a.memoizedState),e=c.updateQueue=bh(c.memoizedState)):d=a.updateQueue=ch(e):null===e&&(e=c.updateQueue=ch(d));null===e||d===e?dh(d,b):null===d.lastUpdate||null===e.lastUpdate?(dh(d,b),dh(e,b)):(dh(d,b),e.lastUpdate=b);}
+ function eh(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=bh(a.memoizedState):fh(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b);}function fh(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=ch(b));return b}
+ function gh(a,b,c,d,e,f){switch(c.tag){case rf:return a=c.payload,"function"===typeof a?a.call(f,d,e):a;case ah:a.effectTag=a.effectTag&-2049|64;case $g:a=c.payload;e="function"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return objectAssign({},d,e);case sf:Pg=!0;}return d}
+ function yf(a,b,c,d,e){Pg=!1;b=fh(a,b);for(var f=b.baseState,g=null,h=0,l=b.firstUpdate,k=f;null!==l;){var m=l.expirationTime;md?e:d);Ih.current=null;d=void 0;1c?b:c;0===b&&(Fh=null);$h(a,b);}
+ function ai(a){for(;;){var b=a.alternate,c=a.return,d=a.sibling;if(0===(a.effectTag&1024)){T=a;a:{var e=b;b=a;var f=U;var g=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:J(b.type)&&Ke();break;case 3:Kf();Le();g=b.stateNode;g.pendingContext&&(g.context=g.pendingContext,g.pendingContext=null);if(null===e||null===e.child)Eg(b),b.effectTag&=-3;mh(b);break;case 5:Mf(b);var h=If(Hf.current);f=b.type;if(null!==e&&null!=b.stateNode)nh(e,b,f,g,h),e.ref!==b.ref&&(b.effectTag|=
+ 128);else if(g){var l=If(N.current);if(Eg(b)){g=b;e=g.stateNode;var k=g.type,m=g.memoizedProps,p=h;e[Fa]=g;e[Ga]=m;f=void 0;h=k;switch(h){case "iframe":case "object":E$1("load",e);break;case "video":case "audio":for(k=0;k\x3c/script>",k=e.removeChild(e.firstChild)):"string"===typeof e.is?k=k.createElement(p,{is:e.is}):(k=k.createElement(p),"select"===p&&(p=k,e.multiple?p.multiple=!0:e.size&&(p.size=e.size))):k=k.createElementNS(l,p);e=k;e[Fa]=m;e[Ga]=g;lh(e,b,!1,!1);p=e;k=f;m=g;var t=h,A=re(k,m);switch(k){case "iframe":case "object":E$1("load",
+ p);h=m;break;case "video":case "audio":for(h=0;hg&&(g=e),h>g&&(g=h),f=f.sibling;b.childExpirationTime=g;}if(null!==T)return T;null!==c&&0===(c.effectTag&1024)&&(null===c.firstEffect&&
+ (c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1=v)t=0;else if(-1===t||v component higher in the tree to provide a loading indicator or placeholder to display."+jc(k));}Nh=!0;m=jh(m,k);h=l;do{switch(h.tag){case 3:h.effectTag|=2048;h.expirationTime=g;g=Ch(h,m,g);eh(h,g);break a;case 1:if(t=m,A=h.type,k=h.stateNode,0===(h.effectTag&64)&&("function"===typeof A.getDerivedStateFromError||null!==k&&"function"===typeof k.componentDidCatch&&(null===Fh||!Fh.has(k)))){h.effectTag|=2048;
+ h.expirationTime=g;g=Eh(h,t,g);eh(h,g);break a}}h=h.return;}while(null!==h)}T=ai(f);continue}}}break}while(1);Kh=!1;Hh.current=c;Yg=Xg=Wg=null;lg();if(e)Lh=null,a.finishedWork=null;else if(null!==T)a.finishedWork=null;else{c=a.current.alternate;null===c?x("281"):void 0;Lh=null;if(Nh){e=a.latestPendingTime;f=a.latestSuspendedTime;g=a.latestPingedTime;if(0!==e&&eb?0:b)):(a.pendingCommitExpirationTime=d,a.finishedWork=c);}}
+ function sh(a,b){for(var c=a.return;null!==c;){switch(c.tag){case 1:var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===Fh||!Fh.has(d))){a=jh(b,a);a=Eh(c,a,1073741823);pf(c,a);qf(c,1073741823);return}break;case 3:a=jh(b,a);a=Ch(c,a,1073741823);pf(c,a);qf(c,1073741823);return}c=c.return;}3===a.tag&&(c=jh(b,a),c=Ch(a,c,1073741823),pf(a,c),qf(a,1073741823));}
+ function mf(a,b){var c=scheduler.unstable_getCurrentPriorityLevel(),d=void 0;if(0===(b.mode&1))d=1073741823;else if(Kh&&!Oh)d=U;else{switch(c){case scheduler.unstable_ImmediatePriority:d=1073741823;break;case scheduler.unstable_UserBlockingPriority:d=1073741822-10*(((1073741822-a+15)/10|0)+1);break;case scheduler.unstable_NormalPriority:d=1073741822-25*(((1073741822-a+500)/25|0)+1);break;case scheduler.unstable_LowPriority:case scheduler.unstable_IdlePriority:d=1;break;default:x("313");}null!==Lh&&d===U&&--d;}c===scheduler.unstable_UserBlockingPriority&&
+ (0===gi||d=d){a.didError=!1;b=a.latestPingedTime;if(0===b||b>c)a.latestPingedTime=c;df(c,a);c=a.expirationTime;0!==c&&Xh(a,c);}}function Ah(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=lf();b=mf(b,a);a=hi(a,b);null!==a&&(cf(a,b),b=a.expirationTime,0!==b&&Xh(a,b));}
+ function hi(a,b){a.expirationTimeU&&Sh(),cf(a,b),Kh&&!Oh&&Lh===a||Xh(a,a.expirationTime),ii>ji&&(ii=0,x("185")));}function ki(a,b,c,d,e){return scheduler.unstable_runWithPriority(scheduler.unstable_ImmediatePriority,function(){return a(b,c,d,e)})}var li=null,Y=null,mi=0,ni=void 0,W=!1,oi=null,Z=0,gi=0,pi$1=!1,qi=null,X=!1,ri=!1,si=null,ti=scheduler.unstable_now(),ui=1073741822-(ti/10|0),vi=ui,ji=50,ii=0,wi=null;function xi(){ui=1073741822-((scheduler.unstable_now()-ti)/10|0);}
+ function yi(a,b){if(0!==mi){if(ba.expirationTime&&(a.expirationTime=b);W||(X?ri&&(oi=a,Z=1073741823,Di(a,1073741823,!1)):1073741823===b?Yh(1073741823,!1):yi(a,b));}
+ function Ci(){var a=0,b=null;if(null!==Y)for(var c=Y,d=li;null!==d;){var e=d.expirationTime;if(0===e){null===c||null===Y?x("244"):void 0;if(d===d.nextScheduledRoot){li=Y=d.nextScheduledRoot=null;break}else if(d===li)li=e=d.nextScheduledRoot,Y.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===Y){Y=c;Y.nextScheduledRoot=li;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=d.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot;}else{e>a&&(a=e,b=d);if(d===Y)break;if(1073741823===
+ a)break;c=d;d=d.nextScheduledRoot;}}oi=b;Z=a;}var Ei=!1;function di(){return Ei?!0:scheduler.unstable_shouldYield()?Ei=!0:!1}function zi(){try{if(!di()&&null!==li){xi();var a=li;do{var b=a.expirationTime;0!==b&&ui<=b&&(a.nextExpirationTimeToWorkOn=ui);a=a.nextScheduledRoot;}while(a!==li)}Yh(0,!0);}finally{Ei=!1;}}
+ function Yh(a,b){Ci();if(b)for(xi(),vi=ui;null!==oi&&0!==Z&&a<=Z&&!(Ei&&ui>Z);)Di(oi,Z,ui>Z),Ci(),xi(),vi=ui;else for(;null!==oi&&0!==Z&&a<=Z;)Di(oi,Z,!1),Ci();b&&(mi=0,ni=null);0!==Z&&yi(oi,Z);ii=0;wi=null;if(null!==si)for(a=si,si=null,b=0;b=c&&(null===si?si=[d]:si.push(d),d._defer)){a.finishedWork=b;a.expirationTime=0;return}a.finishedWork=null;a===wi?ii++:(wi=a,ii=0);scheduler.unstable_runWithPriority(scheduler.unstable_ImmediatePriority,function(){Zh(a,b);});}function Dh(a){null===oi?x("246"):void 0;oi.expirationTime=0;pi$1||(pi$1=!0,qi=a);}function Gi(a,b){var c=X;X=!0;try{return a(b)}finally{(X=c)||W||Yh(1073741823,!1);}}
+ function Hi(a,b){if(X&&!ri){ri=!0;try{return a(b)}finally{ri=!1;}}return a(b)}function Ii(a,b,c){X||W||0===gi||(Yh(gi,!1),gi=0);var d=X;X=!0;try{return scheduler.unstable_runWithPriority(scheduler.unstable_UserBlockingPriority,function(){return a(b,c)})}finally{(X=d)||W||Yh(1073741823,!1);}}
+ function Ji(a,b,c,d,e){var f=b.current;a:if(c){c=c._reactInternalFiber;b:{2===ed(c)&&1===c.tag?void 0:x("170");var g=c;do{switch(g.tag){case 3:g=g.stateNode.context;break b;case 1:if(J(g.type)){g=g.stateNode.__reactInternalMemoizedMergedChildContext;break b}}g=g.return;}while(null!==g);x("171");g=void 0;}if(1===c.tag){var h=c.type;if(J(h)){c=Ne(c,h,g);break a}}c=g;}else c=He;null===b.context?b.context=c:b.pendingContext=c;b=e;e=nf(d);e.payload={element:a};b=void 0===b?null:b;null!==b&&(e.callback=b);
+ of();pf(f,e);qf(f,d);return d}function Ki(a,b,c,d){var e=b.current,f=lf();e=mf(f,e);return Ji(a,b,c,e,d)}function Li(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Mi(a,b,c){var d=3=Jh&&(b=Jh-1);this._expirationTime=Jh=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0;}Ni.prototype.render=function(a){this._defer?void 0:x("250");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new Oi;Ji(a,b,null,c,d._onCommit);return d};
+ Ni.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a);}};
+ Ni.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:x("251");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?x("251"):void 0;d._next=e._next;this._next=b;a.firstBatch=this;}this._defer=!1;Bi(a,c);b=this._next;this._next=null;b=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children);}else this._next=
+ null,this._defer=!1;};Ni.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a);}return a};function Qi(a){return !(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}Gb=Gi;Hb=Ii;Ib=function(){W||0===gi||(Yh(gi,!1),gi=0);};
+ function Ri(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new Pi(a,!1,b)}
+ function Si(a,b,c,d,e){var f=c._reactRootContainer;if(f){if("function"===typeof e){var g=e;e=function(){var a=Li(f._internalRoot);g.call(a);};}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e);}else{f=c._reactRootContainer=Ri(c,d);if("function"===typeof e){var h=e;e=function(){var a=Li(f._internalRoot);h.call(a);};}Hi(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e);});}return Li(f._internalRoot)}
+ function Ti(a,b){var c=2 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;
+
+ var interaction = {
+ __count: 1,
+ id: interactionIDCounter++,
+ name: name,
+ timestamp: timestamp
+ };
+
+ var prevInteractions = exports.__interactionsRef.current;
+
+ // Traced interactions should stack/accumulate.
+ // To do that, clone the current interactions.
+ // The previous set will be restored upon completion.
+ var interactions = new Set(prevInteractions);
+ interactions.add(interaction);
+ exports.__interactionsRef.current = interactions;
+
+ var subscriber = exports.__subscriberRef.current;
+ var returnValue = void 0;
+
+ try {
+ if (subscriber !== null) {
+ subscriber.onInteractionTraced(interaction);
+ }
+ } finally {
+ try {
+ if (subscriber !== null) {
+ subscriber.onWorkStarted(interactions, threadID);
+ }
+ } finally {
+ try {
+ returnValue = callback();
+ } finally {
+ exports.__interactionsRef.current = prevInteractions;
+
+ try {
+ if (subscriber !== null) {
+ subscriber.onWorkStopped(interactions, threadID);
+ }
+ } finally {
+ interaction.__count--;
+
+ // If no async work was scheduled for this interaction,
+ // Notify subscribers that it's completed.
+ if (subscriber !== null && interaction.__count === 0) {
+ subscriber.onInteractionScheduledWorkCompleted(interaction);
+ }
+ }
+ }
+ }
+ }
+
+ return returnValue;
+ }
+
+ function unstable_wrap(callback) {
+ var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;
+
+ var wrappedInteractions = exports.__interactionsRef.current;
+
+ var subscriber = exports.__subscriberRef.current;
+ if (subscriber !== null) {
+ subscriber.onWorkScheduled(wrappedInteractions, threadID);
+ }
+
+ // Update the pending async work count for the current interactions.
+ // Update after calling subscribers in case of error.
+ wrappedInteractions.forEach(function (interaction) {
+ interaction.__count++;
+ });
+
+ var hasRun = false;
+
+ function wrapped() {
+ var prevInteractions = exports.__interactionsRef.current;
+ exports.__interactionsRef.current = wrappedInteractions;
+
+ subscriber = exports.__subscriberRef.current;
+
+ try {
+ var returnValue = void 0;
+
+ try {
+ if (subscriber !== null) {
+ subscriber.onWorkStarted(wrappedInteractions, threadID);
+ }
+ } finally {
+ try {
+ returnValue = callback.apply(undefined, arguments);
+ } finally {
+ exports.__interactionsRef.current = prevInteractions;
+
+ if (subscriber !== null) {
+ subscriber.onWorkStopped(wrappedInteractions, threadID);
+ }
+ }
+ }
+
+ return returnValue;
+ } finally {
+ if (!hasRun) {
+ // We only expect a wrapped function to be executed once,
+ // But in the event that it's executed more than once–
+ // Only decrement the outstanding interaction counts once.
+ hasRun = true;
+
+ // Update pending async counts for all wrapped interactions.
+ // If this was the last scheduled async work for any of them,
+ // Mark them as completed.
+ wrappedInteractions.forEach(function (interaction) {
+ interaction.__count--;
+
+ if (subscriber !== null && interaction.__count === 0) {
+ subscriber.onInteractionScheduledWorkCompleted(interaction);
+ }
+ });
+ }
+ }
+ }
+
+ wrapped.cancel = function cancel() {
+ subscriber = exports.__subscriberRef.current;
+
+ try {
+ if (subscriber !== null) {
+ subscriber.onWorkCanceled(wrappedInteractions, threadID);
+ }
+ } finally {
+ // Update pending async counts for all wrapped interactions.
+ // If this was the last scheduled async work for any of them,
+ // Mark them as completed.
+ wrappedInteractions.forEach(function (interaction) {
+ interaction.__count--;
+
+ if (subscriber && interaction.__count === 0) {
+ subscriber.onInteractionScheduledWorkCompleted(interaction);
+ }
+ });
+ }
+ };
+
+ return wrapped;
+ }
+
+ var subscribers = null;
+ {
+ subscribers = new Set();
+ }
+
+ function unstable_subscribe(subscriber) {
+ {
+ subscribers.add(subscriber);
+
+ if (subscribers.size === 1) {
+ exports.__subscriberRef.current = {
+ onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,
+ onInteractionTraced: onInteractionTraced,
+ onWorkCanceled: onWorkCanceled,
+ onWorkScheduled: onWorkScheduled,
+ onWorkStarted: onWorkStarted,
+ onWorkStopped: onWorkStopped
+ };
+ }
+ }
+ }
+
+ function unstable_unsubscribe(subscriber) {
+ {
+ subscribers.delete(subscriber);
+
+ if (subscribers.size === 0) {
+ exports.__subscriberRef.current = null;
+ }
+ }
+ }
+
+ function onInteractionTraced(interaction) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onInteractionTraced(interaction);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ function onInteractionScheduledWorkCompleted(interaction) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onInteractionScheduledWorkCompleted(interaction);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ function onWorkScheduled(interactions, threadID) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onWorkScheduled(interactions, threadID);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ function onWorkStarted(interactions, threadID) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onWorkStarted(interactions, threadID);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ function onWorkStopped(interactions, threadID) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onWorkStopped(interactions, threadID);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ function onWorkCanceled(interactions, threadID) {
+ var didCatchError = false;
+ var caughtError = null;
+
+ subscribers.forEach(function (subscriber) {
+ try {
+ subscriber.onWorkCanceled(interactions, threadID);
+ } catch (error) {
+ if (!didCatchError) {
+ didCatchError = true;
+ caughtError = error;
+ }
+ }
+ });
+
+ if (didCatchError) {
+ throw caughtError;
+ }
+ }
+
+ exports.unstable_clear = unstable_clear;
+ exports.unstable_getCurrent = unstable_getCurrent;
+ exports.unstable_getThreadID = unstable_getThreadID;
+ exports.unstable_trace = unstable_trace;
+ exports.unstable_wrap = unstable_wrap;
+ exports.unstable_subscribe = unstable_subscribe;
+ exports.unstable_unsubscribe = unstable_unsubscribe;
+ })();
+ }
+ });
+
+ unwrapExports(schedulerTracing_development);
+ var schedulerTracing_development_1 = schedulerTracing_development.__interactionsRef;
+ var schedulerTracing_development_2 = schedulerTracing_development.__subscriberRef;
+ var schedulerTracing_development_3 = schedulerTracing_development.unstable_clear;
+ var schedulerTracing_development_4 = schedulerTracing_development.unstable_getCurrent;
+ var schedulerTracing_development_5 = schedulerTracing_development.unstable_getThreadID;
+ var schedulerTracing_development_6 = schedulerTracing_development.unstable_trace;
+ var schedulerTracing_development_7 = schedulerTracing_development.unstable_wrap;
+ var schedulerTracing_development_8 = schedulerTracing_development.unstable_subscribe;
+ var schedulerTracing_development_9 = schedulerTracing_development.unstable_unsubscribe;
+
+ var tracing = createCommonjsModule(function (module) {
+
+ if (process.env.NODE_ENV === 'production') {
+ module.exports = schedulerTracing_production_min;
+ } else {
+ module.exports = schedulerTracing_development;
+ }
+ });
+
+ var reactDom_development = createCommonjsModule(function (module) {
+
+
+
+ if (process.env.NODE_ENV !== "production") {
+ (function() {
+
+ var React = React__default;
+ var _assign = objectAssign;
+ var checkPropTypes = checkPropTypes_1;
+ var scheduler$1 = scheduler;
+ var tracing$1 = tracing;
+
+ /**
+ * Use invariant() to assert state which your program assumes to be true.
+ *
+ * Provide sprintf-style format (only %s is supported) and arguments
+ * to provide information about what broke and what you were
+ * expecting.
+ *
+ * The invariant message will be stripped in production, but the invariant
+ * will remain to ensure logic does not differ in production.
+ */
+
+ var validateFormat = function () {};
+
+ {
+ validateFormat = function (format) {
+ if (format === undefined) {
+ throw new Error('invariant requires an error message argument');
+ }
+ };
+ }
+
+ function invariant(condition, format, a, b, c, d, e, f) {
+ validateFormat(format);
+
+ if (!condition) {
+ var error = void 0;
+ if (format === undefined) {
+ error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
+ } else {
+ var args = [a, b, c, d, e, f];
+ var argIndex = 0;
+ error = new Error(format.replace(/%s/g, function () {
+ return args[argIndex++];
+ }));
+ error.name = 'Invariant Violation';
+ }
+
+ error.framesToPop = 1; // we don't care about invariant's own frame
+ throw error;
+ }
+ }
+
+ // Relying on the `invariant()` implementation lets us
+ // preserve the format and params in the www builds.
+
+ !React ? invariant(false, 'ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.') : void 0;
+
+ var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {
+ var funcArgs = Array.prototype.slice.call(arguments, 3);
+ try {
+ func.apply(context, funcArgs);
+ } catch (error) {
+ this.onError(error);
+ }
+ };
+
+ {
+ // In DEV mode, we swap out invokeGuardedCallback for a special version
+ // that plays more nicely with the browser's DevTools. The idea is to preserve
+ // "Pause on exceptions" behavior. Because React wraps all user-provided
+ // functions in invokeGuardedCallback, and the production version of
+ // invokeGuardedCallback uses a try-catch, all user exceptions are treated
+ // like caught exceptions, and the DevTools won't pause unless the developer
+ // takes the extra step of enabling pause on caught exceptions. This is
+ // unintuitive, though, because even though React has caught the error, from
+ // the developer's perspective, the error is uncaught.
+ //
+ // To preserve the expected "Pause on exceptions" behavior, we don't use a
+ // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
+ // DOM node, and call the user-provided callback from inside an event handler
+ // for that fake event. If the callback throws, the error is "captured" using
+ // a global event handler. But because the error happens in a different
+ // event loop context, it does not interrupt the normal program flow.
+ // Effectively, this gives us try-catch behavior without actually using
+ // try-catch. Neat!
+
+ // Check that the browser supports the APIs we need to implement our special
+ // DEV version of invokeGuardedCallback
+ if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
+ var fakeNode = document.createElement('react');
+
+ var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {
+ // If document doesn't exist we know for sure we will crash in this method
+ // when we call document.createEvent(). However this can cause confusing
+ // errors: https://github.com/facebookincubator/create-react-app/issues/3482
+ // So we preemptively throw with a better message instead.
+ !(typeof document !== 'undefined') ? invariant(false, 'The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.') : void 0;
+ var evt = document.createEvent('Event');
+
+ // Keeps track of whether the user-provided callback threw an error. We
+ // set this to true at the beginning, then set it to false right after
+ // calling the function. If the function errors, `didError` will never be
+ // set to false. This strategy works even if the browser is flaky and
+ // fails to call our global error handler, because it doesn't rely on
+ // the error event at all.
+ var didError = true;
+
+ // Keeps track of the value of window.event so that we can reset it
+ // during the callback to let user code access window.event in the
+ // browsers that support it.
+ var windowEvent = window.event;
+
+ // Keeps track of the descriptor of window.event to restore it after event
+ // dispatching: https://github.com/facebook/react/issues/13688
+ var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event');
+
+ // Create an event handler for our fake event. We will synchronously
+ // dispatch our fake event using `dispatchEvent`. Inside the handler, we
+ // call the user-provided callback.
+ var funcArgs = Array.prototype.slice.call(arguments, 3);
+ function callCallback() {
+ // We immediately remove the callback from event listeners so that
+ // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
+ // nested call would trigger the fake event handlers of any call higher
+ // in the stack.
+ fakeNode.removeEventListener(evtType, callCallback, false);
+
+ // We check for window.hasOwnProperty('event') to prevent the
+ // window.event assignment in both IE <= 10 as they throw an error
+ // "Member not found" in strict mode, and in Firefox which does not
+ // support window.event.
+ if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
+ window.event = windowEvent;
+ }
+
+ func.apply(context, funcArgs);
+ didError = false;
+ }
+
+ // Create a global error event handler. We use this to capture the value
+ // that was thrown. It's possible that this error handler will fire more
+ // than once; for example, if non-React code also calls `dispatchEvent`
+ // and a handler for that event throws. We should be resilient to most of
+ // those cases. Even if our error event handler fires more than once, the
+ // last error event is always used. If the callback actually does error,
+ // we know that the last error event is the correct one, because it's not
+ // possible for anything else to have happened in between our callback
+ // erroring and the code that follows the `dispatchEvent` call below. If
+ // the callback doesn't error, but the error event was fired, we know to
+ // ignore it because `didError` will be false, as described above.
+ var error = void 0;
+ // Use this to track whether the error event is ever called.
+ var didSetError = false;
+ var isCrossOriginError = false;
+
+ function handleWindowError(event) {
+ error = event.error;
+ didSetError = true;
+ if (error === null && event.colno === 0 && event.lineno === 0) {
+ isCrossOriginError = true;
+ }
+ if (event.defaultPrevented) {
+ // Some other error handler has prevented default.
+ // Browsers silence the error report if this happens.
+ // We'll remember this to later decide whether to log it or not.
+ if (error != null && typeof error === 'object') {
+ try {
+ error._suppressLogging = true;
+ } catch (inner) {
+ // Ignore.
+ }
+ }
+ }
+ }
+
+ // Create a fake event type.
+ var evtType = 'react-' + (name ? name : 'invokeguardedcallback');
+
+ // Attach our event handlers
+ window.addEventListener('error', handleWindowError);
+ fakeNode.addEventListener(evtType, callCallback, false);
+
+ // Synchronously dispatch our fake event. If the user-provided function
+ // errors, it will trigger our global error handler.
+ evt.initEvent(evtType, false, false);
+ fakeNode.dispatchEvent(evt);
+
+ if (windowEventDescriptor) {
+ Object.defineProperty(window, 'event', windowEventDescriptor);
+ }
+
+ if (didError) {
+ if (!didSetError) {
+ // The callback errored, but the error event never fired.
+ error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
+ } else if (isCrossOriginError) {
+ error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');
+ }
+ this.onError(error);
+ }
+
+ // Remove our event listeners
+ window.removeEventListener('error', handleWindowError);
+ };
+
+ invokeGuardedCallbackImpl = invokeGuardedCallbackDev;
+ }
+ }
+
+ var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
+
+ // Used by Fiber to simulate a try-catch.
+ var hasError = false;
+ var caughtError = null;
+
+ // Used by event system to capture/rethrow the first error.
+ var hasRethrowError = false;
+ var rethrowError = null;
+
+ var reporter = {
+ onError: function (error) {
+ hasError = true;
+ caughtError = error;
+ }
+ };
+
+ /**
+ * Call a function while guarding against errors that happens within it.
+ * Returns an error if it throws, otherwise null.
+ *
+ * In production, this is implemented using a try-catch. The reason we don't
+ * use a try-catch directly is so that we can swap out a different
+ * implementation in DEV mode.
+ *
+ * @param {String} name of the guard to use for logging or debugging
+ * @param {Function} func The function to invoke
+ * @param {*} context The context to use when calling the function
+ * @param {...*} args Arguments for function
+ */
+ function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
+ hasError = false;
+ caughtError = null;
+ invokeGuardedCallbackImpl$1.apply(reporter, arguments);
+ }
+
+ /**
+ * Same as invokeGuardedCallback, but instead of returning an error, it stores
+ * it in a global so it can be rethrown by `rethrowCaughtError` later.
+ * TODO: See if caughtError and rethrowError can be unified.
+ *
+ * @param {String} name of the guard to use for logging or debugging
+ * @param {Function} func The function to invoke
+ * @param {*} context The context to use when calling the function
+ * @param {...*} args Arguments for function
+ */
+ function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
+ invokeGuardedCallback.apply(this, arguments);
+ if (hasError) {
+ var error = clearCaughtError();
+ if (!hasRethrowError) {
+ hasRethrowError = true;
+ rethrowError = error;
+ }
+ }
+ }
+
+ /**
+ * During execution of guarded functions we will capture the first error which
+ * we will rethrow to be handled by the top level error handler.
+ */
+ function rethrowCaughtError() {
+ if (hasRethrowError) {
+ var error = rethrowError;
+ hasRethrowError = false;
+ rethrowError = null;
+ throw error;
+ }
+ }
+
+ function hasCaughtError() {
+ return hasError;
+ }
+
+ function clearCaughtError() {
+ if (hasError) {
+ var error = caughtError;
+ hasError = false;
+ caughtError = null;
+ return error;
+ } else {
+ invariant(false, 'clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.');
+ }
+ }
+
+ /**
+ * Injectable ordering of event plugins.
+ */
+ var eventPluginOrder = null;
+
+ /**
+ * Injectable mapping from names to event plugin modules.
+ */
+ var namesToPlugins = {};
+
+ /**
+ * Recomputes the plugin list using the injected plugins and plugin ordering.
+ *
+ * @private
+ */
+ function recomputePluginOrdering() {
+ if (!eventPluginOrder) {
+ // Wait until an `eventPluginOrder` is injected.
+ return;
+ }
+ for (var pluginName in namesToPlugins) {
+ var pluginModule = namesToPlugins[pluginName];
+ var pluginIndex = eventPluginOrder.indexOf(pluginName);
+ !(pluginIndex > -1) ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : void 0;
+ if (plugins[pluginIndex]) {
+ continue;
+ }
+ !pluginModule.extractEvents ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : void 0;
+ plugins[pluginIndex] = pluginModule;
+ var publishedEvents = pluginModule.eventTypes;
+ for (var eventName in publishedEvents) {
+ !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : void 0;
+ }
+ }
+ }
+
+ /**
+ * Publishes an event so that it can be dispatched by the supplied plugin.
+ *
+ * @param {object} dispatchConfig Dispatch configuration for the event.
+ * @param {object} PluginModule Plugin publishing the event.
+ * @return {boolean} True if the event was successfully published.
+ * @private
+ */
+ function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
+ !!eventNameDispatchConfigs.hasOwnProperty(eventName) ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : void 0;
+ eventNameDispatchConfigs[eventName] = dispatchConfig;
+
+ var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
+ if (phasedRegistrationNames) {
+ for (var phaseName in phasedRegistrationNames) {
+ if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
+ var phasedRegistrationName = phasedRegistrationNames[phaseName];
+ publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
+ }
+ }
+ return true;
+ } else if (dispatchConfig.registrationName) {
+ publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Publishes a registration name that is used to identify dispatched events.
+ *
+ * @param {string} registrationName Registration name to add.
+ * @param {object} PluginModule Plugin publishing the event.
+ * @private
+ */
+ function publishRegistrationName(registrationName, pluginModule, eventName) {
+ !!registrationNameModules[registrationName] ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : void 0;
+ registrationNameModules[registrationName] = pluginModule;
+ registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
+
+ {
+ var lowerCasedName = registrationName.toLowerCase();
+ possibleRegistrationNames[lowerCasedName] = registrationName;
+
+ if (registrationName === 'onDoubleClick') {
+ possibleRegistrationNames.ondblclick = registrationName;
+ }
+ }
+ }
+
+ /**
+ * Registers plugins so that they can extract and dispatch events.
+ *
+ * @see {EventPluginHub}
+ */
+
+ /**
+ * Ordered list of injected plugins.
+ */
+ var plugins = [];
+
+ /**
+ * Mapping from event name to dispatch config
+ */
+ var eventNameDispatchConfigs = {};
+
+ /**
+ * Mapping from registration name to plugin module
+ */
+ var registrationNameModules = {};
+
+ /**
+ * Mapping from registration name to event name
+ */
+ var registrationNameDependencies = {};
+
+ /**
+ * Mapping from lowercase registration names to the properly cased version,
+ * used to warn in the case of missing event handlers. Available
+ * only in true.
+ * @type {Object}
+ */
+ var possibleRegistrationNames = {};
+ // Trust the developer to only use possibleRegistrationNames in true
+
+ /**
+ * Injects an ordering of plugins (by plugin name). This allows the ordering
+ * to be decoupled from injection of the actual plugins so that ordering is
+ * always deterministic regardless of packaging, on-the-fly injection, etc.
+ *
+ * @param {array} InjectedEventPluginOrder
+ * @internal
+ * @see {EventPluginHub.injection.injectEventPluginOrder}
+ */
+ function injectEventPluginOrder(injectedEventPluginOrder) {
+ !!eventPluginOrder ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : void 0;
+ // Clone the ordering so it cannot be dynamically mutated.
+ eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
+ recomputePluginOrdering();
+ }
+
+ /**
+ * Injects plugins to be used by `EventPluginHub`. The plugin names must be
+ * in the ordering injected by `injectEventPluginOrder`.
+ *
+ * Plugins can be injected as part of page initialization or on-the-fly.
+ *
+ * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+ * @internal
+ * @see {EventPluginHub.injection.injectEventPluginsByName}
+ */
+ function injectEventPluginsByName(injectedNamesToPlugins) {
+ var isOrderingDirty = false;
+ for (var pluginName in injectedNamesToPlugins) {
+ if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
+ continue;
+ }
+ var pluginModule = injectedNamesToPlugins[pluginName];
+ if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
+ !!namesToPlugins[pluginName] ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : void 0;
+ namesToPlugins[pluginName] = pluginModule;
+ isOrderingDirty = true;
+ }
+ }
+ if (isOrderingDirty) {
+ recomputePluginOrdering();
+ }
+ }
+
+ /**
+ * Similar to invariant but only logs a warning if the condition is not met.
+ * This can be used to log issues in development environments in critical
+ * paths. Removing the logging code for production environments will keep the
+ * same logic and follow the same code paths.
+ */
+
+ var warningWithoutStack = function () {};
+
+ {
+ warningWithoutStack = function (condition, format) {
+ for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
+ args[_key - 2] = arguments[_key];
+ }
+
+ if (format === undefined) {
+ throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
+ }
+ if (args.length > 8) {
+ // Check before the condition to catch violations early.
+ throw new Error('warningWithoutStack() currently supports at most 8 arguments.');
+ }
+ if (condition) {
+ return;
+ }
+ if (typeof console !== 'undefined') {
+ var argsWithFormat = args.map(function (item) {
+ return '' + item;
+ });
+ argsWithFormat.unshift('Warning: ' + format);
+
+ // We intentionally don't use spread (or .apply) directly because it
+ // breaks IE9: https://github.com/facebook/react/issues/13610
+ Function.prototype.apply.call(console.error, console, argsWithFormat);
+ }
+ try {
+ // --- Welcome to debugging React ---
+ // This error was thrown as a convenience so that you can use this stack
+ // to find the callsite that caused this warning to fire.
+ var argIndex = 0;
+ var message = 'Warning: ' + format.replace(/%s/g, function () {
+ return args[argIndex++];
+ });
+ throw new Error(message);
+ } catch (x) {}
+ };
+ }
+
+ var warningWithoutStack$1 = warningWithoutStack;
+
+ var getFiberCurrentPropsFromNode = null;
+ var getInstanceFromNode = null;
+ var getNodeFromInstance = null;
+
+ function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {
+ getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;
+ getInstanceFromNode = getInstanceFromNodeImpl;
+ getNodeFromInstance = getNodeFromInstanceImpl;
+ {
+ !(getNodeFromInstance && getInstanceFromNode) ? warningWithoutStack$1(false, 'EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;
+ }
+ }
+
+ var validateEventDispatches = void 0;
+ {
+ validateEventDispatches = function (event) {
+ var dispatchListeners = event._dispatchListeners;
+ var dispatchInstances = event._dispatchInstances;
+
+ var listenersIsArr = Array.isArray(dispatchListeners);
+ var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
+
+ var instancesIsArr = Array.isArray(dispatchInstances);
+ var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
+
+ !(instancesIsArr === listenersIsArr && instancesLen === listenersLen) ? warningWithoutStack$1(false, 'EventPluginUtils: Invalid `event`.') : void 0;
+ };
+ }
+
+ /**
+ * Dispatch the event to the listener.
+ * @param {SyntheticEvent} event SyntheticEvent to handle
+ * @param {function} listener Application-level callback
+ * @param {*} inst Internal component instance
+ */
+ function executeDispatch(event, listener, inst) {
+ var type = event.type || 'unknown-event';
+ event.currentTarget = getNodeFromInstance(inst);
+ invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
+ event.currentTarget = null;
+ }
+
+ /**
+ * Standard/simple iteration through an event's collected dispatches.
+ */
+ function executeDispatchesInOrder(event) {
+ var dispatchListeners = event._dispatchListeners;
+ var dispatchInstances = event._dispatchInstances;
+ {
+ validateEventDispatches(event);
+ }
+ if (Array.isArray(dispatchListeners)) {
+ for (var i = 0; i < dispatchListeners.length; i++) {
+ if (event.isPropagationStopped()) {
+ break;
+ }
+ // Listeners and Instances are two parallel arrays that are always in sync.
+ executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);
+ }
+ } else if (dispatchListeners) {
+ executeDispatch(event, dispatchListeners, dispatchInstances);
+ }
+ event._dispatchListeners = null;
+ event._dispatchInstances = null;
+ }
+
+ /**
+ * @see executeDispatchesInOrderStopAtTrueImpl
+ */
+
+
+ /**
+ * Execution of a "direct" dispatch - there must be at most one dispatch
+ * accumulated on the event or it is considered an error. It doesn't really make
+ * sense for an event with multiple dispatches (bubbled) to keep track of the
+ * return values at each dispatch execution, but it does tend to make sense when
+ * dealing with "direct" dispatches.
+ *
+ * @return {*} The return value of executing the single dispatch.
+ */
+
+
+ /**
+ * @param {SyntheticEvent} event
+ * @return {boolean} True iff number of dispatches accumulated is greater than 0.
+ */
+
+ /**
+ * Accumulates items that must not be null or undefined into the first one. This
+ * is used to conserve memory by avoiding array allocations, and thus sacrifices
+ * API cleanness. Since `current` can be null before being passed in and not
+ * null after this function, make sure to assign it back to `current`:
+ *
+ * `a = accumulateInto(a, b);`
+ *
+ * This API should be sparingly used. Try `accumulate` for something cleaner.
+ *
+ * @return {*|array<*>} An accumulation of items.
+ */
+
+ function accumulateInto(current, next) {
+ !(next != null) ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : void 0;
+
+ if (current == null) {
+ return next;
+ }
+
+ // Both are not empty. Warning: Never call x.concat(y) when you are not
+ // certain that x is an Array (x could be a string with concat method).
+ if (Array.isArray(current)) {
+ if (Array.isArray(next)) {
+ current.push.apply(current, next);
+ return current;
+ }
+ current.push(next);
+ return current;
+ }
+
+ if (Array.isArray(next)) {
+ // A bit too dangerous to mutate `next`.
+ return [current].concat(next);
+ }
+
+ return [current, next];
+ }
+
+ /**
+ * @param {array} arr an "accumulation" of items which is either an Array or
+ * a single item. Useful when paired with the `accumulate` module. This is a
+ * simple utility that allows us to reason about a collection of items, but
+ * handling the case when there is exactly one item (and we do not need to
+ * allocate an array).
+ * @param {function} cb Callback invoked with each element or a collection.
+ * @param {?} [scope] Scope used as `this` in a callback.
+ */
+ function forEachAccumulated(arr, cb, scope) {
+ if (Array.isArray(arr)) {
+ arr.forEach(cb, scope);
+ } else if (arr) {
+ cb.call(scope, arr);
+ }
+ }
+
+ /**
+ * Internal queue of events that have accumulated their dispatches and are
+ * waiting to have their dispatches executed.
+ */
+ var eventQueue = null;
+
+ /**
+ * Dispatches an event and releases it back into the pool, unless persistent.
+ *
+ * @param {?object} event Synthetic event to be dispatched.
+ * @private
+ */
+ var executeDispatchesAndRelease = function (event) {
+ if (event) {
+ executeDispatchesInOrder(event);
+
+ if (!event.isPersistent()) {
+ event.constructor.release(event);
+ }
+ }
+ };
+ var executeDispatchesAndReleaseTopLevel = function (e) {
+ return executeDispatchesAndRelease(e);
+ };
+
+ function isInteractive(tag) {
+ return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
+ }
+
+ function shouldPreventMouseEvent(name, type, props) {
+ switch (name) {
+ case 'onClick':
+ case 'onClickCapture':
+ case 'onDoubleClick':
+ case 'onDoubleClickCapture':
+ case 'onMouseDown':
+ case 'onMouseDownCapture':
+ case 'onMouseMove':
+ case 'onMouseMoveCapture':
+ case 'onMouseUp':
+ case 'onMouseUpCapture':
+ return !!(props.disabled && isInteractive(type));
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * This is a unified interface for event plugins to be installed and configured.
+ *
+ * Event plugins can implement the following properties:
+ *
+ * `extractEvents` {function(string, DOMEventTarget, string, object): *}
+ * Required. When a top-level event is fired, this method is expected to
+ * extract synthetic events that will in turn be queued and dispatched.
+ *
+ * `eventTypes` {object}
+ * Optional, plugins that fire events must publish a mapping of registration
+ * names that are used to register listeners. Values of this mapping must
+ * be objects that contain `registrationName` or `phasedRegistrationNames`.
+ *
+ * `executeDispatch` {function(object, function, string)}
+ * Optional, allows plugins to override how an event gets dispatched. By
+ * default, the listener is simply invoked.
+ *
+ * Each plugin that is injected into `EventsPluginHub` is immediately operable.
+ *
+ * @public
+ */
+
+ /**
+ * Methods for injecting dependencies.
+ */
+ var injection = {
+ /**
+ * @param {array} InjectedEventPluginOrder
+ * @public
+ */
+ injectEventPluginOrder: injectEventPluginOrder,
+
+ /**
+ * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+ */
+ injectEventPluginsByName: injectEventPluginsByName
+ };
+
+ /**
+ * @param {object} inst The instance, which is the source of events.
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
+ * @return {?function} The stored callback.
+ */
+ function getListener(inst, registrationName) {
+ var listener = void 0;
+
+ // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
+ // live here; needs to be moved to a better place soon
+ var stateNode = inst.stateNode;
+ if (!stateNode) {
+ // Work in progress (ex: onload events in incremental mode).
+ return null;
+ }
+ var props = getFiberCurrentPropsFromNode(stateNode);
+ if (!props) {
+ // Work in progress.
+ return null;
+ }
+ listener = props[registrationName];
+ if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
+ return null;
+ }
+ !(!listener || typeof listener === 'function') ? invariant(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener) : void 0;
+ return listener;
+ }
+
+ /**
+ * Allows registered plugins an opportunity to extract events from top-level
+ * native browser events.
+ *
+ * @return {*} An accumulation of synthetic events.
+ * @internal
+ */
+ function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var events = null;
+ for (var i = 0; i < plugins.length; i++) {
+ // Not every plugin in the ordering may be loaded at runtime.
+ var possiblePlugin = plugins[i];
+ if (possiblePlugin) {
+ var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+ if (extractedEvents) {
+ events = accumulateInto(events, extractedEvents);
+ }
+ }
+ }
+ return events;
+ }
+
+ function runEventsInBatch(events) {
+ if (events !== null) {
+ eventQueue = accumulateInto(eventQueue, events);
+ }
+
+ // Set `eventQueue` to null before processing it so that we can tell if more
+ // events get enqueued while processing.
+ var processingEventQueue = eventQueue;
+ eventQueue = null;
+
+ if (!processingEventQueue) {
+ return;
+ }
+
+ forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
+ !!eventQueue ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : void 0;
+ // This would be a good time to rethrow if any of the event handlers threw.
+ rethrowCaughtError();
+ }
+
+ function runExtractedEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var events = extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+ runEventsInBatch(events);
+ }
+
+ var FunctionComponent = 0;
+ var ClassComponent = 1;
+ var IndeterminateComponent = 2; // Before we know whether it is function or class
+ var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
+ var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
+ var HostComponent = 5;
+ var HostText = 6;
+ var Fragment = 7;
+ var Mode = 8;
+ var ContextConsumer = 9;
+ var ContextProvider = 10;
+ var ForwardRef = 11;
+ var Profiler = 12;
+ var SuspenseComponent = 13;
+ var MemoComponent = 14;
+ var SimpleMemoComponent = 15;
+ var LazyComponent = 16;
+ var IncompleteClassComponent = 17;
+ var DehydratedSuspenseComponent = 18;
+
+ var randomKey = Math.random().toString(36).slice(2);
+ var internalInstanceKey = '__reactInternalInstance$' + randomKey;
+ var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;
+
+ function precacheFiberNode(hostInst, node) {
+ node[internalInstanceKey] = hostInst;
+ }
+
+ /**
+ * Given a DOM node, return the closest ReactDOMComponent or
+ * ReactDOMTextComponent instance ancestor.
+ */
+ function getClosestInstanceFromNode(node) {
+ if (node[internalInstanceKey]) {
+ return node[internalInstanceKey];
+ }
+
+ while (!node[internalInstanceKey]) {
+ if (node.parentNode) {
+ node = node.parentNode;
+ } else {
+ // Top of the tree. This node must not be part of a React tree (or is
+ // unmounted, potentially).
+ return null;
+ }
+ }
+
+ var inst = node[internalInstanceKey];
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ // In Fiber, this will always be the deepest root.
+ return inst;
+ }
+
+ return null;
+ }
+
+ /**
+ * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
+ * instance, or null if the node was not rendered by this React.
+ */
+ function getInstanceFromNode$1(node) {
+ var inst = node[internalInstanceKey];
+ if (inst) {
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ return inst;
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
+ * DOM node.
+ */
+ function getNodeFromInstance$1(inst) {
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ // In Fiber this, is just the state node right now. We assume it will be
+ // a host component or host text.
+ return inst.stateNode;
+ }
+
+ // Without this first invariant, passing a non-DOM-component triggers the next
+ // invariant for a missing parent, which is super confusing.
+ invariant(false, 'getNodeFromInstance: Invalid argument.');
+ }
+
+ function getFiberCurrentPropsFromNode$1(node) {
+ return node[internalEventHandlersKey] || null;
+ }
+
+ function updateFiberProps(node, props) {
+ node[internalEventHandlersKey] = props;
+ }
+
+ function getParent(inst) {
+ do {
+ inst = inst.return;
+ // TODO: If this is a HostRoot we might want to bail out.
+ // That is depending on if we want nested subtrees (layers) to bubble
+ // events to their parent. We could also go through parentNode on the
+ // host node but that wouldn't work for React Native and doesn't let us
+ // do the portal feature.
+ } while (inst && inst.tag !== HostComponent);
+ if (inst) {
+ return inst;
+ }
+ return null;
+ }
+
+ /**
+ * Return the lowest common ancestor of A and B, or null if they are in
+ * different trees.
+ */
+ function getLowestCommonAncestor(instA, instB) {
+ var depthA = 0;
+ for (var tempA = instA; tempA; tempA = getParent(tempA)) {
+ depthA++;
+ }
+ var depthB = 0;
+ for (var tempB = instB; tempB; tempB = getParent(tempB)) {
+ depthB++;
+ }
+
+ // If A is deeper, crawl up.
+ while (depthA - depthB > 0) {
+ instA = getParent(instA);
+ depthA--;
+ }
+
+ // If B is deeper, crawl up.
+ while (depthB - depthA > 0) {
+ instB = getParent(instB);
+ depthB--;
+ }
+
+ // Walk in lockstep until we find a match.
+ var depth = depthA;
+ while (depth--) {
+ if (instA === instB || instA === instB.alternate) {
+ return instA;
+ }
+ instA = getParent(instA);
+ instB = getParent(instB);
+ }
+ return null;
+ }
+
+ /**
+ * Return if A is an ancestor of B.
+ */
+
+
+ /**
+ * Return the parent instance of the passed-in instance.
+ */
+
+
+ /**
+ * Simulates the traversal of a two-phase, capture/bubble event dispatch.
+ */
+ function traverseTwoPhase(inst, fn, arg) {
+ var path = [];
+ while (inst) {
+ path.push(inst);
+ inst = getParent(inst);
+ }
+ var i = void 0;
+ for (i = path.length; i-- > 0;) {
+ fn(path[i], 'captured', arg);
+ }
+ for (i = 0; i < path.length; i++) {
+ fn(path[i], 'bubbled', arg);
+ }
+ }
+
+ /**
+ * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
+ * should would receive a `mouseEnter` or `mouseLeave` event.
+ *
+ * Does not invoke the callback on the nearest common ancestor because nothing
+ * "entered" or "left" that element.
+ */
+ function traverseEnterLeave(from, to, fn, argFrom, argTo) {
+ var common = from && to ? getLowestCommonAncestor(from, to) : null;
+ var pathFrom = [];
+ while (true) {
+ if (!from) {
+ break;
+ }
+ if (from === common) {
+ break;
+ }
+ var alternate = from.alternate;
+ if (alternate !== null && alternate === common) {
+ break;
+ }
+ pathFrom.push(from);
+ from = getParent(from);
+ }
+ var pathTo = [];
+ while (true) {
+ if (!to) {
+ break;
+ }
+ if (to === common) {
+ break;
+ }
+ var _alternate = to.alternate;
+ if (_alternate !== null && _alternate === common) {
+ break;
+ }
+ pathTo.push(to);
+ to = getParent(to);
+ }
+ for (var i = 0; i < pathFrom.length; i++) {
+ fn(pathFrom[i], 'bubbled', argFrom);
+ }
+ for (var _i = pathTo.length; _i-- > 0;) {
+ fn(pathTo[_i], 'captured', argTo);
+ }
+ }
+
+ /**
+ * Some event types have a notion of different registration names for different
+ * "phases" of propagation. This finds listeners by a given phase.
+ */
+ function listenerAtPhase(inst, event, propagationPhase) {
+ var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
+ return getListener(inst, registrationName);
+ }
+
+ /**
+ * A small set of propagation patterns, each of which will accept a small amount
+ * of information, and generate a set of "dispatch ready event objects" - which
+ * are sets of events that have already been annotated with a set of dispatched
+ * listener functions/ids. The API is designed this way to discourage these
+ * propagation strategies from actually executing the dispatches, since we
+ * always want to collect the entire set of dispatches before executing even a
+ * single one.
+ */
+
+ /**
+ * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
+ * here, allows us to not have to bind or create functions for each event.
+ * Mutating the event's members allows us to not have to create a wrapping
+ * "dispatch" object that pairs the event with the listener.
+ */
+ function accumulateDirectionalDispatches(inst, phase, event) {
+ {
+ !inst ? warningWithoutStack$1(false, 'Dispatching inst must not be null') : void 0;
+ }
+ var listener = listenerAtPhase(inst, event, phase);
+ if (listener) {
+ event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
+ event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
+ }
+ }
+
+ /**
+ * Collect dispatches (must be entirely collected before dispatching - see unit
+ * tests). Lazily allocate the array to conserve memory. We must loop through
+ * each event and perform the traversal for each one. We cannot perform a
+ * single traversal for the entire collection of events because each event may
+ * have a different target.
+ */
+ function accumulateTwoPhaseDispatchesSingle(event) {
+ if (event && event.dispatchConfig.phasedRegistrationNames) {
+ traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
+ }
+ }
+
+ /**
+ * Accumulates without regard to direction, does not look for phased
+ * registration names. Same as `accumulateDirectDispatchesSingle` but without
+ * requiring that the `dispatchMarker` be the same as the dispatched ID.
+ */
+ function accumulateDispatches(inst, ignoredDirection, event) {
+ if (inst && event && event.dispatchConfig.registrationName) {
+ var registrationName = event.dispatchConfig.registrationName;
+ var listener = getListener(inst, registrationName);
+ if (listener) {
+ event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
+ event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
+ }
+ }
+ }
+
+ /**
+ * Accumulates dispatches on an `SyntheticEvent`, but only for the
+ * `dispatchMarker`.
+ * @param {SyntheticEvent} event
+ */
+ function accumulateDirectDispatchesSingle(event) {
+ if (event && event.dispatchConfig.registrationName) {
+ accumulateDispatches(event._targetInst, null, event);
+ }
+ }
+
+ function accumulateTwoPhaseDispatches(events) {
+ forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
+ }
+
+
+
+ function accumulateEnterLeaveDispatches(leave, enter, from, to) {
+ traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
+ }
+
+ function accumulateDirectDispatches(events) {
+ forEachAccumulated(events, accumulateDirectDispatchesSingle);
+ }
+
+ var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
+
+ // Do not uses the below two methods directly!
+ // Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.
+ // (It is the only module that is allowed to access these methods.)
+
+ function unsafeCastStringToDOMTopLevelType(topLevelType) {
+ return topLevelType;
+ }
+
+ function unsafeCastDOMTopLevelTypeToString(topLevelType) {
+ return topLevelType;
+ }
+
+ /**
+ * Generate a mapping of standard vendor prefixes using the defined style property and event name.
+ *
+ * @param {string} styleProp
+ * @param {string} eventName
+ * @returns {object}
+ */
+ function makePrefixMap(styleProp, eventName) {
+ var prefixes = {};
+
+ prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
+ prefixes['Webkit' + styleProp] = 'webkit' + eventName;
+ prefixes['Moz' + styleProp] = 'moz' + eventName;
+
+ return prefixes;
+ }
+
+ /**
+ * A list of event names to a configurable list of vendor prefixes.
+ */
+ var vendorPrefixes = {
+ animationend: makePrefixMap('Animation', 'AnimationEnd'),
+ animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
+ animationstart: makePrefixMap('Animation', 'AnimationStart'),
+ transitionend: makePrefixMap('Transition', 'TransitionEnd')
+ };
+
+ /**
+ * Event names that have already been detected and prefixed (if applicable).
+ */
+ var prefixedEventNames = {};
+
+ /**
+ * Element to check for prefixes on.
+ */
+ var style = {};
+
+ /**
+ * Bootstrap if a DOM exists.
+ */
+ if (canUseDOM) {
+ style = document.createElement('div').style;
+
+ // On some platforms, in particular some releases of Android 4.x,
+ // the un-prefixed "animation" and "transition" properties are defined on the
+ // style object but the events that fire will still be prefixed, so we need
+ // to check if the un-prefixed events are usable, and if not remove them from the map.
+ if (!('AnimationEvent' in window)) {
+ delete vendorPrefixes.animationend.animation;
+ delete vendorPrefixes.animationiteration.animation;
+ delete vendorPrefixes.animationstart.animation;
+ }
+
+ // Same as above
+ if (!('TransitionEvent' in window)) {
+ delete vendorPrefixes.transitionend.transition;
+ }
+ }
+
+ /**
+ * Attempts to determine the correct vendor prefixed event name.
+ *
+ * @param {string} eventName
+ * @returns {string}
+ */
+ function getVendorPrefixedEventName(eventName) {
+ if (prefixedEventNames[eventName]) {
+ return prefixedEventNames[eventName];
+ } else if (!vendorPrefixes[eventName]) {
+ return eventName;
+ }
+
+ var prefixMap = vendorPrefixes[eventName];
+
+ for (var styleProp in prefixMap) {
+ if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
+ return prefixedEventNames[eventName] = prefixMap[styleProp];
+ }
+ }
+
+ return eventName;
+ }
+
+ /**
+ * To identify top level events in ReactDOM, we use constants defined by this
+ * module. This is the only module that uses the unsafe* methods to express
+ * that the constants actually correspond to the browser event names. This lets
+ * us save some bundle size by avoiding a top level type -> event name map.
+ * The rest of ReactDOM code should import top level types from this file.
+ */
+ var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');
+ var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));
+ var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));
+ var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));
+ var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');
+ var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');
+ var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');
+ var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');
+ var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');
+ var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');
+ var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');
+ var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');
+ var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');
+ var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');
+ var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');
+ var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');
+ var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');
+ var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');
+ var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');
+ var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');
+ var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');
+ var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');
+ var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');
+ var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');
+ var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');
+ var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');
+ var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');
+ var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');
+ var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');
+ var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');
+ var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');
+ var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');
+ var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');
+ var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');
+ var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');
+ var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');
+ var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');
+ var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');
+ var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');
+ var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');
+ var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');
+ var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');
+ var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');
+ var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');
+ var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');
+ var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');
+ var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');
+ var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');
+ var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');
+ var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');
+ var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');
+ var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');
+ var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');
+ var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');
+ var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');
+
+
+ var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');
+ var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');
+ var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');
+ var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');
+ var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');
+ var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');
+ var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');
+ var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');
+ var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');
+ var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');
+ var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');
+ var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');
+ var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');
+ var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');
+ var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');
+ var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');
+ var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');
+ var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');
+ var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');
+ var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');
+ var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');
+ var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));
+ var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');
+ var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');
+ var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel');
+
+ // List of events that need to be individually attached to media elements.
+ // Note that events in this list will *not* be listened to at the top level
+ // unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.
+ var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];
+
+ function getRawEventName(topLevelType) {
+ return unsafeCastDOMTopLevelTypeToString(topLevelType);
+ }
+
+ /**
+ * These variables store information about text content of a target node,
+ * allowing comparison of content before and after a given event.
+ *
+ * Identify the node where selection currently begins, then observe
+ * both its text content and its current position in the DOM. Since the
+ * browser may natively replace the target node during composition, we can
+ * use its position to find its replacement.
+ *
+ *
+ */
+
+ var root = null;
+ var startText = null;
+ var fallbackText = null;
+
+ function initialize(nativeEventTarget) {
+ root = nativeEventTarget;
+ startText = getText();
+ return true;
+ }
+
+ function reset() {
+ root = null;
+ startText = null;
+ fallbackText = null;
+ }
+
+ function getData() {
+ if (fallbackText) {
+ return fallbackText;
+ }
+
+ var start = void 0;
+ var startValue = startText;
+ var startLength = startValue.length;
+ var end = void 0;
+ var endValue = getText();
+ var endLength = endValue.length;
+
+ for (start = 0; start < startLength; start++) {
+ if (startValue[start] !== endValue[start]) {
+ break;
+ }
+ }
+
+ var minEnd = startLength - start;
+ for (end = 1; end <= minEnd; end++) {
+ if (startValue[startLength - end] !== endValue[endLength - end]) {
+ break;
+ }
+ }
+
+ var sliceTail = end > 1 ? 1 - end : undefined;
+ fallbackText = endValue.slice(start, sliceTail);
+ return fallbackText;
+ }
+
+ function getText() {
+ if ('value' in root) {
+ return root.value;
+ }
+ return root.textContent;
+ }
+
+ /* eslint valid-typeof: 0 */
+
+ var EVENT_POOL_SIZE = 10;
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var EventInterface = {
+ type: null,
+ target: null,
+ // currentTarget is set when dispatching; no use in copying it here
+ currentTarget: function () {
+ return null;
+ },
+ eventPhase: null,
+ bubbles: null,
+ cancelable: null,
+ timeStamp: function (event) {
+ return event.timeStamp || Date.now();
+ },
+ defaultPrevented: null,
+ isTrusted: null
+ };
+
+ function functionThatReturnsTrue() {
+ return true;
+ }
+
+ function functionThatReturnsFalse() {
+ return false;
+ }
+
+ /**
+ * Synthetic events are dispatched by event plugins, typically in response to a
+ * top-level event delegation handler.
+ *
+ * These systems should generally use pooling to reduce the frequency of garbage
+ * collection. The system should check `isPersistent` to determine whether the
+ * event should be released into the pool after being dispatched. Users that
+ * need a persisted event should invoke `persist`.
+ *
+ * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
+ * normalizing browser quirks. Subclasses do not necessarily have to implement a
+ * DOM interface; custom application-specific events can also subclass this.
+ *
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {*} targetInst Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @param {DOMEventTarget} nativeEventTarget Target node.
+ */
+ function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
+ {
+ // these have a getter/setter for warnings
+ delete this.nativeEvent;
+ delete this.preventDefault;
+ delete this.stopPropagation;
+ delete this.isDefaultPrevented;
+ delete this.isPropagationStopped;
+ }
+
+ this.dispatchConfig = dispatchConfig;
+ this._targetInst = targetInst;
+ this.nativeEvent = nativeEvent;
+
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) {
+ if (!Interface.hasOwnProperty(propName)) {
+ continue;
+ }
+ {
+ delete this[propName]; // this has a getter/setter for warnings
+ }
+ var normalize = Interface[propName];
+ if (normalize) {
+ this[propName] = normalize(nativeEvent);
+ } else {
+ if (propName === 'target') {
+ this.target = nativeEventTarget;
+ } else {
+ this[propName] = nativeEvent[propName];
+ }
+ }
+ }
+
+ var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
+ if (defaultPrevented) {
+ this.isDefaultPrevented = functionThatReturnsTrue;
+ } else {
+ this.isDefaultPrevented = functionThatReturnsFalse;
+ }
+ this.isPropagationStopped = functionThatReturnsFalse;
+ return this;
+ }
+
+ _assign(SyntheticEvent.prototype, {
+ preventDefault: function () {
+ this.defaultPrevented = true;
+ var event = this.nativeEvent;
+ if (!event) {
+ return;
+ }
+
+ if (event.preventDefault) {
+ event.preventDefault();
+ } else if (typeof event.returnValue !== 'unknown') {
+ event.returnValue = false;
+ }
+ this.isDefaultPrevented = functionThatReturnsTrue;
+ },
+
+ stopPropagation: function () {
+ var event = this.nativeEvent;
+ if (!event) {
+ return;
+ }
+
+ if (event.stopPropagation) {
+ event.stopPropagation();
+ } else if (typeof event.cancelBubble !== 'unknown') {
+ // The ChangeEventPlugin registers a "propertychange" event for
+ // IE. This event does not support bubbling or cancelling, and
+ // any references to cancelBubble throw "Member not found". A
+ // typeof check of "unknown" circumvents this issue (and is also
+ // IE specific).
+ event.cancelBubble = true;
+ }
+
+ this.isPropagationStopped = functionThatReturnsTrue;
+ },
+
+ /**
+ * We release all dispatched `SyntheticEvent`s after each event loop, adding
+ * them back into the pool. This allows a way to hold onto a reference that
+ * won't be added back into the pool.
+ */
+ persist: function () {
+ this.isPersistent = functionThatReturnsTrue;
+ },
+
+ /**
+ * Checks if this event should be released back into the pool.
+ *
+ * @return {boolean} True if this should not be released, false otherwise.
+ */
+ isPersistent: functionThatReturnsFalse,
+
+ /**
+ * `PooledClass` looks for `destructor` on each instance it releases.
+ */
+ destructor: function () {
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) {
+ {
+ Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
+ }
+ }
+ this.dispatchConfig = null;
+ this._targetInst = null;
+ this.nativeEvent = null;
+ this.isDefaultPrevented = functionThatReturnsFalse;
+ this.isPropagationStopped = functionThatReturnsFalse;
+ this._dispatchListeners = null;
+ this._dispatchInstances = null;
+ {
+ Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));
+ Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));
+ Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));
+ Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));
+ Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));
+ }
+ }
+ });
+
+ SyntheticEvent.Interface = EventInterface;
+
+ /**
+ * Helper to reduce boilerplate when creating subclasses.
+ */
+ SyntheticEvent.extend = function (Interface) {
+ var Super = this;
+
+ var E = function () {};
+ E.prototype = Super.prototype;
+ var prototype = new E();
+
+ function Class() {
+ return Super.apply(this, arguments);
+ }
+ _assign(prototype, Class.prototype);
+ Class.prototype = prototype;
+ Class.prototype.constructor = Class;
+
+ Class.Interface = _assign({}, Super.Interface, Interface);
+ Class.extend = Super.extend;
+ addEventPoolingTo(Class);
+
+ return Class;
+ };
+
+ addEventPoolingTo(SyntheticEvent);
+
+ /**
+ * Helper to nullify syntheticEvent instance properties when destructing
+ *
+ * @param {String} propName
+ * @param {?object} getVal
+ * @return {object} defineProperty object
+ */
+ function getPooledWarningPropertyDefinition(propName, getVal) {
+ var isFunction = typeof getVal === 'function';
+ return {
+ configurable: true,
+ set: set,
+ get: get
+ };
+
+ function set(val) {
+ var action = isFunction ? 'setting the method' : 'setting the property';
+ warn(action, 'This is effectively a no-op');
+ return val;
+ }
+
+ function get() {
+ var action = isFunction ? 'accessing the method' : 'accessing the property';
+ var result = isFunction ? 'This is a no-op function' : 'This is set to null';
+ warn(action, result);
+ return getVal;
+ }
+
+ function warn(action, result) {
+ warningWithoutStack$1(false, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) ;
+ }
+ }
+
+ function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {
+ var EventConstructor = this;
+ if (EventConstructor.eventPool.length) {
+ var instance = EventConstructor.eventPool.pop();
+ EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);
+ return instance;
+ }
+ return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);
+ }
+
+ function releasePooledEvent(event) {
+ var EventConstructor = this;
+ !(event instanceof EventConstructor) ? invariant(false, 'Trying to release an event instance into a pool of a different type.') : void 0;
+ event.destructor();
+ if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {
+ EventConstructor.eventPool.push(event);
+ }
+ }
+
+ function addEventPoolingTo(EventConstructor) {
+ EventConstructor.eventPool = [];
+ EventConstructor.getPooled = getPooledEvent;
+ EventConstructor.release = releasePooledEvent;
+ }
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
+ */
+ var SyntheticCompositionEvent = SyntheticEvent.extend({
+ data: null
+ });
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
+ * /#events-inputevents
+ */
+ var SyntheticInputEvent = SyntheticEvent.extend({
+ data: null
+ });
+
+ var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
+ var START_KEYCODE = 229;
+
+ var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
+
+ var documentMode = null;
+ if (canUseDOM && 'documentMode' in document) {
+ documentMode = document.documentMode;
+ }
+
+ // Webkit offers a very useful `textInput` event that can be used to
+ // directly represent `beforeInput`. The IE `textinput` event is not as
+ // useful, so we don't use it.
+ var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode;
+
+ // In IE9+, we have access to composition events, but the data supplied
+ // by the native compositionend event may be incorrect. Japanese ideographic
+ // spaces, for instance (\u3000) are not recorded correctly.
+ var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
+
+ var SPACEBAR_CODE = 32;
+ var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
+
+ // Events and their corresponding property names.
+ var eventTypes = {
+ beforeInput: {
+ phasedRegistrationNames: {
+ bubbled: 'onBeforeInput',
+ captured: 'onBeforeInputCapture'
+ },
+ dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]
+ },
+ compositionEnd: {
+ phasedRegistrationNames: {
+ bubbled: 'onCompositionEnd',
+ captured: 'onCompositionEndCapture'
+ },
+ dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+ },
+ compositionStart: {
+ phasedRegistrationNames: {
+ bubbled: 'onCompositionStart',
+ captured: 'onCompositionStartCapture'
+ },
+ dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+ },
+ compositionUpdate: {
+ phasedRegistrationNames: {
+ bubbled: 'onCompositionUpdate',
+ captured: 'onCompositionUpdateCapture'
+ },
+ dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+ }
+ };
+
+ // Track whether we've ever handled a keypress on the space key.
+ var hasSpaceKeypress = false;
+
+ /**
+ * Return whether a native keypress event is assumed to be a command.
+ * This is required because Firefox fires `keypress` events for key commands
+ * (cut, copy, select-all, etc.) even though no character is inserted.
+ */
+ function isKeypressCommand(nativeEvent) {
+ return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
+ // ctrlKey && altKey is equivalent to AltGr, and is not a command.
+ !(nativeEvent.ctrlKey && nativeEvent.altKey);
+ }
+
+ /**
+ * Translate native top level events into event types.
+ *
+ * @param {string} topLevelType
+ * @return {object}
+ */
+ function getCompositionEventType(topLevelType) {
+ switch (topLevelType) {
+ case TOP_COMPOSITION_START:
+ return eventTypes.compositionStart;
+ case TOP_COMPOSITION_END:
+ return eventTypes.compositionEnd;
+ case TOP_COMPOSITION_UPDATE:
+ return eventTypes.compositionUpdate;
+ }
+ }
+
+ /**
+ * Does our fallback best-guess model think this event signifies that
+ * composition has begun?
+ *
+ * @param {string} topLevelType
+ * @param {object} nativeEvent
+ * @return {boolean}
+ */
+ function isFallbackCompositionStart(topLevelType, nativeEvent) {
+ return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;
+ }
+
+ /**
+ * Does our fallback mode think that this event is the end of composition?
+ *
+ * @param {string} topLevelType
+ * @param {object} nativeEvent
+ * @return {boolean}
+ */
+ function isFallbackCompositionEnd(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case TOP_KEY_UP:
+ // Command keys insert or clear IME input.
+ return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
+ case TOP_KEY_DOWN:
+ // Expect IME keyCode on each keydown. If we get any other
+ // code we must have exited earlier.
+ return nativeEvent.keyCode !== START_KEYCODE;
+ case TOP_KEY_PRESS:
+ case TOP_MOUSE_DOWN:
+ case TOP_BLUR:
+ // Events are not possible without cancelling IME.
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Google Input Tools provides composition data via a CustomEvent,
+ * with the `data` property populated in the `detail` object. If this
+ * is available on the event object, use it. If not, this is a plain
+ * composition event and we have nothing special to extract.
+ *
+ * @param {object} nativeEvent
+ * @return {?string}
+ */
+ function getDataFromCustomEvent(nativeEvent) {
+ var detail = nativeEvent.detail;
+ if (typeof detail === 'object' && 'data' in detail) {
+ return detail.data;
+ }
+ return null;
+ }
+
+ /**
+ * Check if a composition event was triggered by Korean IME.
+ * Our fallback mode does not work well with IE's Korean IME,
+ * so just use native composition events when Korean IME is used.
+ * Although CompositionEvent.locale property is deprecated,
+ * it is available in IE, where our fallback mode is enabled.
+ *
+ * @param {object} nativeEvent
+ * @return {boolean}
+ */
+ function isUsingKoreanIME(nativeEvent) {
+ return nativeEvent.locale === 'ko';
+ }
+
+ // Track the current IME composition status, if any.
+ var isComposing = false;
+
+ /**
+ * @return {?object} A SyntheticCompositionEvent.
+ */
+ function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var eventType = void 0;
+ var fallbackData = void 0;
+
+ if (canUseCompositionEvent) {
+ eventType = getCompositionEventType(topLevelType);
+ } else if (!isComposing) {
+ if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
+ eventType = eventTypes.compositionStart;
+ }
+ } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+ eventType = eventTypes.compositionEnd;
+ }
+
+ if (!eventType) {
+ return null;
+ }
+
+ if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
+ // The current composition is stored statically and must not be
+ // overwritten while composition continues.
+ if (!isComposing && eventType === eventTypes.compositionStart) {
+ isComposing = initialize(nativeEventTarget);
+ } else if (eventType === eventTypes.compositionEnd) {
+ if (isComposing) {
+ fallbackData = getData();
+ }
+ }
+ }
+
+ var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
+
+ if (fallbackData) {
+ // Inject data generated from fallback path into the synthetic event.
+ // This matches the property of native CompositionEventInterface.
+ event.data = fallbackData;
+ } else {
+ var customData = getDataFromCustomEvent(nativeEvent);
+ if (customData !== null) {
+ event.data = customData;
+ }
+ }
+
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+
+ /**
+ * @param {TopLevelType} topLevelType Number from `TopLevelType`.
+ * @param {object} nativeEvent Native browser event.
+ * @return {?string} The string corresponding to this `beforeInput` event.
+ */
+ function getNativeBeforeInputChars(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case TOP_COMPOSITION_END:
+ return getDataFromCustomEvent(nativeEvent);
+ case TOP_KEY_PRESS:
+ /**
+ * If native `textInput` events are available, our goal is to make
+ * use of them. However, there is a special case: the spacebar key.
+ * In Webkit, preventing default on a spacebar `textInput` event
+ * cancels character insertion, but it *also* causes the browser
+ * to fall back to its default spacebar behavior of scrolling the
+ * page.
+ *
+ * Tracking at:
+ * https://code.google.com/p/chromium/issues/detail?id=355103
+ *
+ * To avoid this issue, use the keypress event as if no `textInput`
+ * event is available.
+ */
+ var which = nativeEvent.which;
+ if (which !== SPACEBAR_CODE) {
+ return null;
+ }
+
+ hasSpaceKeypress = true;
+ return SPACEBAR_CHAR;
+
+ case TOP_TEXT_INPUT:
+ // Record the characters to be added to the DOM.
+ var chars = nativeEvent.data;
+
+ // If it's a spacebar character, assume that we have already handled
+ // it at the keypress level and bail immediately. Android Chrome
+ // doesn't give us keycodes, so we need to ignore it.
+ if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
+ return null;
+ }
+
+ return chars;
+
+ default:
+ // For other native event types, do nothing.
+ return null;
+ }
+ }
+
+ /**
+ * For browsers that do not provide the `textInput` event, extract the
+ * appropriate string to use for SyntheticInputEvent.
+ *
+ * @param {number} topLevelType Number from `TopLevelEventTypes`.
+ * @param {object} nativeEvent Native browser event.
+ * @return {?string} The fallback string for this `beforeInput` event.
+ */
+ function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
+ // If we are currently composing (IME) and using a fallback to do so,
+ // try to extract the composed characters from the fallback object.
+ // If composition event is available, we extract a string only at
+ // compositionevent, otherwise extract it at fallback events.
+ if (isComposing) {
+ if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+ var chars = getData();
+ reset();
+ isComposing = false;
+ return chars;
+ }
+ return null;
+ }
+
+ switch (topLevelType) {
+ case TOP_PASTE:
+ // If a paste event occurs after a keypress, throw out the input
+ // chars. Paste events should not lead to BeforeInput events.
+ return null;
+ case TOP_KEY_PRESS:
+ /**
+ * As of v27, Firefox may fire keypress events even when no character
+ * will be inserted. A few possibilities:
+ *
+ * - `which` is `0`. Arrow keys, Esc key, etc.
+ *
+ * - `which` is the pressed key code, but no char is available.
+ * Ex: 'AltGr + d` in Polish. There is no modified character for
+ * this key combination and no character is inserted into the
+ * document, but FF fires the keypress for char code `100` anyway.
+ * No `input` event will occur.
+ *
+ * - `which` is the pressed key code, but a command combination is
+ * being used. Ex: `Cmd+C`. No character is inserted, and no
+ * `input` event will occur.
+ */
+ if (!isKeypressCommand(nativeEvent)) {
+ // IE fires the `keypress` event when a user types an emoji via
+ // Touch keyboard of Windows. In such a case, the `char` property
+ // holds an emoji character like `\uD83D\uDE0A`. Because its length
+ // is 2, the property `which` does not represent an emoji correctly.
+ // In such a case, we directly return the `char` property instead of
+ // using `which`.
+ if (nativeEvent.char && nativeEvent.char.length > 1) {
+ return nativeEvent.char;
+ } else if (nativeEvent.which) {
+ return String.fromCharCode(nativeEvent.which);
+ }
+ }
+ return null;
+ case TOP_COMPOSITION_END:
+ return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Extract a SyntheticInputEvent for `beforeInput`, based on either native
+ * `textInput` or fallback behavior.
+ *
+ * @return {?object} A SyntheticInputEvent.
+ */
+ function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var chars = void 0;
+
+ if (canUseTextInputEvent) {
+ chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
+ } else {
+ chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
+ }
+
+ // If no characters are being inserted, no BeforeInput event should
+ // be fired.
+ if (!chars) {
+ return null;
+ }
+
+ var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
+
+ event.data = chars;
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+
+ /**
+ * Create an `onBeforeInput` event to match
+ * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
+ *
+ * This event plugin is based on the native `textInput` event
+ * available in Chrome, Safari, Opera, and IE. This event fires after
+ * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
+ *
+ * `beforeInput` is spec'd but not implemented in any browsers, and
+ * the `input` event does not provide any useful information about what has
+ * actually been added, contrary to the spec. Thus, `textInput` is the best
+ * available event to identify the characters that have actually been inserted
+ * into the target node.
+ *
+ * This plugin is also responsible for emitting `composition` events, thus
+ * allowing us to share composition fallback code for both `beforeInput` and
+ * `composition` event types.
+ */
+ var BeforeInputEventPlugin = {
+ eventTypes: eventTypes,
+
+ extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+ var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+
+ var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+
+ if (composition === null) {
+ return beforeInput;
+ }
+
+ if (beforeInput === null) {
+ return composition;
+ }
+
+ return [composition, beforeInput];
+ }
+ };
+
+ // Use to restore controlled state after a change event has fired.
+
+ var restoreImpl = null;
+ var restoreTarget = null;
+ var restoreQueue = null;
+
+ function restoreStateOfTarget(target) {
+ // We perform this translation at the end of the event loop so that we
+ // always receive the correct fiber here
+ var internalInstance = getInstanceFromNode(target);
+ if (!internalInstance) {
+ // Unmounted
+ return;
+ }
+ !(typeof restoreImpl === 'function') ? invariant(false, 'setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.') : void 0;
+ var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);
+ restoreImpl(internalInstance.stateNode, internalInstance.type, props);
+ }
+
+ function setRestoreImplementation(impl) {
+ restoreImpl = impl;
+ }
+
+ function enqueueStateRestore(target) {
+ if (restoreTarget) {
+ if (restoreQueue) {
+ restoreQueue.push(target);
+ } else {
+ restoreQueue = [target];
+ }
+ } else {
+ restoreTarget = target;
+ }
+ }
+
+ function needsStateRestore() {
+ return restoreTarget !== null || restoreQueue !== null;
+ }
+
+ function restoreStateIfNeeded() {
+ if (!restoreTarget) {
+ return;
+ }
+ var target = restoreTarget;
+ var queuedTargets = restoreQueue;
+ restoreTarget = null;
+ restoreQueue = null;
+
+ restoreStateOfTarget(target);
+ if (queuedTargets) {
+ for (var i = 0; i < queuedTargets.length; i++) {
+ restoreStateOfTarget(queuedTargets[i]);
+ }
+ }
+ }
+
+ // Used as a way to call batchedUpdates when we don't have a reference to
+ // the renderer. Such as when we're dispatching events or if third party
+ // libraries need to call batchedUpdates. Eventually, this API will go away when
+ // everything is batched by default. We'll then have a similar API to opt-out of
+ // scheduled work and instead do synchronous work.
+
+ // Defaults
+ var _batchedUpdatesImpl = function (fn, bookkeeping) {
+ return fn(bookkeeping);
+ };
+ var _interactiveUpdatesImpl = function (fn, a, b) {
+ return fn(a, b);
+ };
+ var _flushInteractiveUpdatesImpl = function () {};
+
+ var isBatching = false;
+ function batchedUpdates(fn, bookkeeping) {
+ if (isBatching) {
+ // If we are currently inside another batch, we need to wait until it
+ // fully completes before restoring state.
+ return fn(bookkeeping);
+ }
+ isBatching = true;
+ try {
+ return _batchedUpdatesImpl(fn, bookkeeping);
+ } finally {
+ // Here we wait until all updates have propagated, which is important
+ // when using controlled components within layers:
+ // https://github.com/facebook/react/issues/1698
+ // Then we restore state of any controlled component.
+ isBatching = false;
+ var controlledComponentsHavePendingUpdates = needsStateRestore();
+ if (controlledComponentsHavePendingUpdates) {
+ // If a controlled event was fired, we may need to restore the state of
+ // the DOM node back to the controlled value. This is necessary when React
+ // bails out of the update without touching the DOM.
+ _flushInteractiveUpdatesImpl();
+ restoreStateIfNeeded();
+ }
+ }
+ }
+
+ function interactiveUpdates(fn, a, b) {
+ return _interactiveUpdatesImpl(fn, a, b);
+ }
+
+
+
+ function setBatchingImplementation(batchedUpdatesImpl, interactiveUpdatesImpl, flushInteractiveUpdatesImpl) {
+ _batchedUpdatesImpl = batchedUpdatesImpl;
+ _interactiveUpdatesImpl = interactiveUpdatesImpl;
+ _flushInteractiveUpdatesImpl = flushInteractiveUpdatesImpl;
+ }
+
+ /**
+ * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
+ */
+ var supportedInputTypes = {
+ color: true,
+ date: true,
+ datetime: true,
+ 'datetime-local': true,
+ email: true,
+ month: true,
+ number: true,
+ password: true,
+ range: true,
+ search: true,
+ tel: true,
+ text: true,
+ time: true,
+ url: true,
+ week: true
+ };
+
+ function isTextInputElement(elem) {
+ var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
+
+ if (nodeName === 'input') {
+ return !!supportedInputTypes[elem.type];
+ }
+
+ if (nodeName === 'textarea') {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * HTML nodeType values that represent the type of the node
+ */
+
+ var ELEMENT_NODE = 1;
+ var TEXT_NODE = 3;
+ var COMMENT_NODE = 8;
+ var DOCUMENT_NODE = 9;
+ var DOCUMENT_FRAGMENT_NODE = 11;
+
+ /**
+ * Gets the target node from a native browser event by accounting for
+ * inconsistencies in browser DOM APIs.
+ *
+ * @param {object} nativeEvent Native browser event.
+ * @return {DOMEventTarget} Target node.
+ */
+ function getEventTarget(nativeEvent) {
+ // Fallback to nativeEvent.srcElement for IE9
+ // https://github.com/facebook/react/issues/12506
+ var target = nativeEvent.target || nativeEvent.srcElement || window;
+
+ // Normalize SVG