diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..6d5fe47
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/add.py b/add.py
new file mode 100644
index 0000000..72a34cc
--- /dev/null
+++ b/add.py
@@ -0,0 +1,21 @@
+import json
+import time
+
+import httpx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/html/fi.html b/html/fi.html
new file mode 100644
index 0000000..bc965d0
--- /dev/null
+++ b/html/fi.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/html/fi.vue b/html/fi.vue
new file mode 100644
index 0000000..2a15618
--- /dev/null
+++ b/html/fi.vue
@@ -0,0 +1,119 @@
+
+
+
+
+ Title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/js_css/axios.js b/js_css/axios.js
new file mode 100644
index 0000000..7c0b76b
--- /dev/null
+++ b/js_css/axios.js
@@ -0,0 +1,2595 @@
+/* axios v0.27.2 | (c) 2022 by Matt Zabriskie */
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["axios"] = factory();
+ else
+ root["axios"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./index.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./index.js":
+/*!******************!*\
+ !*** ./index.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! ./lib/axios */ "./lib/axios.js");
+
+/***/ }),
+
+/***/ "./lib/adapters/xhr.js":
+/*!*****************************!*\
+ !*** ./lib/adapters/xhr.js ***!
+ \*****************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+var settle = __webpack_require__(/*! ./../core/settle */ "./lib/core/settle.js");
+var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./lib/helpers/cookies.js");
+var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./lib/helpers/buildURL.js");
+var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./lib/core/buildFullPath.js");
+var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./lib/helpers/parseHeaders.js");
+var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./lib/helpers/isURLSameOrigin.js");
+var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ "./lib/defaults/transitional.js");
+var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
+var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./lib/cancel/CanceledError.js");
+var parseProtocol = __webpack_require__(/*! ../helpers/parseProtocol */ "./lib/helpers/parseProtocol.js");
+
+module.exports = function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ var requestData = config.data;
+ var requestHeaders = config.headers;
+ var responseType = config.responseType;
+ var onCanceled;
+ function done() {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(onCanceled);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', onCanceled);
+ }
+ }
+
+ if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {
+ delete requestHeaders['Content-Type']; // Let the browser set it
+ }
+
+ var request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ var username = config.auth.username || '';
+ var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
+ requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
+ }
+
+ var fullPath = buildFullPath(config.baseURL, config.url);
+
+ request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
+ var responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ var response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config: config,
+ request: request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ var transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (utils.isStandardBrowserEnv()) {
+ // Add xsrf header
+ var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
+ cookies.read(config.xsrfCookieName) :
+ undefined;
+
+ if (xsrfValue) {
+ requestHeaders[config.xsrfHeaderName] = xsrfValue;
+ }
+ }
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders, function setRequestHeader(val, key) {
+ if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
+ // Remove Content-Type if data is undefined
+ delete requestHeaders[key];
+ } else {
+ // Otherwise add header to the request
+ request.setRequestHeader(key, val);
+ }
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils.isUndefined(config.withCredentials)) {
+ request.withCredentials = !!config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = config.responseType;
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', config.onDownloadProgress);
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', config.onUploadProgress);
+ }
+
+ if (config.cancelToken || config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = function(cancel) {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);
+ request.abort();
+ request = null;
+ };
+
+ config.cancelToken && config.cancelToken.subscribe(onCanceled);
+ if (config.signal) {
+ config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ if (!requestData) {
+ requestData = null;
+ }
+
+ var protocol = parseProtocol(fullPath);
+
+ if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData);
+ });
+};
+
+
+/***/ }),
+
+/***/ "./lib/axios.js":
+/*!**********************!*\
+ !*** ./lib/axios.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./utils */ "./lib/utils.js");
+var bind = __webpack_require__(/*! ./helpers/bind */ "./lib/helpers/bind.js");
+var Axios = __webpack_require__(/*! ./core/Axios */ "./lib/core/Axios.js");
+var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./lib/core/mergeConfig.js");
+var defaults = __webpack_require__(/*! ./defaults */ "./lib/defaults/index.js");
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ * @return {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ var context = new Axios(defaultConfig);
+ var instance = bind(Axios.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios.prototype, context);
+
+ // Copy context to instance
+ utils.extend(instance, context);
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+var axios = createInstance(defaults);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = __webpack_require__(/*! ./cancel/CanceledError */ "./lib/cancel/CanceledError.js");
+axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./lib/cancel/CancelToken.js");
+axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./lib/cancel/isCancel.js");
+axios.VERSION = __webpack_require__(/*! ./env/data */ "./lib/env/data.js").version;
+axios.toFormData = __webpack_require__(/*! ./helpers/toFormData */ "./lib/helpers/toFormData.js");
+
+// Expose AxiosError class
+axios.AxiosError = __webpack_require__(/*! ../lib/core/AxiosError */ "./lib/core/AxiosError.js");
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+axios.spread = __webpack_require__(/*! ./helpers/spread */ "./lib/helpers/spread.js");
+
+// Expose isAxiosError
+axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./lib/helpers/isAxiosError.js");
+
+module.exports = axios;
+
+// Allow use of default import syntax in TypeScript
+module.exports.default = axios;
+
+
+/***/ }),
+
+/***/ "./lib/cancel/CancelToken.js":
+/*!***********************************!*\
+ !*** ./lib/cancel/CancelToken.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var CanceledError = __webpack_require__(/*! ./CanceledError */ "./lib/cancel/CanceledError.js");
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @class
+ * @param {Function} executor The executor function.
+ */
+function CancelToken(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ var resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ var token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(function(cancel) {
+ if (!token._listeners) return;
+
+ var i;
+ var l = token._listeners.length;
+
+ for (i = 0; i < l; i++) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = function(onfulfilled) {
+ var _resolve;
+ // eslint-disable-next-line func-names
+ var promise = new Promise(function(resolve) {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message);
+ resolvePromise(token.reason);
+ });
+}
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+CancelToken.prototype.throwIfRequested = function throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+};
+
+/**
+ * Subscribe to the cancel signal
+ */
+
+CancelToken.prototype.subscribe = function subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+};
+
+/**
+ * Unsubscribe from the cancel signal
+ */
+
+CancelToken.prototype.unsubscribe = function unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ var index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+};
+
+/**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+CancelToken.source = function source() {
+ var cancel;
+ var token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token: token,
+ cancel: cancel
+ };
+};
+
+module.exports = CancelToken;
+
+
+/***/ }),
+
+/***/ "./lib/cancel/CanceledError.js":
+/*!*************************************!*\
+ !*** ./lib/cancel/CanceledError.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @class
+ * @param {string=} message The message.
+ */
+function CanceledError(message) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);
+ this.name = 'CanceledError';
+}
+
+utils.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+module.exports = CanceledError;
+
+
+/***/ }),
+
+/***/ "./lib/cancel/isCancel.js":
+/*!********************************!*\
+ !*** ./lib/cancel/isCancel.js ***!
+ \********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+};
+
+
+/***/ }),
+
+/***/ "./lib/core/Axios.js":
+/*!***************************!*\
+ !*** ./lib/core/Axios.js ***!
+ \***************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./lib/helpers/buildURL.js");
+var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./lib/core/InterceptorManager.js");
+var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./lib/core/dispatchRequest.js");
+var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./lib/core/mergeConfig.js");
+var buildFullPath = __webpack_require__(/*! ./buildFullPath */ "./lib/core/buildFullPath.js");
+var validator = __webpack_require__(/*! ../helpers/validator */ "./lib/helpers/validator.js");
+
+var validators = validator.validators;
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ */
+function Axios(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+}
+
+/**
+ * Dispatch a request
+ *
+ * @param {Object} config The config specific for this request (merged with this.defaults)
+ */
+Axios.prototype.request = function request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ // Set config.method
+ if (config.method) {
+ config.method = config.method.toLowerCase();
+ } else if (this.defaults.method) {
+ config.method = this.defaults.method.toLowerCase();
+ } else {
+ config.method = 'get';
+ }
+
+ var transitional = config.transitional;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ // filter out skipped interceptors
+ var requestInterceptorChain = [];
+ var synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ var responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ var promise;
+
+ if (!synchronousRequestInterceptors) {
+ var chain = [dispatchRequest, undefined];
+
+ Array.prototype.unshift.apply(chain, requestInterceptorChain);
+ chain = chain.concat(responseInterceptorChain);
+
+ promise = Promise.resolve(config);
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift());
+ }
+
+ return promise;
+ }
+
+
+ var newConfig = config;
+ while (requestInterceptorChain.length) {
+ var onFulfilled = requestInterceptorChain.shift();
+ var onRejected = requestInterceptorChain.shift();
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected(error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest(newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ while (responseInterceptorChain.length) {
+ promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
+ }
+
+ return promise;
+};
+
+Axios.prototype.getUri = function getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ var fullPath = buildFullPath(config.baseURL, config.url);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+};
+
+// Provide aliases for supported request methods
+utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method: method,
+ url: url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method: method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url: url,
+ data: data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+module.exports = Axios;
+
+
+/***/ }),
+
+/***/ "./lib/core/AxiosError.js":
+/*!********************************!*\
+ !*** ./lib/core/AxiosError.js ***!
+ \********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ response && (this.response = response);
+}
+
+utils.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code,
+ status: this.response && this.response.status ? this.response.status : null
+ };
+ }
+});
+
+var prototype = AxiosError.prototype;
+var descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED'
+// eslint-disable-next-line func-names
+].forEach(function(code) {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = function(error, code, config, request, response, customProps) {
+ var axiosError = Object.create(prototype);
+
+ utils.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+module.exports = AxiosError;
+
+
+/***/ }),
+
+/***/ "./lib/core/InterceptorManager.js":
+/*!****************************************!*\
+ !*** ./lib/core/InterceptorManager.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+function InterceptorManager() {
+ this.handlers = [];
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+};
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+};
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+};
+
+module.exports = InterceptorManager;
+
+
+/***/ }),
+
+/***/ "./lib/core/buildFullPath.js":
+/*!***********************************!*\
+ !*** ./lib/core/buildFullPath.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./lib/helpers/isAbsoluteURL.js");
+var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./lib/helpers/combineURLs.js");
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+module.exports = function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+};
+
+
+/***/ }),
+
+/***/ "./lib/core/dispatchRequest.js":
+/*!*************************************!*\
+ !*** ./lib/core/dispatchRequest.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+var transformData = __webpack_require__(/*! ./transformData */ "./lib/core/transformData.js");
+var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./lib/cancel/isCancel.js");
+var defaults = __webpack_require__(/*! ../defaults */ "./lib/defaults/index.js");
+var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./lib/cancel/CanceledError.js");
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError();
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ * @returns {Promise} The Promise to be fulfilled
+ */
+module.exports = function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ // Ensure headers exist
+ config.headers = config.headers || {};
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.data,
+ config.headers,
+ config.transformRequest
+ );
+
+ // Flatten headers
+ config.headers = utils.merge(
+ config.headers.common || {},
+ config.headers[config.method] || {},
+ config.headers
+ );
+
+ utils.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ }
+ );
+
+ var adapter = config.adapter || defaults.adapter;
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ response.data,
+ response.headers,
+ config.transformResponse
+ );
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ reason.response.data,
+ reason.response.headers,
+ config.transformResponse
+ );
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+};
+
+
+/***/ }),
+
+/***/ "./lib/core/mergeConfig.js":
+/*!*********************************!*\
+ !*** ./lib/core/mergeConfig.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+module.exports = function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ var config = {};
+
+ function getMergedValue(target, source) {
+ if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
+ return utils.merge(target, source);
+ } else if (utils.isPlainObject(source)) {
+ return utils.merge({}, source);
+ } else if (utils.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(prop) {
+ if (prop in config2) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ var mergeMap = {
+ 'url': valueFromConfig2,
+ 'method': valueFromConfig2,
+ 'data': valueFromConfig2,
+ 'baseURL': defaultToConfig2,
+ 'transformRequest': defaultToConfig2,
+ 'transformResponse': defaultToConfig2,
+ 'paramsSerializer': defaultToConfig2,
+ 'timeout': defaultToConfig2,
+ 'timeoutMessage': defaultToConfig2,
+ 'withCredentials': defaultToConfig2,
+ 'adapter': defaultToConfig2,
+ 'responseType': defaultToConfig2,
+ 'xsrfCookieName': defaultToConfig2,
+ 'xsrfHeaderName': defaultToConfig2,
+ 'onUploadProgress': defaultToConfig2,
+ 'onDownloadProgress': defaultToConfig2,
+ 'decompress': defaultToConfig2,
+ 'maxContentLength': defaultToConfig2,
+ 'maxBodyLength': defaultToConfig2,
+ 'beforeRedirect': defaultToConfig2,
+ 'transport': defaultToConfig2,
+ 'httpAgent': defaultToConfig2,
+ 'httpsAgent': defaultToConfig2,
+ 'cancelToken': defaultToConfig2,
+ 'socketPath': defaultToConfig2,
+ 'responseEncoding': defaultToConfig2,
+ 'validateStatus': mergeDirectKeys
+ };
+
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
+ var merge = mergeMap[prop] || mergeDeepProperties;
+ var configValue = merge(prop);
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+};
+
+
+/***/ }),
+
+/***/ "./lib/core/settle.js":
+/*!****************************!*\
+ !*** ./lib/core/settle.js ***!
+ \****************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var AxiosError = __webpack_require__(/*! ./AxiosError */ "./lib/core/AxiosError.js");
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+module.exports = function settle(resolve, reject, response) {
+ var validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+};
+
+
+/***/ }),
+
+/***/ "./lib/core/transformData.js":
+/*!***********************************!*\
+ !*** ./lib/core/transformData.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+var defaults = __webpack_require__(/*! ../defaults */ "./lib/defaults/index.js");
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Object|String} data The data to be transformed
+ * @param {Array} headers The headers for the request or response
+ * @param {Array|Function} fns A single function or Array of functions
+ * @returns {*} The resulting transformed data
+ */
+module.exports = function transformData(data, headers, fns) {
+ var context = this || defaults;
+ /*eslint no-param-reassign:0*/
+ utils.forEach(fns, function transform(fn) {
+ data = fn.call(context, data, headers);
+ });
+
+ return data;
+};
+
+
+/***/ }),
+
+/***/ "./lib/defaults/index.js":
+/*!*******************************!*\
+ !*** ./lib/defaults/index.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ "./lib/helpers/normalizeHeaderName.js");
+var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
+var transitionalDefaults = __webpack_require__(/*! ./transitional */ "./lib/defaults/transitional.js");
+var toFormData = __webpack_require__(/*! ../helpers/toFormData */ "./lib/helpers/toFormData.js");
+
+var DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+};
+
+function setContentTypeIfUnset(headers, value) {
+ if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
+ headers['Content-Type'] = value;
+ }
+}
+
+function getDefaultAdapter() {
+ var adapter;
+ if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = __webpack_require__(/*! ../adapters/xhr */ "./lib/adapters/xhr.js");
+ } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
+ // For node use HTTP adapter
+ adapter = __webpack_require__(/*! ../adapters/http */ "./lib/adapters/xhr.js");
+ }
+ return adapter;
+}
+
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+var defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: getDefaultAdapter(),
+
+ transformRequest: [function transformRequest(data, headers) {
+ normalizeHeaderName(headers, 'Accept');
+ normalizeHeaderName(headers, 'Content-Type');
+
+ if (utils.isFormData(data) ||
+ utils.isArrayBuffer(data) ||
+ utils.isBuffer(data) ||
+ utils.isStream(data) ||
+ utils.isFile(data) ||
+ utils.isBlob(data)
+ ) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
+ return data.toString();
+ }
+
+ var isObjectPayload = utils.isObject(data);
+ var contentType = headers && headers['Content-Type'];
+
+ var isFileList;
+
+ if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {
+ var _FormData = this.env && this.env.FormData;
+ return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());
+ } else if (isObjectPayload || contentType === 'application/json') {
+ setContentTypeIfUnset(headers, 'application/json');
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ var transitional = this.transitional || defaults.transitional;
+ var silentJSONParsing = transitional && transitional.silentJSONParsing;
+ var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
+
+ if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: __webpack_require__(/*! ./env/FormData */ "./lib/helpers/null.js")
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ }
+};
+
+utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+});
+
+module.exports = defaults;
+
+
+/***/ }),
+
+/***/ "./lib/defaults/transitional.js":
+/*!**************************************!*\
+ !*** ./lib/defaults/transitional.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
+
+
+/***/ }),
+
+/***/ "./lib/env/data.js":
+/*!*************************!*\
+ !*** ./lib/env/data.js ***!
+ \*************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ "version": "0.27.2"
+};
+
+/***/ }),
+
+/***/ "./lib/helpers/bind.js":
+/*!*****************************!*\
+ !*** ./lib/helpers/bind.js ***!
+ \*****************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = function bind(fn, thisArg) {
+ return function wrap() {
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i];
+ }
+ return fn.apply(thisArg, args);
+ };
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/buildURL.js":
+/*!*********************************!*\
+ !*** ./lib/helpers/buildURL.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+module.exports = function buildURL(url, params, paramsSerializer) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ var serializedParams;
+ if (paramsSerializer) {
+ serializedParams = paramsSerializer(params);
+ } else if (utils.isURLSearchParams(params)) {
+ serializedParams = params.toString();
+ } else {
+ var parts = [];
+
+ utils.forEach(params, function serialize(val, key) {
+ if (val === null || typeof val === 'undefined') {
+ return;
+ }
+
+ if (utils.isArray(val)) {
+ key = key + '[]';
+ } else {
+ val = [val];
+ }
+
+ utils.forEach(val, function parseValue(v) {
+ if (utils.isDate(v)) {
+ v = v.toISOString();
+ } else if (utils.isObject(v)) {
+ v = JSON.stringify(v);
+ }
+ parts.push(encode(key) + '=' + encode(v));
+ });
+ });
+
+ serializedParams = parts.join('&');
+ }
+
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf('#');
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/combineURLs.js":
+/*!************************************!*\
+ !*** ./lib/helpers/combineURLs.js ***!
+ \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+module.exports = function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/cookies.js":
+/*!********************************!*\
+ !*** ./lib/helpers/cookies.js ***!
+ \********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+module.exports = (
+ utils.isStandardBrowserEnv() ?
+
+ // Standard browser envs support document.cookie
+ (function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ var cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+
+ if (secure === true) {
+ cookie.push('secure');
+ }
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read: function read(name) {
+ var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ })() :
+
+ // Non standard browser env (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() { return null; },
+ remove: function remove() {}
+ };
+ })()
+);
+
+
+/***/ }),
+
+/***/ "./lib/helpers/isAbsoluteURL.js":
+/*!**************************************!*\
+ !*** ./lib/helpers/isAbsoluteURL.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+module.exports = function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/isAxiosError.js":
+/*!*************************************!*\
+ !*** ./lib/helpers/isAxiosError.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+module.exports = function isAxiosError(payload) {
+ return utils.isObject(payload) && (payload.isAxiosError === true);
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/isURLSameOrigin.js":
+/*!****************************************!*\
+ !*** ./lib/helpers/isURLSameOrigin.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+module.exports = (
+ utils.isStandardBrowserEnv() ?
+
+ // Standard browser envs have full support of the APIs needed to test
+ // whether the request URL is of the same origin as current location.
+ (function standardBrowserEnv() {
+ var msie = /(msie|trident)/i.test(navigator.userAgent);
+ var urlParsingNode = document.createElement('a');
+ var originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ var href = url;
+
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
+ urlParsingNode.pathname :
+ '/' + urlParsingNode.pathname
+ };
+ }
+
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
+ return (parsed.protocol === originURL.protocol &&
+ parsed.host === originURL.host);
+ };
+ })() :
+
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ })()
+);
+
+
+/***/ }),
+
+/***/ "./lib/helpers/normalizeHeaderName.js":
+/*!********************************************!*\
+ !*** ./lib/helpers/normalizeHeaderName.js ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+
+module.exports = function normalizeHeaderName(headers, normalizedName) {
+ utils.forEach(headers, function processHeader(value, name) {
+ if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
+ headers[normalizedName] = value;
+ delete headers[name];
+ }
+ });
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/null.js":
+/*!*****************************!*\
+ !*** ./lib/helpers/null.js ***!
+ \*****************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// eslint-disable-next-line strict
+module.exports = null;
+
+
+/***/ }),
+
+/***/ "./lib/helpers/parseHeaders.js":
+/*!*************************************!*\
+ !*** ./lib/helpers/parseHeaders.js ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
+
+// Headers whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+var ignoreDuplicateOf = [
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+];
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} headers Headers needing to be parsed
+ * @returns {Object} Headers parsed into an object
+ */
+module.exports = function parseHeaders(headers) {
+ var parsed = {};
+ var key;
+ var val;
+ var i;
+
+ if (!headers) { return parsed; }
+
+ utils.forEach(headers.split('\n'), function parser(line) {
+ i = line.indexOf(':');
+ key = utils.trim(line.substr(0, i)).toLowerCase();
+ val = utils.trim(line.substr(i + 1));
+
+ if (key) {
+ if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
+ return;
+ }
+ if (key === 'set-cookie') {
+ parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ }
+ });
+
+ return parsed;
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/parseProtocol.js":
+/*!**************************************!*\
+ !*** ./lib/helpers/parseProtocol.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = function parseProtocol(url) {
+ var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/spread.js":
+/*!*******************************!*\
+ !*** ./lib/helpers/spread.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ * @returns {Function}
+ */
+module.exports = function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+};
+
+
+/***/ }),
+
+/***/ "./lib/helpers/toFormData.js":
+/*!***********************************!*\
+ !*** ./lib/helpers/toFormData.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
+
+/**
+ * Convert a data object to FormData
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @returns {Object}
+ **/
+
+function toFormData(obj, formData) {
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new FormData();
+
+ var stack = [];
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
+ return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ function build(data, parentKey) {
+ if (utils.isPlainObject(data) || utils.isArray(data)) {
+ if (stack.indexOf(data) !== -1) {
+ throw Error('Circular reference detected in ' + parentKey);
+ }
+
+ stack.push(data);
+
+ utils.forEach(data, function each(value, key) {
+ if (utils.isUndefined(value)) return;
+ var fullKey = parentKey ? parentKey + '.' + key : key;
+ var arr;
+
+ if (value && !parentKey && typeof value === 'object') {
+ if (utils.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
+ // eslint-disable-next-line func-names
+ arr.forEach(function(el) {
+ !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));
+ });
+ return;
+ }
+ }
+
+ build(value, fullKey);
+ });
+
+ stack.pop();
+ } else {
+ formData.append(parentKey, convertValue(data));
+ }
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+module.exports = toFormData;
+
+
+/***/ }),
+
+/***/ "./lib/helpers/validator.js":
+/*!**********************************!*\
+ !*** ./lib/helpers/validator.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var VERSION = __webpack_require__(/*! ../env/data */ "./lib/env/data.js").version;
+var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
+
+var validators = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
+ validators[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+var deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ * @returns {function}
+ */
+validators.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return function(value, opt, opts) {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+/**
+ * Assert object's properties type
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ var keys = Object.keys(options);
+ var i = keys.length;
+ while (i-- > 0) {
+ var opt = keys[i];
+ var validator = schema[opt];
+ if (validator) {
+ var value = options[opt];
+ var result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+module.exports = {
+ assertOptions: assertOptions,
+ validators: validators
+};
+
+
+/***/ }),
+
+/***/ "./lib/utils.js":
+/*!**********************!*\
+ !*** ./lib/utils.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var bind = __webpack_require__(/*! ./helpers/bind */ "./lib/helpers/bind.js");
+
+// utils is a library of generic helper functions non-specific to axios
+
+var toString = Object.prototype.toString;
+
+// eslint-disable-next-line func-names
+var kindOf = (function(cache) {
+ // eslint-disable-next-line func-names
+ return function(thing) {
+ var str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+ };
+})(Object.create(null));
+
+function kindOfTest(type) {
+ type = type.toLowerCase();
+ return function isKindOf(thing) {
+ return kindOf(thing) === type;
+ };
+}
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+function isArray(val) {
+ return Array.isArray(val);
+}
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+function isUndefined(val) {
+ return typeof val === 'undefined';
+}
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+var isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ var result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+function isString(val) {
+ return typeof val === 'string';
+}
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+function isNumber(val) {
+ return typeof val === 'number';
+}
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+function isObject(val) {
+ return val !== null && typeof val === 'object';
+}
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {Object} val The value to test
+ * @return {boolean} True if value is a plain Object, otherwise false
+ */
+function isPlainObject(val) {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ var prototype = Object.getPrototypeOf(val);
+ return prototype === null || prototype === Object.prototype;
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+var isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+var isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+var isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+var isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+function isFunction(val) {
+ return toString.call(val) === '[object Function]';
+}
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+function isStream(val) {
+ return isObject(val) && isFunction(val.pipe);
+}
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {Object} thing The value to test
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+function isFormData(thing) {
+ var pattern = '[object FormData]';
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) ||
+ toString.call(thing) === pattern ||
+ (isFunction(thing.toString) && thing.toString() === pattern)
+ );
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ * @function
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+var isURLSearchParams = kindOfTest('URLSearchParams');
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ * @returns {String} The String freed of excess whitespace
+ */
+function trim(str) {
+ return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
+}
+
+/**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ */
+function isStandardBrowserEnv() {
+ if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
+ navigator.product === 'NativeScript' ||
+ navigator.product === 'NS')) {
+ return false;
+ }
+ return (
+ typeof window !== 'undefined' &&
+ typeof document !== 'undefined'
+ );
+}
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+function forEach(obj, fn) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (var i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+ }
+}
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ var result = {};
+ function assignValue(val, key) {
+ if (isPlainObject(result[key]) && isPlainObject(val)) {
+ result[key] = merge(result[key], val);
+ } else if (isPlainObject(val)) {
+ result[key] = merge({}, val);
+ } else if (isArray(val)) {
+ result[key] = val.slice();
+ } else {
+ result[key] = val;
+ }
+ }
+
+ for (var i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ * @return {Object} The resulting value of object a
+ */
+function extend(a, b, thisArg) {
+ forEach(b, function assignValue(val, key) {
+ if (thisArg && typeof val === 'function') {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ });
+ return a;
+}
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ * @return {string} content value without BOM
+ */
+function stripBOM(content) {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+}
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ */
+
+function inherits(constructor, superConstructor, props, descriptors) {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ props && Object.assign(constructor.prototype, props);
+}
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function} [filter]
+ * @returns {Object}
+ */
+
+function toFlatObject(sourceObj, destObj, filter) {
+ var props;
+ var i;
+ var prop;
+ var merged = {};
+
+ destObj = destObj || {};
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if (!merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = Object.getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+}
+
+/*
+ * determines whether a string ends with the characters of a specified string
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ * @returns {boolean}
+ */
+function endsWith(str, searchString, position) {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ var lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+}
+
+
+/**
+ * Returns new array from array like object
+ * @param {*} [thing]
+ * @returns {Array}
+ */
+function toArray(thing) {
+ if (!thing) return null;
+ var i = thing.length;
+ if (isUndefined(i)) return null;
+ var arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+}
+
+// eslint-disable-next-line func-names
+var isTypedArray = (function(TypedArray) {
+ // eslint-disable-next-line func-names
+ return function(thing) {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));
+
+module.exports = {
+ isArray: isArray,
+ isArrayBuffer: isArrayBuffer,
+ isBuffer: isBuffer,
+ isFormData: isFormData,
+ isArrayBufferView: isArrayBufferView,
+ isString: isString,
+ isNumber: isNumber,
+ isObject: isObject,
+ isPlainObject: isPlainObject,
+ isUndefined: isUndefined,
+ isDate: isDate,
+ isFile: isFile,
+ isBlob: isBlob,
+ isFunction: isFunction,
+ isStream: isStream,
+ isURLSearchParams: isURLSearchParams,
+ isStandardBrowserEnv: isStandardBrowserEnv,
+ forEach: forEach,
+ merge: merge,
+ extend: extend,
+ trim: trim,
+ stripBOM: stripBOM,
+ inherits: inherits,
+ toFlatObject: toFlatObject,
+ kindOf: kindOf,
+ kindOfTest: kindOfTest,
+ endsWith: endsWith,
+ toArray: toArray,
+ isTypedArray: isTypedArray,
+ isFileList: isFileList
+};
+
+
+/***/ })
+
+/******/ });
+});
+//# sourceMappingURL=axios.map
\ No newline at end of file
diff --git a/js_css/axios.map b/js_css/axios.map
new file mode 100644
index 0000000..5c24df5
--- /dev/null
+++ b/js_css/axios.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://axios/webpack/universalModuleDefinition","webpack://axios/webpack/bootstrap","webpack://axios/./index.js","webpack://axios/./lib/adapters/xhr.js","webpack://axios/./lib/axios.js","webpack://axios/./lib/cancel/CancelToken.js","webpack://axios/./lib/cancel/CanceledError.js","webpack://axios/./lib/cancel/isCancel.js","webpack://axios/./lib/core/Axios.js","webpack://axios/./lib/core/AxiosError.js","webpack://axios/./lib/core/InterceptorManager.js","webpack://axios/./lib/core/buildFullPath.js","webpack://axios/./lib/core/dispatchRequest.js","webpack://axios/./lib/core/mergeConfig.js","webpack://axios/./lib/core/settle.js","webpack://axios/./lib/core/transformData.js","webpack://axios/./lib/defaults/index.js","webpack://axios/./lib/defaults/transitional.js","webpack://axios/./lib/env/data.js","webpack://axios/./lib/helpers/bind.js","webpack://axios/./lib/helpers/buildURL.js","webpack://axios/./lib/helpers/combineURLs.js","webpack://axios/./lib/helpers/cookies.js","webpack://axios/./lib/helpers/isAbsoluteURL.js","webpack://axios/./lib/helpers/isAxiosError.js","webpack://axios/./lib/helpers/isURLSameOrigin.js","webpack://axios/./lib/helpers/normalizeHeaderName.js","webpack://axios/./lib/helpers/null.js","webpack://axios/./lib/helpers/parseHeaders.js","webpack://axios/./lib/helpers/parseProtocol.js","webpack://axios/./lib/helpers/spread.js","webpack://axios/./lib/helpers/toFormData.js","webpack://axios/./lib/helpers/validator.js","webpack://axios/./lib/utils.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;QCVA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;AClFA,iBAAiB,mBAAO,CAAC,mCAAa,E;;;;;;;;;;;;ACAzB;;AAEb,YAAY,mBAAO,CAAC,kCAAY;AAChC,aAAa,mBAAO,CAAC,8CAAkB;AACvC,cAAc,mBAAO,CAAC,sDAAsB;AAC5C,eAAe,mBAAO,CAAC,wDAAuB;AAC9C,oBAAoB,mBAAO,CAAC,0DAAuB;AACnD,mBAAmB,mBAAO,CAAC,gEAA2B;AACtD,sBAAsB,mBAAO,CAAC,sEAA8B;AAC5D,2BAA2B,mBAAO,CAAC,gEAA0B;AAC7D,iBAAiB,mBAAO,CAAC,oDAAoB;AAC7C,oBAAoB,mBAAO,CAAC,8DAAyB;AACrD,oBAAoB,mBAAO,CAAC,gEAA0B;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;AC7Na;;AAEb,YAAY,mBAAO,CAAC,+BAAS;AAC7B,WAAW,mBAAO,CAAC,6CAAgB;AACnC,YAAY,mBAAO,CAAC,yCAAc;AAClC,kBAAkB,mBAAO,CAAC,qDAAoB;AAC9C,eAAe,mBAAO,CAAC,2CAAY;;AAEnC;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,MAAM;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB,mBAAO,CAAC,6DAAwB;AACtD,oBAAoB,mBAAO,CAAC,yDAAsB;AAClD,iBAAiB,mBAAO,CAAC,mDAAmB;AAC5C,gBAAgB,mBAAO,CAAC,qCAAY;AACpC,mBAAmB,mBAAO,CAAC,yDAAsB;;AAEjD;AACA,mBAAmB,mBAAO,CAAC,wDAAwB;;AAEnD;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mBAAO,CAAC,iDAAkB;;AAEzC;AACA,qBAAqB,mBAAO,CAAC,6DAAwB;;AAErD;;AAEA;AACA;;;;;;;;;;;;;AC/Da;;AAEb,oBAAoB,mBAAO,CAAC,sDAAiB;;AAE7C;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,eAAe,OAAO;AACtB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACtHa;;AAEb,iBAAiB,mBAAO,CAAC,oDAAoB;AAC7C,YAAY,mBAAO,CAAC,gCAAU;;AAE9B;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;;ACrBa;;AAEb;AACA;AACA;;;;;;;;;;;;;ACJa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;AAChC,eAAe,mBAAO,CAAC,sDAAqB;AAC5C,yBAAyB,mBAAO,CAAC,8DAAsB;AACvD,sBAAsB,mBAAO,CAAC,wDAAmB;AACjD,kBAAkB,mBAAO,CAAC,gDAAe;AACzC,oBAAoB,mBAAO,CAAC,oDAAiB;AAC7C,gBAAgB,mBAAO,CAAC,wDAAsB;;AAE9C;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,yBAAyB;AACzB,KAAK;AACL;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,SAAS,KAAK;AACd;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,CAAC;;AAED;;;;;;;;;;;;;AC/Ja;;AAEb,YAAY,mBAAO,CAAC,gCAAU;;AAE9B;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,CAAC;;AAED;AACA,kDAAkD,YAAY;;AAE9D;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;;;;;;;ACrFa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;;ACrDa;;AAEb,oBAAoB,mBAAO,CAAC,gEAA0B;AACtD,kBAAkB,mBAAO,CAAC,4DAAwB;;AAElD;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnBa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;AAChC,oBAAoB,mBAAO,CAAC,oDAAiB;AAC7C,eAAe,mBAAO,CAAC,oDAAoB;AAC3C,eAAe,mBAAO,CAAC,4CAAa;AACpC,oBAAoB,mBAAO,CAAC,8DAAyB;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B,uCAAuC;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;;;;;;;;;;;;ACtFa;;AAEb,YAAY,mBAAO,CAAC,gCAAU;;AAE9B;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,2BAA2B;AAC3B,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;;;ACnGa;;AAEb,iBAAiB,mBAAO,CAAC,8CAAc;;AAEvC;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACxBa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;AAChC,eAAe,mBAAO,CAAC,4CAAa;;AAEpC;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;;;ACrBa;;AAEb,YAAY,mBAAO,CAAC,gCAAU;AAC9B,0BAA0B,mBAAO,CAAC,4EAAgC;AAClE,iBAAiB,mBAAO,CAAC,oDAAoB;AAC7C,2BAA2B,mBAAO,CAAC,sDAAgB;AACnD,iBAAiB,mBAAO,CAAC,0DAAuB;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,mBAAO,CAAC,8CAAiB;AACvC,GAAG;AACH;AACA,cAAc,mBAAO,CAAC,+CAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,sCAAsC,gBAAgB;AACtD,KAAK;AACL;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,cAAc,mBAAO,CAAC,6CAAgB;AACtC,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;;ACjJa;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;AACA,E;;;;;;;;;;;;ACFa;;AAEb;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACVa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;;;;;ACrEa;;AAEb;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACba;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0CAA0C;AAC1C,SAAS;;AAET;AACA,4DAA4D,wBAAwB;AACpF;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,kCAAkC;AAClC,+BAA+B,aAAa,EAAE;AAC9C;AACA;AACA,KAAK;AACL;;;;;;;;;;;;;ACpDa;;AAEb;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACba;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;;;;;;;;;;;;ACZa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;;;;;ACnEa;;AAEb,YAAY,mBAAO,CAAC,gCAAU;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACXA;AACA;;;;;;;;;;;;;ACDa;;AAEb,YAAY,mBAAO,CAAC,kCAAY;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,eAAe;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;;;ACpDa;;AAEb;AACA,wBAAwB,KAAK;AAC7B;AACA;;;;;;;;;;;;;ACLa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC1Ba;;AAEb,YAAY,mBAAO,CAAC,gCAAU;;AAE9B;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;;;;;;;ACvEa;;AAEb,cAAc,mBAAO,CAAC,sCAAa;AACnC,iBAAiB,mBAAO,CAAC,oDAAoB;;AAE7C;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;ACrFa;;AAEb,WAAW,mBAAO,CAAC,6CAAgB;;AAEnC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;;AAGA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS,GAAG,SAAS;AAC5C,2BAA2B;AAC3B;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,4BAA4B;AAC5B,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,EAAE;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"axios.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"axios\"] = factory();\n\telse\n\t\troot[\"axios\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./index.js\");\n","module.exports = require('./lib/axios');","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar transitionalDefaults = require('../defaults/transitional');\nvar AxiosError = require('../core/AxiosError');\nvar CanceledError = require('../cancel/CanceledError');\nvar parseProtocol = require('../helpers/parseProtocol');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n var transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n var protocol = parseProtocol(fullPath);\n\n if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = require('./cancel/CanceledError');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\naxios.toFormData = require('./helpers/toFormData');\n\n// Expose AxiosError class\naxios.AxiosError = require('../lib/core/AxiosError');\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\nvar CanceledError = require('./CanceledError');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nvar AxiosError = require('../core/AxiosError');\nvar utils = require('../utils');\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction CanceledError(message) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nmodule.exports = CanceledError;\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar buildFullPath = require('./buildFullPath');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n var fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url: url,\n data: data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nvar prototype = AxiosError.prototype;\nvar descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED'\n// eslint-disable-next-line func-names\n].forEach(function(code) {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = function(error, code, config, request, response, customProps) {\n var axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nmodule.exports = AxiosError;\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar CanceledError = require('../cancel/CanceledError');\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","'use strict';\n\nvar AxiosError = require('./AxiosError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar normalizeHeaderName = require('../helpers/normalizeHeaderName');\nvar AxiosError = require('../core/AxiosError');\nvar transitionalDefaults = require('./transitional');\nvar toFormData = require('../helpers/toFormData');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('../adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('../adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n\n var isObjectPayload = utils.isObject(data);\n var contentType = headers && headers['Content-Type'];\n\n var isFileList;\n\n if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {\n var _FormData = this.env && this.env.FormData;\n return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());\n } else if (isObjectPayload || contentType === 'application/json') {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: require('./env/FormData')\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nmodule.exports = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","module.exports = {\n \"version\": \"0.27.2\"\n};","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","// eslint-disable-next-line strict\nmodule.exports = null;\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nmodule.exports = function parseProtocol(url) {\n var match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n};\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Convert a data object to FormData\n * @param {Object} obj\n * @param {?Object} [formData]\n * @returns {Object}\n **/\n\nfunction toFormData(obj, formData) {\n // eslint-disable-next-line no-param-reassign\n formData = formData || new FormData();\n\n var stack = [];\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n function build(data, parentKey) {\n if (utils.isPlainObject(data) || utils.isArray(data)) {\n if (stack.indexOf(data) !== -1) {\n throw Error('Circular reference detected in ' + parentKey);\n }\n\n stack.push(data);\n\n utils.forEach(data, function each(value, key) {\n if (utils.isUndefined(value)) return;\n var fullKey = parentKey ? parentKey + '.' + key : key;\n var arr;\n\n if (value && !parentKey && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {\n // eslint-disable-next-line func-names\n arr.forEach(function(el) {\n !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));\n });\n return;\n }\n }\n\n build(value, fullKey);\n });\n\n stack.pop();\n } else {\n formData.append(parentKey, convertValue(data));\n }\n }\n\n build(obj);\n\n return formData;\n}\n\nmodule.exports = toFormData;\n","'use strict';\n\nvar VERSION = require('../env/data').version;\nvar AxiosError = require('../core/AxiosError');\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n// eslint-disable-next-line func-names\nvar kindOf = (function(cache) {\n // eslint-disable-next-line func-names\n return function(thing) {\n var str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n };\n})(Object.create(null));\n\nfunction kindOfTest(type) {\n type = type.toLowerCase();\n return function isKindOf(thing) {\n return kindOf(thing) === type;\n };\n}\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return Array.isArray(val);\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nvar isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nvar isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nvar isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} thing The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(thing) {\n var pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nvar isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n */\n\nfunction inherits(constructor, superConstructor, props, descriptors) {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function} [filter]\n * @returns {Object}\n */\n\nfunction toFlatObject(sourceObj, destObj, filter) {\n var props;\n var i;\n var prop;\n var merged = {};\n\n destObj = destObj || {};\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if (!merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = Object.getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/*\n * determines whether a string ends with the characters of a specified string\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n * @returns {boolean}\n */\nfunction endsWith(str, searchString, position) {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n var lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object\n * @param {*} [thing]\n * @returns {Array}\n */\nfunction toArray(thing) {\n if (!thing) return null;\n var i = thing.length;\n if (isUndefined(i)) return null;\n var arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n// eslint-disable-next-line func-names\nvar isTypedArray = (function(TypedArray) {\n // eslint-disable-next-line func-names\n return function(thing) {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM,\n inherits: inherits,\n toFlatObject: toFlatObject,\n kindOf: kindOf,\n kindOfTest: kindOfTest,\n endsWith: endsWith,\n toArray: toArray,\n isTypedArray: isTypedArray,\n isFileList: isFileList\n};\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/js_css/boxicons.css b/js_css/boxicons.css
new file mode 100644
index 0000000..c4fe27a
--- /dev/null
+++ b/js_css/boxicons.css
@@ -0,0 +1,5425 @@
+@font-face
+{
+ font-family: 'boxicons';
+ font-weight: normal;
+ font-style: normal;
+
+ src: url('/js_css/fount/boxicons.ttf');
+ src: url('/js_css/fount/boxicons.eot') format('embedded-opentype'),
+ url('/js_css/fount/boxicons.woff2') format('woff2'),
+ url('/js_css/fount/boxicons.woff') format('woff'),
+ url('/js_css/fount/boxicons.ttf') format('truetype'),
+ url('/js_css/fount/boxicons.svg?#boxicons') format('svg');
+}
+.bx
+{
+ font-family: 'boxicons' !important;
+ font-weight: normal;
+ font-style: normal;
+ font-variant: normal;
+ line-height: 1;
+ text-rendering: auto;
+ display: inline-block;
+
+ text-transform: none;
+
+ speak: none;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.bx-ul
+{
+ margin-left: 2em;
+ padding-left: 0;
+
+ list-style: none;
+}
+.bx-ul > li
+{
+ position: relative;
+}
+.bx-ul .bx
+{
+ font-size: inherit;
+ line-height: inherit;
+
+ position: absolute;
+ left: -2em;
+
+ width: 2em;
+
+ text-align: center;
+}
+@-webkit-keyframes spin
+{
+ 0%
+ {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100%
+ {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin
+{
+ 0%
+ {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100%
+ {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes burst
+{
+ 0%
+ {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+
+ opacity: 1;
+ }
+ 90%
+ {
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+
+ opacity: 0;
+ }
+}
+@keyframes burst
+{
+ 0%
+ {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+
+ opacity: 1;
+ }
+ 90%
+ {
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+
+ opacity: 0;
+ }
+}
+@-webkit-keyframes flashing
+{
+ 0%
+ {
+ opacity: 1;
+ }
+ 45%
+ {
+ opacity: 0;
+ }
+ 90%
+ {
+ opacity: 1;
+ }
+}
+@keyframes flashing
+{
+ 0%
+ {
+ opacity: 1;
+ }
+ 45%
+ {
+ opacity: 0;
+ }
+ 90%
+ {
+ opacity: 1;
+ }
+}
+@-webkit-keyframes fade-left
+{
+ 0%
+ {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+
+ opacity: 0;
+ }
+}
+@keyframes fade-left
+{
+ 0%
+ {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-right
+{
+ 0%
+ {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+
+ opacity: 0;
+ }
+}
+@keyframes fade-right
+{
+ 0%
+ {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-up
+{
+ 0%
+ {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+
+ opacity: 0;
+ }
+}
+@keyframes fade-up
+{
+ 0%
+ {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-down
+{
+ 0%
+ {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+
+ opacity: 0;
+ }
+}
+@keyframes fade-down
+{
+ 0%
+ {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+
+ opacity: 1;
+ }
+ 75%
+ {
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+
+ opacity: 0;
+ }
+}
+@-webkit-keyframes tada
+{
+ from
+ {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%,
+ 20%
+ {
+ -webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
+ }
+
+ 30%,
+ 50%,
+ 70%,
+ 90%
+ {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ }
+
+ 40%,
+ 60%,
+ 80%
+ {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
+ }
+
+ to
+ {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes tada
+{
+ from
+ {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%,
+ 20%
+ {
+ -webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
+ }
+
+ 30%,
+ 50%,
+ 70%,
+ 90%
+ {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ }
+
+ 40%,
+ 60%,
+ 80%
+ {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+
+ to
+ {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+.bx-spin
+{
+ -webkit-animation: spin 2s linear infinite;
+ animation: spin 2s linear infinite;
+}
+.bx-spin-hover:hover
+{
+ -webkit-animation: spin 2s linear infinite;
+ animation: spin 2s linear infinite;
+}
+
+.bx-tada
+{
+ -webkit-animation: tada 1.5s ease infinite;
+ animation: tada 1.5s ease infinite;
+}
+.bx-tada-hover:hover
+{
+ -webkit-animation: tada 1.5s ease infinite;
+ animation: tada 1.5s ease infinite;
+}
+
+.bx-flashing
+{
+ -webkit-animation: flashing 1.5s infinite linear;
+ animation: flashing 1.5s infinite linear;
+}
+.bx-flashing-hover:hover
+{
+ -webkit-animation: flashing 1.5s infinite linear;
+ animation: flashing 1.5s infinite linear;
+}
+
+.bx-burst
+{
+ -webkit-animation: burst 1.5s infinite linear;
+ animation: burst 1.5s infinite linear;
+}
+.bx-burst-hover:hover
+{
+ -webkit-animation: burst 1.5s infinite linear;
+ animation: burst 1.5s infinite linear;
+}
+.bx-fade-up
+{
+ -webkit-animation: fade-up 1.5s infinite linear;
+ animation: fade-up 1.5s infinite linear;
+}
+.bx-fade-up-hover:hover
+{
+ -webkit-animation: fade-up 1.5s infinite linear;
+ animation: fade-up 1.5s infinite linear;
+}
+.bx-fade-down
+{
+ -webkit-animation: fade-down 1.5s infinite linear;
+ animation: fade-down 1.5s infinite linear;
+}
+.bx-fade-down-hover:hover
+{
+ -webkit-animation: fade-down 1.5s infinite linear;
+ animation: fade-down 1.5s infinite linear;
+}
+.bx-fade-left
+{
+ -webkit-animation: fade-left 1.5s infinite linear;
+ animation: fade-left 1.5s infinite linear;
+}
+.bx-fade-left-hover:hover
+{
+ -webkit-animation: fade-left 1.5s infinite linear;
+ animation: fade-left 1.5s infinite linear;
+}
+.bx-fade-right
+{
+ -webkit-animation: fade-right 1.5s infinite linear;
+ animation: fade-right 1.5s infinite linear;
+}
+.bx-fade-right-hover:hover
+{
+ -webkit-animation: fade-right 1.5s infinite linear;
+ animation: fade-right 1.5s infinite linear;
+}
+.bx-xs
+{
+ font-size: 1rem!important;
+}
+.bx-sm
+{
+ font-size: 1.55rem!important;
+}
+.bx-md
+{
+ font-size: 2.25rem!important;
+}
+.bx-lg
+{
+ font-size: 3.0rem!important;
+}
+.bx-fw
+{
+ font-size: 1.2857142857em;
+ line-height: .8em;
+
+ width: 1.2857142857em;
+ height: .8em;
+ margin-top: -.2em!important;
+
+ vertical-align: middle;
+}
+.bx-pull-left
+{
+ float: left;
+
+ margin-right: .3em!important;
+}
+.bx-pull-right
+{
+ float: right;
+
+ margin-left: .3em!important;
+}
+.bx-rotate-90
+{
+ transform: rotate(90deg);
+
+ -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)';
+}
+.bx-rotate-180
+{
+ transform: rotate(180deg);
+
+ -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)';
+}
+.bx-rotate-270
+{
+ transform: rotate(270deg);
+
+ -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';
+}
+.bx-flip-horizontal
+{
+ transform: scaleX(-1);
+
+ -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)';
+}
+.bx-flip-vertical
+{
+ transform: scaleY(-1);
+
+ -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)';
+}
+.bx-border
+{
+ padding: .25em;
+
+ border: .07em solid rgba(0,0,0,.1);
+ border-radius: .25em;
+}
+.bx-border-circle
+{
+ padding: .25em;
+
+ border: .07em solid rgba(0,0,0,.1);
+ border-radius: 50%;
+}
+
+ .bxs-balloon:before {
+ content: "\eb60";
+ }
+ .bxs-castle:before {
+ content: "\eb79";
+ }
+ .bxs-coffee-bean:before {
+ content: "\eb92";
+ }
+ .bxs-objects-horizontal-center:before {
+ content: "\ebab";
+ }
+ .bxs-objects-horizontal-left:before {
+ content: "\ebc4";
+ }
+ .bxs-objects-horizontal-right:before {
+ content: "\ebdd";
+ }
+ .bxs-objects-vertical-bottom:before {
+ content: "\ebf6";
+ }
+ .bxs-objects-vertical-center:before {
+ content: "\ef40";
+ }
+ .bxs-objects-vertical-top:before {
+ content: "\ef41";
+ }
+ .bxs-pear:before {
+ content: "\ef42";
+ }
+ .bxs-shield-minus:before {
+ content: "\ef43";
+ }
+ .bxs-shield-plus:before {
+ content: "\ef44";
+ }
+ .bxs-shower:before {
+ content: "\ef45";
+ }
+ .bxs-sushi:before {
+ content: "\ef46";
+ }
+ .bxs-universal-access:before {
+ content: "\ef47";
+ }
+ .bx-child:before {
+ content: "\ef48";
+ }
+ .bx-horizontal-left:before {
+ content: "\ef49";
+ }
+ .bx-horizontal-right:before {
+ content: "\ef4a";
+ }
+ .bx-objects-horizontal-center:before {
+ content: "\ef4b";
+ }
+ .bx-objects-horizontal-left:before {
+ content: "\ef4c";
+ }
+ .bx-objects-horizontal-right:before {
+ content: "\ef4d";
+ }
+ .bx-objects-vertical-bottom:before {
+ content: "\ef4e";
+ }
+ .bx-objects-vertical-center:before {
+ content: "\ef4f";
+ }
+ .bx-objects-vertical-top:before {
+ content: "\ef50";
+ }
+ .bx-rfid:before {
+ content: "\ef51";
+ }
+ .bx-shield-minus:before {
+ content: "\ef52";
+ }
+ .bx-shield-plus:before {
+ content: "\ef53";
+ }
+ .bx-shower:before {
+ content: "\ef54";
+ }
+ .bx-sushi:before {
+ content: "\ef55";
+ }
+ .bx-universal-access:before {
+ content: "\ef56";
+ }
+ .bx-vertical-bottom:before {
+ content: "\ef57";
+ }
+ .bx-vertical-top:before {
+ content: "\ef58";
+ }
+ .bxl-graphql:before {
+ content: "\ef59";
+ }
+ .bxl-typescript:before {
+ content: "\ef5a";
+ }
+ .bxs-color:before {
+ content: "\ef39";
+ }
+ .bx-reflect-horizontal:before {
+ content: "\ef3a";
+ }
+ .bx-reflect-vertical:before {
+ content: "\ef3b";
+ }
+ .bx-color:before {
+ content: "\ef3c";
+ }
+ .bxl-mongodb:before {
+ content: "\ef3d";
+ }
+ .bxl-postgresql:before {
+ content: "\ef3e";
+ }
+ .bxl-deezer:before {
+ content: "\ef3f";
+ }
+ .bxs-hard-hat:before {
+ content: "\ef2a";
+ }
+ .bxs-home-alt-2:before {
+ content: "\ef2b";
+ }
+ .bxs-cheese:before {
+ content: "\ef2c";
+ }
+ .bx-home-alt-2:before {
+ content: "\ef2d";
+ }
+ .bx-hard-hat:before {
+ content: "\ef2e";
+ }
+ .bx-cheese:before {
+ content: "\ef2f";
+ }
+ .bx-cart-add:before {
+ content: "\ef30";
+ }
+ .bx-cart-download:before {
+ content: "\ef31";
+ }
+ .bx-no-signal:before {
+ content: "\ef32";
+ }
+ .bx-signal-1:before {
+ content: "\ef33";
+ }
+ .bx-signal-2:before {
+ content: "\ef34";
+ }
+ .bx-signal-3:before {
+ content: "\ef35";
+ }
+ .bx-signal-4:before {
+ content: "\ef36";
+ }
+ .bx-signal-5:before {
+ content: "\ef37";
+ }
+ .bxl-xing:before {
+ content: "\ef38";
+ }
+ .bxl-meta:before {
+ content: "\ef27";
+ }
+ .bx-lemon:before {
+ content: "\ef28";
+ }
+ .bxs-lemon:before {
+ content: "\ef29";
+ }
+ .bx-cricket-ball:before {
+ content: "\ef0c";
+ }
+ .bx-baguette:before {
+ content: "\ef0d";
+ }
+ .bx-bowl-hot:before {
+ content: "\ef0e";
+ }
+ .bx-bowl-rice:before {
+ content: "\ef0f";
+ }
+ .bx-cable-car:before {
+ content: "\ef10";
+ }
+ .bx-candles:before {
+ content: "\ef11";
+ }
+ .bx-circle-half:before {
+ content: "\ef12";
+ }
+ .bx-circle-quarter:before {
+ content: "\ef13";
+ }
+ .bx-circle-three-quarter:before {
+ content: "\ef14";
+ }
+ .bx-cross:before {
+ content: "\ef15";
+ }
+ .bx-fork:before {
+ content: "\ef16";
+ }
+ .bx-knife:before {
+ content: "\ef17";
+ }
+ .bx-money-withdraw:before {
+ content: "\ef18";
+ }
+ .bx-popsicle:before {
+ content: "\ef19";
+ }
+ .bx-scatter-chart:before {
+ content: "\ef1a";
+ }
+ .bxs-baguette:before {
+ content: "\ef1b";
+ }
+ .bxs-bowl-hot:before {
+ content: "\ef1c";
+ }
+ .bxs-bowl-rice:before {
+ content: "\ef1d";
+ }
+ .bxs-cable-car:before {
+ content: "\ef1e";
+ }
+ .bxs-circle-half:before {
+ content: "\ef1f";
+ }
+ .bxs-circle-quarter:before {
+ content: "\ef20";
+ }
+ .bxs-circle-three-quarter:before {
+ content: "\ef21";
+ }
+ .bxs-cricket-ball:before {
+ content: "\ef22";
+ }
+ .bxs-invader:before {
+ content: "\ef23";
+ }
+ .bx-male-female:before {
+ content: "\ef24";
+ }
+ .bxs-popsicle:before {
+ content: "\ef25";
+ }
+ .bxs-tree-alt:before {
+ content: "\ef26";
+ }
+ .bxl-venmo:before {
+ content: "\e900";
+ }
+ .bxl-upwork:before {
+ content: "\e901";
+ }
+ .bxl-netlify:before {
+ content: "\e902";
+ }
+ .bxl-java:before {
+ content: "\e903";
+ }
+ .bxl-heroku:before {
+ content: "\e904";
+ }
+ .bxl-go-lang:before {
+ content: "\e905";
+ }
+ .bxl-gmail:before {
+ content: "\e906";
+ }
+ .bxl-flask:before {
+ content: "\e907";
+ }
+ .bxl-99designs:before {
+ content: "\e908";
+ }
+ .bxl-500px:before {
+ content: "\e909";
+ }
+ .bxl-adobe:before {
+ content: "\e90a";
+ }
+ .bxl-airbnb:before {
+ content: "\e90b";
+ }
+ .bxl-algolia:before {
+ content: "\e90c";
+ }
+ .bxl-amazon:before {
+ content: "\e90d";
+ }
+ .bxl-android:before {
+ content: "\e90e";
+ }
+ .bxl-angular:before {
+ content: "\e90f";
+ }
+ .bxl-apple:before {
+ content: "\e910";
+ }
+ .bxl-audible:before {
+ content: "\e911";
+ }
+ .bxl-aws:before {
+ content: "\e912";
+ }
+ .bxl-baidu:before {
+ content: "\e913";
+ }
+ .bxl-behance:before {
+ content: "\e914";
+ }
+ .bxl-bing:before {
+ content: "\e915";
+ }
+ .bxl-bitcoin:before {
+ content: "\e916";
+ }
+ .bxl-blender:before {
+ content: "\e917";
+ }
+ .bxl-blogger:before {
+ content: "\e918";
+ }
+ .bxl-bootstrap:before {
+ content: "\e919";
+ }
+ .bxl-chrome:before {
+ content: "\e91a";
+ }
+ .bxl-codepen:before {
+ content: "\e91b";
+ }
+ .bxl-c-plus-plus:before {
+ content: "\e91c";
+ }
+ .bxl-creative-commons:before {
+ content: "\e91d";
+ }
+ .bxl-css3:before {
+ content: "\e91e";
+ }
+ .bxl-dailymotion:before {
+ content: "\e91f";
+ }
+ .bxl-deviantart:before {
+ content: "\e920";
+ }
+ .bxl-dev-to:before {
+ content: "\e921";
+ }
+ .bxl-digg:before {
+ content: "\e922";
+ }
+ .bxl-digitalocean:before {
+ content: "\e923";
+ }
+ .bxl-discord:before {
+ content: "\e924";
+ }
+ .bxl-discord-alt:before {
+ content: "\e925";
+ }
+ .bxl-discourse:before {
+ content: "\e926";
+ }
+ .bxl-django:before {
+ content: "\e927";
+ }
+ .bxl-docker:before {
+ content: "\e928";
+ }
+ .bxl-dribbble:before {
+ content: "\e929";
+ }
+ .bxl-dropbox:before {
+ content: "\e92a";
+ }
+ .bxl-drupal:before {
+ content: "\e92b";
+ }
+ .bxl-ebay:before {
+ content: "\e92c";
+ }
+ .bxl-edge:before {
+ content: "\e92d";
+ }
+ .bxl-etsy:before {
+ content: "\e92e";
+ }
+ .bxl-facebook:before {
+ content: "\e92f";
+ }
+ .bxl-facebook-circle:before {
+ content: "\e930";
+ }
+ .bxl-facebook-square:before {
+ content: "\e931";
+ }
+ .bxl-figma:before {
+ content: "\e932";
+ }
+ .bxl-firebase:before {
+ content: "\e933";
+ }
+ .bxl-firefox:before {
+ content: "\e934";
+ }
+ .bxl-flickr:before {
+ content: "\e935";
+ }
+ .bxl-flickr-square:before {
+ content: "\e936";
+ }
+ .bxl-flutter:before {
+ content: "\e937";
+ }
+ .bxl-foursquare:before {
+ content: "\e938";
+ }
+ .bxl-git:before {
+ content: "\e939";
+ }
+ .bxl-github:before {
+ content: "\e93a";
+ }
+ .bxl-gitlab:before {
+ content: "\e93b";
+ }
+ .bxl-google:before {
+ content: "\e93c";
+ }
+ .bxl-google-cloud:before {
+ content: "\e93d";
+ }
+ .bxl-google-plus:before {
+ content: "\e93e";
+ }
+ .bxl-google-plus-circle:before {
+ content: "\e93f";
+ }
+ .bxl-html5:before {
+ content: "\e940";
+ }
+ .bxl-imdb:before {
+ content: "\e941";
+ }
+ .bxl-instagram:before {
+ content: "\e942";
+ }
+ .bxl-instagram-alt:before {
+ content: "\e943";
+ }
+ .bxl-internet-explorer:before {
+ content: "\e944";
+ }
+ .bxl-invision:before {
+ content: "\e945";
+ }
+ .bxl-javascript:before {
+ content: "\e946";
+ }
+ .bxl-joomla:before {
+ content: "\e947";
+ }
+ .bxl-jquery:before {
+ content: "\e948";
+ }
+ .bxl-jsfiddle:before {
+ content: "\e949";
+ }
+ .bxl-kickstarter:before {
+ content: "\e94a";
+ }
+ .bxl-kubernetes:before {
+ content: "\e94b";
+ }
+ .bxl-less:before {
+ content: "\e94c";
+ }
+ .bxl-linkedin:before {
+ content: "\e94d";
+ }
+ .bxl-linkedin-square:before {
+ content: "\e94e";
+ }
+ .bxl-magento:before {
+ content: "\e94f";
+ }
+ .bxl-mailchimp:before {
+ content: "\e950";
+ }
+ .bxl-markdown:before {
+ content: "\e951";
+ }
+ .bxl-mastercard:before {
+ content: "\e952";
+ }
+ .bxl-mastodon:before {
+ content: "\e953";
+ }
+ .bxl-medium:before {
+ content: "\e954";
+ }
+ .bxl-medium-old:before {
+ content: "\e955";
+ }
+ .bxl-medium-square:before {
+ content: "\e956";
+ }
+ .bxl-messenger:before {
+ content: "\e957";
+ }
+ .bxl-microsoft:before {
+ content: "\e958";
+ }
+ .bxl-microsoft-teams:before {
+ content: "\e959";
+ }
+ .bxl-nodejs:before {
+ content: "\e95a";
+ }
+ .bxl-ok-ru:before {
+ content: "\e95b";
+ }
+ .bxl-opera:before {
+ content: "\e95c";
+ }
+ .bxl-patreon:before {
+ content: "\e95d";
+ }
+ .bxl-paypal:before {
+ content: "\e95e";
+ }
+ .bxl-periscope:before {
+ content: "\e95f";
+ }
+ .bxl-php:before {
+ content: "\e960";
+ }
+ .bxl-pinterest:before {
+ content: "\e961";
+ }
+ .bxl-pinterest-alt:before {
+ content: "\e962";
+ }
+ .bxl-play-store:before {
+ content: "\e963";
+ }
+ .bxl-pocket:before {
+ content: "\e964";
+ }
+ .bxl-product-hunt:before {
+ content: "\e965";
+ }
+ .bxl-python:before {
+ content: "\e966";
+ }
+ .bxl-quora:before {
+ content: "\e967";
+ }
+ .bxl-react:before {
+ content: "\e968";
+ }
+ .bxl-redbubble:before {
+ content: "\e969";
+ }
+ .bxl-reddit:before {
+ content: "\e96a";
+ }
+ .bxl-redux:before {
+ content: "\e96b";
+ }
+ .bxl-sass:before {
+ content: "\e96c";
+ }
+ .bxl-shopify:before {
+ content: "\e96d";
+ }
+ .bxl-sketch:before {
+ content: "\e96e";
+ }
+ .bxl-skype:before {
+ content: "\e96f";
+ }
+ .bxl-slack:before {
+ content: "\e970";
+ }
+ .bxl-slack-old:before {
+ content: "\e971";
+ }
+ .bxl-snapchat:before {
+ content: "\e972";
+ }
+ .bxl-soundcloud:before {
+ content: "\e973";
+ }
+ .bxl-spotify:before {
+ content: "\e974";
+ }
+ .bxl-spring-boot:before {
+ content: "\e975";
+ }
+ .bxl-squarespace:before {
+ content: "\e976";
+ }
+ .bxl-stack-overflow:before {
+ content: "\e977";
+ }
+ .bxl-steam:before {
+ content: "\e978";
+ }
+ .bxl-stripe:before {
+ content: "\e979";
+ }
+ .bxl-tailwind-css:before {
+ content: "\e97a";
+ }
+ .bxl-telegram:before {
+ content: "\e97b";
+ }
+ .bxl-tiktok:before {
+ content: "\e97c";
+ }
+ .bxl-trello:before {
+ content: "\e97d";
+ }
+ .bxl-trip-advisor:before {
+ content: "\e97e";
+ }
+ .bxl-tumblr:before {
+ content: "\e97f";
+ }
+ .bxl-tux:before {
+ content: "\e980";
+ }
+ .bxl-twitch:before {
+ content: "\e981";
+ }
+ .bxl-twitter:before {
+ content: "\e982";
+ }
+ .bxl-unity:before {
+ content: "\e983";
+ }
+ .bxl-unsplash:before {
+ content: "\e984";
+ }
+ .bxl-vimeo:before {
+ content: "\e985";
+ }
+ .bxl-visa:before {
+ content: "\e986";
+ }
+ .bxl-visual-studio:before {
+ content: "\e987";
+ }
+ .bxl-vk:before {
+ content: "\e988";
+ }
+ .bxl-vuejs:before {
+ content: "\e989";
+ }
+ .bxl-whatsapp:before {
+ content: "\e98a";
+ }
+ .bxl-whatsapp-square:before {
+ content: "\e98b";
+ }
+ .bxl-wikipedia:before {
+ content: "\e98c";
+ }
+ .bxl-windows:before {
+ content: "\e98d";
+ }
+ .bxl-wix:before {
+ content: "\e98e";
+ }
+ .bxl-wordpress:before {
+ content: "\e98f";
+ }
+ .bxl-yahoo:before {
+ content: "\e990";
+ }
+ .bxl-yelp:before {
+ content: "\e991";
+ }
+ .bxl-youtube:before {
+ content: "\e992";
+ }
+ .bxl-zoom:before {
+ content: "\e993";
+ }
+ .bx-collapse-alt:before {
+ content: "\e994";
+ }
+ .bx-collapse-horizontal:before {
+ content: "\e995";
+ }
+ .bx-collapse-vertical:before {
+ content: "\e996";
+ }
+ .bx-expand-horizontal:before {
+ content: "\e997";
+ }
+ .bx-expand-vertical:before {
+ content: "\e998";
+ }
+ .bx-injection:before {
+ content: "\e999";
+ }
+ .bx-leaf:before {
+ content: "\e99a";
+ }
+ .bx-math:before {
+ content: "\e99b";
+ }
+ .bx-party:before {
+ content: "\e99c";
+ }
+ .bx-abacus:before {
+ content: "\e99d";
+ }
+ .bx-accessibility:before {
+ content: "\e99e";
+ }
+ .bx-add-to-queue:before {
+ content: "\e99f";
+ }
+ .bx-adjust:before {
+ content: "\e9a0";
+ }
+ .bx-alarm:before {
+ content: "\e9a1";
+ }
+ .bx-alarm-add:before {
+ content: "\e9a2";
+ }
+ .bx-alarm-exclamation:before {
+ content: "\e9a3";
+ }
+ .bx-alarm-off:before {
+ content: "\e9a4";
+ }
+ .bx-alarm-snooze:before {
+ content: "\e9a5";
+ }
+ .bx-album:before {
+ content: "\e9a6";
+ }
+ .bx-align-justify:before {
+ content: "\e9a7";
+ }
+ .bx-align-left:before {
+ content: "\e9a8";
+ }
+ .bx-align-middle:before {
+ content: "\e9a9";
+ }
+ .bx-align-right:before {
+ content: "\e9aa";
+ }
+ .bx-analyse:before {
+ content: "\e9ab";
+ }
+ .bx-anchor:before {
+ content: "\e9ac";
+ }
+ .bx-angry:before {
+ content: "\e9ad";
+ }
+ .bx-aperture:before {
+ content: "\e9ae";
+ }
+ .bx-arch:before {
+ content: "\e9af";
+ }
+ .bx-archive:before {
+ content: "\e9b0";
+ }
+ .bx-archive-in:before {
+ content: "\e9b1";
+ }
+ .bx-archive-out:before {
+ content: "\e9b2";
+ }
+ .bx-area:before {
+ content: "\e9b3";
+ }
+ .bx-arrow-back:before {
+ content: "\e9b4";
+ }
+ .bx-arrow-from-bottom:before {
+ content: "\e9b5";
+ }
+ .bx-arrow-from-left:before {
+ content: "\e9b6";
+ }
+ .bx-arrow-from-right:before {
+ content: "\e9b7";
+ }
+ .bx-arrow-from-top:before {
+ content: "\e9b8";
+ }
+ .bx-arrow-to-bottom:before {
+ content: "\e9b9";
+ }
+ .bx-arrow-to-left:before {
+ content: "\e9ba";
+ }
+ .bx-arrow-to-right:before {
+ content: "\e9bb";
+ }
+ .bx-arrow-to-top:before {
+ content: "\e9bc";
+ }
+ .bx-at:before {
+ content: "\e9bd";
+ }
+ .bx-atom:before {
+ content: "\e9be";
+ }
+ .bx-award:before {
+ content: "\e9bf";
+ }
+ .bx-badge:before {
+ content: "\e9c0";
+ }
+ .bx-badge-check:before {
+ content: "\e9c1";
+ }
+ .bx-ball:before {
+ content: "\e9c2";
+ }
+ .bx-band-aid:before {
+ content: "\e9c3";
+ }
+ .bx-bar-chart:before {
+ content: "\e9c4";
+ }
+ .bx-bar-chart-alt:before {
+ content: "\e9c5";
+ }
+ .bx-bar-chart-alt-2:before {
+ content: "\e9c6";
+ }
+ .bx-bar-chart-square:before {
+ content: "\e9c7";
+ }
+ .bx-barcode:before {
+ content: "\e9c8";
+ }
+ .bx-barcode-reader:before {
+ content: "\e9c9";
+ }
+ .bx-baseball:before {
+ content: "\e9ca";
+ }
+ .bx-basket:before {
+ content: "\e9cb";
+ }
+ .bx-basketball:before {
+ content: "\e9cc";
+ }
+ .bx-bath:before {
+ content: "\e9cd";
+ }
+ .bx-battery:before {
+ content: "\e9ce";
+ }
+ .bx-bed:before {
+ content: "\e9cf";
+ }
+ .bx-been-here:before {
+ content: "\e9d0";
+ }
+ .bx-beer:before {
+ content: "\e9d1";
+ }
+ .bx-bell:before {
+ content: "\e9d2";
+ }
+ .bx-bell-minus:before {
+ content: "\e9d3";
+ }
+ .bx-bell-off:before {
+ content: "\e9d4";
+ }
+ .bx-bell-plus:before {
+ content: "\e9d5";
+ }
+ .bx-bible:before {
+ content: "\e9d6";
+ }
+ .bx-bitcoin:before {
+ content: "\e9d7";
+ }
+ .bx-blanket:before {
+ content: "\e9d8";
+ }
+ .bx-block:before {
+ content: "\e9d9";
+ }
+ .bx-bluetooth:before {
+ content: "\e9da";
+ }
+ .bx-body:before {
+ content: "\e9db";
+ }
+ .bx-bold:before {
+ content: "\e9dc";
+ }
+ .bx-bolt-circle:before {
+ content: "\e9dd";
+ }
+ .bx-bomb:before {
+ content: "\e9de";
+ }
+ .bx-bone:before {
+ content: "\e9df";
+ }
+ .bx-bong:before {
+ content: "\e9e0";
+ }
+ .bx-book:before {
+ content: "\e9e1";
+ }
+ .bx-book-add:before {
+ content: "\e9e2";
+ }
+ .bx-book-alt:before {
+ content: "\e9e3";
+ }
+ .bx-book-bookmark:before {
+ content: "\e9e4";
+ }
+ .bx-book-content:before {
+ content: "\e9e5";
+ }
+ .bx-book-heart:before {
+ content: "\e9e6";
+ }
+ .bx-bookmark:before {
+ content: "\e9e7";
+ }
+ .bx-bookmark-alt:before {
+ content: "\e9e8";
+ }
+ .bx-bookmark-alt-minus:before {
+ content: "\e9e9";
+ }
+ .bx-bookmark-alt-plus:before {
+ content: "\e9ea";
+ }
+ .bx-bookmark-heart:before {
+ content: "\e9eb";
+ }
+ .bx-bookmark-minus:before {
+ content: "\e9ec";
+ }
+ .bx-bookmark-plus:before {
+ content: "\e9ed";
+ }
+ .bx-bookmarks:before {
+ content: "\e9ee";
+ }
+ .bx-book-open:before {
+ content: "\e9ef";
+ }
+ .bx-book-reader:before {
+ content: "\e9f0";
+ }
+ .bx-border-all:before {
+ content: "\e9f1";
+ }
+ .bx-border-bottom:before {
+ content: "\e9f2";
+ }
+ .bx-border-inner:before {
+ content: "\e9f3";
+ }
+ .bx-border-left:before {
+ content: "\e9f4";
+ }
+ .bx-border-none:before {
+ content: "\e9f5";
+ }
+ .bx-border-outer:before {
+ content: "\e9f6";
+ }
+ .bx-border-radius:before {
+ content: "\e9f7";
+ }
+ .bx-border-right:before {
+ content: "\e9f8";
+ }
+ .bx-border-top:before {
+ content: "\e9f9";
+ }
+ .bx-bot:before {
+ content: "\e9fa";
+ }
+ .bx-bowling-ball:before {
+ content: "\e9fb";
+ }
+ .bx-box:before {
+ content: "\e9fc";
+ }
+ .bx-bracket:before {
+ content: "\e9fd";
+ }
+ .bx-braille:before {
+ content: "\e9fe";
+ }
+ .bx-brain:before {
+ content: "\e9ff";
+ }
+ .bx-briefcase:before {
+ content: "\ea00";
+ }
+ .bx-briefcase-alt:before {
+ content: "\ea01";
+ }
+ .bx-briefcase-alt-2:before {
+ content: "\ea02";
+ }
+ .bx-brightness:before {
+ content: "\ea03";
+ }
+ .bx-brightness-half:before {
+ content: "\ea04";
+ }
+ .bx-broadcast:before {
+ content: "\ea05";
+ }
+ .bx-brush:before {
+ content: "\ea06";
+ }
+ .bx-brush-alt:before {
+ content: "\ea07";
+ }
+ .bx-bug:before {
+ content: "\ea08";
+ }
+ .bx-bug-alt:before {
+ content: "\ea09";
+ }
+ .bx-building:before {
+ content: "\ea0a";
+ }
+ .bx-building-house:before {
+ content: "\ea0b";
+ }
+ .bx-buildings:before {
+ content: "\ea0c";
+ }
+ .bx-bulb:before {
+ content: "\ea0d";
+ }
+ .bx-bullseye:before {
+ content: "\ea0e";
+ }
+ .bx-buoy:before {
+ content: "\ea0f";
+ }
+ .bx-bus:before {
+ content: "\ea10";
+ }
+ .bx-bus-school:before {
+ content: "\ea11";
+ }
+ .bx-cabinet:before {
+ content: "\ea12";
+ }
+ .bx-cake:before {
+ content: "\ea13";
+ }
+ .bx-calculator:before {
+ content: "\ea14";
+ }
+ .bx-calendar:before {
+ content: "\ea15";
+ }
+ .bx-calendar-alt:before {
+ content: "\ea16";
+ }
+ .bx-calendar-check:before {
+ content: "\ea17";
+ }
+ .bx-calendar-edit:before {
+ content: "\ea18";
+ }
+ .bx-calendar-event:before {
+ content: "\ea19";
+ }
+ .bx-calendar-exclamation:before {
+ content: "\ea1a";
+ }
+ .bx-calendar-heart:before {
+ content: "\ea1b";
+ }
+ .bx-calendar-minus:before {
+ content: "\ea1c";
+ }
+ .bx-calendar-plus:before {
+ content: "\ea1d";
+ }
+ .bx-calendar-star:before {
+ content: "\ea1e";
+ }
+ .bx-calendar-week:before {
+ content: "\ea1f";
+ }
+ .bx-calendar-x:before {
+ content: "\ea20";
+ }
+ .bx-camera:before {
+ content: "\ea21";
+ }
+ .bx-camera-home:before {
+ content: "\ea22";
+ }
+ .bx-camera-movie:before {
+ content: "\ea23";
+ }
+ .bx-camera-off:before {
+ content: "\ea24";
+ }
+ .bx-capsule:before {
+ content: "\ea25";
+ }
+ .bx-captions:before {
+ content: "\ea26";
+ }
+ .bx-car:before {
+ content: "\ea27";
+ }
+ .bx-card:before {
+ content: "\ea28";
+ }
+ .bx-caret-down:before {
+ content: "\ea29";
+ }
+ .bx-caret-down-circle:before {
+ content: "\ea2a";
+ }
+ .bx-caret-down-square:before {
+ content: "\ea2b";
+ }
+ .bx-caret-left:before {
+ content: "\ea2c";
+ }
+ .bx-caret-left-circle:before {
+ content: "\ea2d";
+ }
+ .bx-caret-left-square:before {
+ content: "\ea2e";
+ }
+ .bx-caret-right:before {
+ content: "\ea2f";
+ }
+ .bx-caret-right-circle:before {
+ content: "\ea30";
+ }
+ .bx-caret-right-square:before {
+ content: "\ea31";
+ }
+ .bx-caret-up:before {
+ content: "\ea32";
+ }
+ .bx-caret-up-circle:before {
+ content: "\ea33";
+ }
+ .bx-caret-up-square:before {
+ content: "\ea34";
+ }
+ .bx-carousel:before {
+ content: "\ea35";
+ }
+ .bx-cart:before {
+ content: "\ea36";
+ }
+ .bx-cart-alt:before {
+ content: "\ea37";
+ }
+ .bx-cast:before {
+ content: "\ea38";
+ }
+ .bx-category:before {
+ content: "\ea39";
+ }
+ .bx-category-alt:before {
+ content: "\ea3a";
+ }
+ .bx-cctv:before {
+ content: "\ea3b";
+ }
+ .bx-certification:before {
+ content: "\ea3c";
+ }
+ .bx-chair:before {
+ content: "\ea3d";
+ }
+ .bx-chalkboard:before {
+ content: "\ea3e";
+ }
+ .bx-chart:before {
+ content: "\ea3f";
+ }
+ .bx-chat:before {
+ content: "\ea40";
+ }
+ .bx-check:before {
+ content: "\ea41";
+ }
+ .bx-checkbox:before {
+ content: "\ea42";
+ }
+ .bx-checkbox-checked:before {
+ content: "\ea43";
+ }
+ .bx-checkbox-minus:before {
+ content: "\ea44";
+ }
+ .bx-checkbox-square:before {
+ content: "\ea45";
+ }
+ .bx-check-circle:before {
+ content: "\ea46";
+ }
+ .bx-check-double:before {
+ content: "\ea47";
+ }
+ .bx-check-shield:before {
+ content: "\ea48";
+ }
+ .bx-check-square:before {
+ content: "\ea49";
+ }
+ .bx-chevron-down:before {
+ content: "\ea4a";
+ }
+ .bx-chevron-down-circle:before {
+ content: "\ea4b";
+ }
+ .bx-chevron-down-square:before {
+ content: "\ea4c";
+ }
+ .bx-chevron-left:before {
+ content: "\ea4d";
+ }
+ .bx-chevron-left-circle:before {
+ content: "\ea4e";
+ }
+ .bx-chevron-left-square:before {
+ content: "\ea4f";
+ }
+ .bx-chevron-right:before {
+ content: "\ea50";
+ }
+ .bx-chevron-right-circle:before {
+ content: "\ea51";
+ }
+ .bx-chevron-right-square:before {
+ content: "\ea52";
+ }
+ .bx-chevrons-down:before {
+ content: "\ea53";
+ }
+ .bx-chevrons-left:before {
+ content: "\ea54";
+ }
+ .bx-chevrons-right:before {
+ content: "\ea55";
+ }
+ .bx-chevrons-up:before {
+ content: "\ea56";
+ }
+ .bx-chevron-up:before {
+ content: "\ea57";
+ }
+ .bx-chevron-up-circle:before {
+ content: "\ea58";
+ }
+ .bx-chevron-up-square:before {
+ content: "\ea59";
+ }
+ .bx-chip:before {
+ content: "\ea5a";
+ }
+ .bx-church:before {
+ content: "\ea5b";
+ }
+ .bx-circle:before {
+ content: "\ea5c";
+ }
+ .bx-clinic:before {
+ content: "\ea5d";
+ }
+ .bx-clipboard:before {
+ content: "\ea5e";
+ }
+ .bx-closet:before {
+ content: "\ea5f";
+ }
+ .bx-cloud:before {
+ content: "\ea60";
+ }
+ .bx-cloud-download:before {
+ content: "\ea61";
+ }
+ .bx-cloud-drizzle:before {
+ content: "\ea62";
+ }
+ .bx-cloud-lightning:before {
+ content: "\ea63";
+ }
+ .bx-cloud-light-rain:before {
+ content: "\ea64";
+ }
+ .bx-cloud-rain:before {
+ content: "\ea65";
+ }
+ .bx-cloud-snow:before {
+ content: "\ea66";
+ }
+ .bx-cloud-upload:before {
+ content: "\ea67";
+ }
+ .bx-code:before {
+ content: "\ea68";
+ }
+ .bx-code-alt:before {
+ content: "\ea69";
+ }
+ .bx-code-block:before {
+ content: "\ea6a";
+ }
+ .bx-code-curly:before {
+ content: "\ea6b";
+ }
+ .bx-coffee:before {
+ content: "\ea6c";
+ }
+ .bx-coffee-togo:before {
+ content: "\ea6d";
+ }
+ .bx-cog:before {
+ content: "\ea6e";
+ }
+ .bx-coin:before {
+ content: "\ea6f";
+ }
+ .bx-coin-stack:before {
+ content: "\ea70";
+ }
+ .bx-collapse:before {
+ content: "\ea71";
+ }
+ .bx-collection:before {
+ content: "\ea72";
+ }
+ .bx-color-fill:before {
+ content: "\ea73";
+ }
+ .bx-columns:before {
+ content: "\ea74";
+ }
+ .bx-command:before {
+ content: "\ea75";
+ }
+ .bx-comment:before {
+ content: "\ea76";
+ }
+ .bx-comment-add:before {
+ content: "\ea77";
+ }
+ .bx-comment-check:before {
+ content: "\ea78";
+ }
+ .bx-comment-detail:before {
+ content: "\ea79";
+ }
+ .bx-comment-dots:before {
+ content: "\ea7a";
+ }
+ .bx-comment-edit:before {
+ content: "\ea7b";
+ }
+ .bx-comment-error:before {
+ content: "\ea7c";
+ }
+ .bx-comment-minus:before {
+ content: "\ea7d";
+ }
+ .bx-comment-x:before {
+ content: "\ea7e";
+ }
+ .bx-compass:before {
+ content: "\ea7f";
+ }
+ .bx-confused:before {
+ content: "\ea80";
+ }
+ .bx-conversation:before {
+ content: "\ea81";
+ }
+ .bx-cookie:before {
+ content: "\ea82";
+ }
+ .bx-cool:before {
+ content: "\ea83";
+ }
+ .bx-copy:before {
+ content: "\ea84";
+ }
+ .bx-copy-alt:before {
+ content: "\ea85";
+ }
+ .bx-copyright:before {
+ content: "\ea86";
+ }
+ .bx-credit-card:before {
+ content: "\ea87";
+ }
+ .bx-credit-card-alt:before {
+ content: "\ea88";
+ }
+ .bx-credit-card-front:before {
+ content: "\ea89";
+ }
+ .bx-crop:before {
+ content: "\ea8a";
+ }
+ .bx-crosshair:before {
+ content: "\ea8b";
+ }
+ .bx-crown:before {
+ content: "\ea8c";
+ }
+ .bx-cube:before {
+ content: "\ea8d";
+ }
+ .bx-cube-alt:before {
+ content: "\ea8e";
+ }
+ .bx-cuboid:before {
+ content: "\ea8f";
+ }
+ .bx-current-location:before {
+ content: "\ea90";
+ }
+ .bx-customize:before {
+ content: "\ea91";
+ }
+ .bx-cut:before {
+ content: "\ea92";
+ }
+ .bx-cycling:before {
+ content: "\ea93";
+ }
+ .bx-cylinder:before {
+ content: "\ea94";
+ }
+ .bx-data:before {
+ content: "\ea95";
+ }
+ .bx-desktop:before {
+ content: "\ea96";
+ }
+ .bx-detail:before {
+ content: "\ea97";
+ }
+ .bx-devices:before {
+ content: "\ea98";
+ }
+ .bx-dialpad:before {
+ content: "\ea99";
+ }
+ .bx-dialpad-alt:before {
+ content: "\ea9a";
+ }
+ .bx-diamond:before {
+ content: "\ea9b";
+ }
+ .bx-dice-1:before {
+ content: "\ea9c";
+ }
+ .bx-dice-2:before {
+ content: "\ea9d";
+ }
+ .bx-dice-3:before {
+ content: "\ea9e";
+ }
+ .bx-dice-4:before {
+ content: "\ea9f";
+ }
+ .bx-dice-5:before {
+ content: "\eaa0";
+ }
+ .bx-dice-6:before {
+ content: "\eaa1";
+ }
+ .bx-directions:before {
+ content: "\eaa2";
+ }
+ .bx-disc:before {
+ content: "\eaa3";
+ }
+ .bx-dish:before {
+ content: "\eaa4";
+ }
+ .bx-dislike:before {
+ content: "\eaa5";
+ }
+ .bx-dizzy:before {
+ content: "\eaa6";
+ }
+ .bx-dna:before {
+ content: "\eaa7";
+ }
+ .bx-dock-bottom:before {
+ content: "\eaa8";
+ }
+ .bx-dock-left:before {
+ content: "\eaa9";
+ }
+ .bx-dock-right:before {
+ content: "\eaaa";
+ }
+ .bx-dock-top:before {
+ content: "\eaab";
+ }
+ .bx-dollar:before {
+ content: "\eaac";
+ }
+ .bx-dollar-circle:before {
+ content: "\eaad";
+ }
+ .bx-donate-blood:before {
+ content: "\eaae";
+ }
+ .bx-donate-heart:before {
+ content: "\eaaf";
+ }
+ .bx-door-open:before {
+ content: "\eab0";
+ }
+ .bx-dots-horizontal:before {
+ content: "\eab1";
+ }
+ .bx-dots-horizontal-rounded:before {
+ content: "\eab2";
+ }
+ .bx-dots-vertical:before {
+ content: "\eab3";
+ }
+ .bx-dots-vertical-rounded:before {
+ content: "\eab4";
+ }
+ .bx-doughnut-chart:before {
+ content: "\eab5";
+ }
+ .bx-down-arrow:before {
+ content: "\eab6";
+ }
+ .bx-down-arrow-alt:before {
+ content: "\eab7";
+ }
+ .bx-down-arrow-circle:before {
+ content: "\eab8";
+ }
+ .bx-download:before {
+ content: "\eab9";
+ }
+ .bx-downvote:before {
+ content: "\eaba";
+ }
+ .bx-drink:before {
+ content: "\eabb";
+ }
+ .bx-droplet:before {
+ content: "\eabc";
+ }
+ .bx-dumbbell:before {
+ content: "\eabd";
+ }
+ .bx-duplicate:before {
+ content: "\eabe";
+ }
+ .bx-edit:before {
+ content: "\eabf";
+ }
+ .bx-edit-alt:before {
+ content: "\eac0";
+ }
+ .bx-envelope:before {
+ content: "\eac1";
+ }
+ .bx-envelope-open:before {
+ content: "\eac2";
+ }
+ .bx-equalizer:before {
+ content: "\eac3";
+ }
+ .bx-eraser:before {
+ content: "\eac4";
+ }
+ .bx-error:before {
+ content: "\eac5";
+ }
+ .bx-error-alt:before {
+ content: "\eac6";
+ }
+ .bx-error-circle:before {
+ content: "\eac7";
+ }
+ .bx-euro:before {
+ content: "\eac8";
+ }
+ .bx-exclude:before {
+ content: "\eac9";
+ }
+ .bx-exit:before {
+ content: "\eaca";
+ }
+ .bx-exit-fullscreen:before {
+ content: "\eacb";
+ }
+ .bx-expand:before {
+ content: "\eacc";
+ }
+ .bx-expand-alt:before {
+ content: "\eacd";
+ }
+ .bx-export:before {
+ content: "\eace";
+ }
+ .bx-extension:before {
+ content: "\eacf";
+ }
+ .bx-face:before {
+ content: "\ead0";
+ }
+ .bx-fast-forward:before {
+ content: "\ead1";
+ }
+ .bx-fast-forward-circle:before {
+ content: "\ead2";
+ }
+ .bx-female:before {
+ content: "\ead3";
+ }
+ .bx-female-sign:before {
+ content: "\ead4";
+ }
+ .bx-file:before {
+ content: "\ead5";
+ }
+ .bx-file-blank:before {
+ content: "\ead6";
+ }
+ .bx-file-find:before {
+ content: "\ead7";
+ }
+ .bx-film:before {
+ content: "\ead8";
+ }
+ .bx-filter:before {
+ content: "\ead9";
+ }
+ .bx-filter-alt:before {
+ content: "\eada";
+ }
+ .bx-fingerprint:before {
+ content: "\eadb";
+ }
+ .bx-first-aid:before {
+ content: "\eadc";
+ }
+ .bx-first-page:before {
+ content: "\eadd";
+ }
+ .bx-flag:before {
+ content: "\eade";
+ }
+ .bx-folder:before {
+ content: "\eadf";
+ }
+ .bx-folder-minus:before {
+ content: "\eae0";
+ }
+ .bx-folder-open:before {
+ content: "\eae1";
+ }
+ .bx-folder-plus:before {
+ content: "\eae2";
+ }
+ .bx-font:before {
+ content: "\eae3";
+ }
+ .bx-font-color:before {
+ content: "\eae4";
+ }
+ .bx-font-family:before {
+ content: "\eae5";
+ }
+ .bx-font-size:before {
+ content: "\eae6";
+ }
+ .bx-food-menu:before {
+ content: "\eae7";
+ }
+ .bx-food-tag:before {
+ content: "\eae8";
+ }
+ .bx-football:before {
+ content: "\eae9";
+ }
+ .bx-fridge:before {
+ content: "\eaea";
+ }
+ .bx-fullscreen:before {
+ content: "\eaeb";
+ }
+ .bx-game:before {
+ content: "\eaec";
+ }
+ .bx-gas-pump:before {
+ content: "\eaed";
+ }
+ .bx-ghost:before {
+ content: "\eaee";
+ }
+ .bx-gift:before {
+ content: "\eaef";
+ }
+ .bx-git-branch:before {
+ content: "\eaf0";
+ }
+ .bx-git-commit:before {
+ content: "\eaf1";
+ }
+ .bx-git-compare:before {
+ content: "\eaf2";
+ }
+ .bx-git-merge:before {
+ content: "\eaf3";
+ }
+ .bx-git-pull-request:before {
+ content: "\eaf4";
+ }
+ .bx-git-repo-forked:before {
+ content: "\eaf5";
+ }
+ .bx-glasses:before {
+ content: "\eaf6";
+ }
+ .bx-glasses-alt:before {
+ content: "\eaf7";
+ }
+ .bx-globe:before {
+ content: "\eaf8";
+ }
+ .bx-globe-alt:before {
+ content: "\eaf9";
+ }
+ .bx-grid:before {
+ content: "\eafa";
+ }
+ .bx-grid-alt:before {
+ content: "\eafb";
+ }
+ .bx-grid-horizontal:before {
+ content: "\eafc";
+ }
+ .bx-grid-small:before {
+ content: "\eafd";
+ }
+ .bx-grid-vertical:before {
+ content: "\eafe";
+ }
+ .bx-group:before {
+ content: "\eaff";
+ }
+ .bx-handicap:before {
+ content: "\eb00";
+ }
+ .bx-happy:before {
+ content: "\eb01";
+ }
+ .bx-happy-alt:before {
+ content: "\eb02";
+ }
+ .bx-happy-beaming:before {
+ content: "\eb03";
+ }
+ .bx-happy-heart-eyes:before {
+ content: "\eb04";
+ }
+ .bx-hash:before {
+ content: "\eb05";
+ }
+ .bx-hdd:before {
+ content: "\eb06";
+ }
+ .bx-heading:before {
+ content: "\eb07";
+ }
+ .bx-headphone:before {
+ content: "\eb08";
+ }
+ .bx-health:before {
+ content: "\eb09";
+ }
+ .bx-heart:before {
+ content: "\eb0a";
+ }
+ .bx-heart-circle:before {
+ content: "\eb0b";
+ }
+ .bx-heart-square:before {
+ content: "\eb0c";
+ }
+ .bx-help-circle:before {
+ content: "\eb0d";
+ }
+ .bx-hide:before {
+ content: "\eb0e";
+ }
+ .bx-highlight:before {
+ content: "\eb0f";
+ }
+ .bx-history:before {
+ content: "\eb10";
+ }
+ .bx-hive:before {
+ content: "\eb11";
+ }
+ .bx-home:before {
+ content: "\eb12";
+ }
+ .bx-home-alt:before {
+ content: "\eb13";
+ }
+ .bx-home-circle:before {
+ content: "\eb14";
+ }
+ .bx-home-heart:before {
+ content: "\eb15";
+ }
+ .bx-home-smile:before {
+ content: "\eb16";
+ }
+ .bx-horizontal-center:before {
+ content: "\eb17";
+ }
+ .bx-hotel:before {
+ content: "\eb18";
+ }
+ .bx-hourglass:before {
+ content: "\eb19";
+ }
+ .bx-id-card:before {
+ content: "\eb1a";
+ }
+ .bx-image:before {
+ content: "\eb1b";
+ }
+ .bx-image-add:before {
+ content: "\eb1c";
+ }
+ .bx-image-alt:before {
+ content: "\eb1d";
+ }
+ .bx-images:before {
+ content: "\eb1e";
+ }
+ .bx-import:before {
+ content: "\eb1f";
+ }
+ .bx-infinite:before {
+ content: "\eb20";
+ }
+ .bx-info-circle:before {
+ content: "\eb21";
+ }
+ .bx-info-square:before {
+ content: "\eb22";
+ }
+ .bx-intersect:before {
+ content: "\eb23";
+ }
+ .bx-italic:before {
+ content: "\eb24";
+ }
+ .bx-joystick:before {
+ content: "\eb25";
+ }
+ .bx-joystick-alt:before {
+ content: "\eb26";
+ }
+ .bx-joystick-button:before {
+ content: "\eb27";
+ }
+ .bx-key:before {
+ content: "\eb28";
+ }
+ .bx-label:before {
+ content: "\eb29";
+ }
+ .bx-landscape:before {
+ content: "\eb2a";
+ }
+ .bx-laptop:before {
+ content: "\eb2b";
+ }
+ .bx-last-page:before {
+ content: "\eb2c";
+ }
+ .bx-laugh:before {
+ content: "\eb2d";
+ }
+ .bx-layer:before {
+ content: "\eb2e";
+ }
+ .bx-layer-minus:before {
+ content: "\eb2f";
+ }
+ .bx-layer-plus:before {
+ content: "\eb30";
+ }
+ .bx-layout:before {
+ content: "\eb31";
+ }
+ .bx-left-arrow:before {
+ content: "\eb32";
+ }
+ .bx-left-arrow-alt:before {
+ content: "\eb33";
+ }
+ .bx-left-arrow-circle:before {
+ content: "\eb34";
+ }
+ .bx-left-down-arrow-circle:before {
+ content: "\eb35";
+ }
+ .bx-left-indent:before {
+ content: "\eb36";
+ }
+ .bx-left-top-arrow-circle:before {
+ content: "\eb37";
+ }
+ .bx-library:before {
+ content: "\eb38";
+ }
+ .bx-like:before {
+ content: "\eb39";
+ }
+ .bx-line-chart:before {
+ content: "\eb3a";
+ }
+ .bx-line-chart-down:before {
+ content: "\eb3b";
+ }
+ .bx-link:before {
+ content: "\eb3c";
+ }
+ .bx-link-alt:before {
+ content: "\eb3d";
+ }
+ .bx-link-external:before {
+ content: "\eb3e";
+ }
+ .bx-lira:before {
+ content: "\eb3f";
+ }
+ .bx-list-check:before {
+ content: "\eb40";
+ }
+ .bx-list-minus:before {
+ content: "\eb41";
+ }
+ .bx-list-ol:before {
+ content: "\eb42";
+ }
+ .bx-list-plus:before {
+ content: "\eb43";
+ }
+ .bx-list-ul:before {
+ content: "\eb44";
+ }
+ .bx-loader:before {
+ content: "\eb45";
+ }
+ .bx-loader-alt:before {
+ content: "\eb46";
+ }
+ .bx-loader-circle:before {
+ content: "\eb47";
+ }
+ .bx-location-plus:before {
+ content: "\eb48";
+ }
+ .bx-lock:before {
+ content: "\eb49";
+ }
+ .bx-lock-alt:before {
+ content: "\eb4a";
+ }
+ .bx-lock-open:before {
+ content: "\eb4b";
+ }
+ .bx-lock-open-alt:before {
+ content: "\eb4c";
+ }
+ .bx-log-in:before {
+ content: "\eb4d";
+ }
+ .bx-log-in-circle:before {
+ content: "\eb4e";
+ }
+ .bx-log-out:before {
+ content: "\eb4f";
+ }
+ .bx-log-out-circle:before {
+ content: "\eb50";
+ }
+ .bx-low-vision:before {
+ content: "\eb51";
+ }
+ .bx-magnet:before {
+ content: "\eb52";
+ }
+ .bx-mail-send:before {
+ content: "\eb53";
+ }
+ .bx-male:before {
+ content: "\eb54";
+ }
+ .bx-male-sign:before {
+ content: "\eb55";
+ }
+ .bx-map:before {
+ content: "\eb56";
+ }
+ .bx-map-alt:before {
+ content: "\eb57";
+ }
+ .bx-map-pin:before {
+ content: "\eb58";
+ }
+ .bx-mask:before {
+ content: "\eb59";
+ }
+ .bx-medal:before {
+ content: "\eb5a";
+ }
+ .bx-meh:before {
+ content: "\eb5b";
+ }
+ .bx-meh-alt:before {
+ content: "\eb5c";
+ }
+ .bx-meh-blank:before {
+ content: "\eb5d";
+ }
+ .bx-memory-card:before {
+ content: "\eb5e";
+ }
+ .bx-menu:before {
+ content: "\eb5f";
+ }
+ .bx-menu-alt-left:before {
+ content: "\ef5b";
+ }
+ .bx-menu-alt-right:before {
+ content: "\eb61";
+ }
+ .bx-merge:before {
+ content: "\eb62";
+ }
+ .bx-message:before {
+ content: "\eb63";
+ }
+ .bx-message-add:before {
+ content: "\eb64";
+ }
+ .bx-message-alt:before {
+ content: "\eb65";
+ }
+ .bx-message-alt-add:before {
+ content: "\eb66";
+ }
+ .bx-message-alt-check:before {
+ content: "\eb67";
+ }
+ .bx-message-alt-detail:before {
+ content: "\eb68";
+ }
+ .bx-message-alt-dots:before {
+ content: "\eb69";
+ }
+ .bx-message-alt-edit:before {
+ content: "\eb6a";
+ }
+ .bx-message-alt-error:before {
+ content: "\eb6b";
+ }
+ .bx-message-alt-minus:before {
+ content: "\eb6c";
+ }
+ .bx-message-alt-x:before {
+ content: "\eb6d";
+ }
+ .bx-message-check:before {
+ content: "\eb6e";
+ }
+ .bx-message-detail:before {
+ content: "\eb6f";
+ }
+ .bx-message-dots:before {
+ content: "\eb70";
+ }
+ .bx-message-edit:before {
+ content: "\eb71";
+ }
+ .bx-message-error:before {
+ content: "\eb72";
+ }
+ .bx-message-minus:before {
+ content: "\eb73";
+ }
+ .bx-message-rounded:before {
+ content: "\eb74";
+ }
+ .bx-message-rounded-add:before {
+ content: "\eb75";
+ }
+ .bx-message-rounded-check:before {
+ content: "\eb76";
+ }
+ .bx-message-rounded-detail:before {
+ content: "\eb77";
+ }
+ .bx-message-rounded-dots:before {
+ content: "\eb78";
+ }
+ .bx-message-rounded-edit:before {
+ content: "\ef5c";
+ }
+ .bx-message-rounded-error:before {
+ content: "\eb7a";
+ }
+ .bx-message-rounded-minus:before {
+ content: "\eb7b";
+ }
+ .bx-message-rounded-x:before {
+ content: "\eb7c";
+ }
+ .bx-message-square:before {
+ content: "\eb7d";
+ }
+ .bx-message-square-add:before {
+ content: "\eb7e";
+ }
+ .bx-message-square-check:before {
+ content: "\eb7f";
+ }
+ .bx-message-square-detail:before {
+ content: "\eb80";
+ }
+ .bx-message-square-dots:before {
+ content: "\eb81";
+ }
+ .bx-message-square-edit:before {
+ content: "\eb82";
+ }
+ .bx-message-square-error:before {
+ content: "\eb83";
+ }
+ .bx-message-square-minus:before {
+ content: "\eb84";
+ }
+ .bx-message-square-x:before {
+ content: "\eb85";
+ }
+ .bx-message-x:before {
+ content: "\eb86";
+ }
+ .bx-meteor:before {
+ content: "\eb87";
+ }
+ .bx-microchip:before {
+ content: "\eb88";
+ }
+ .bx-microphone:before {
+ content: "\eb89";
+ }
+ .bx-microphone-off:before {
+ content: "\eb8a";
+ }
+ .bx-minus:before {
+ content: "\eb8b";
+ }
+ .bx-minus-back:before {
+ content: "\eb8c";
+ }
+ .bx-minus-circle:before {
+ content: "\eb8d";
+ }
+ .bx-minus-front:before {
+ content: "\eb8e";
+ }
+ .bx-mobile:before {
+ content: "\eb8f";
+ }
+ .bx-mobile-alt:before {
+ content: "\eb90";
+ }
+ .bx-mobile-landscape:before {
+ content: "\eb91";
+ }
+ .bx-mobile-vibration:before {
+ content: "\ef5d";
+ }
+ .bx-money:before {
+ content: "\eb93";
+ }
+ .bx-moon:before {
+ content: "\eb94";
+ }
+ .bx-mouse:before {
+ content: "\eb95";
+ }
+ .bx-mouse-alt:before {
+ content: "\eb96";
+ }
+ .bx-move:before {
+ content: "\eb97";
+ }
+ .bx-move-horizontal:before {
+ content: "\eb98";
+ }
+ .bx-move-vertical:before {
+ content: "\eb99";
+ }
+ .bx-movie:before {
+ content: "\eb9a";
+ }
+ .bx-movie-play:before {
+ content: "\eb9b";
+ }
+ .bx-music:before {
+ content: "\eb9c";
+ }
+ .bx-navigation:before {
+ content: "\eb9d";
+ }
+ .bx-network-chart:before {
+ content: "\eb9e";
+ }
+ .bx-news:before {
+ content: "\eb9f";
+ }
+ .bx-no-entry:before {
+ content: "\eba0";
+ }
+ .bx-note:before {
+ content: "\eba1";
+ }
+ .bx-notepad:before {
+ content: "\eba2";
+ }
+ .bx-notification:before {
+ content: "\eba3";
+ }
+ .bx-notification-off:before {
+ content: "\eba4";
+ }
+ .bx-outline:before {
+ content: "\eba5";
+ }
+ .bx-package:before {
+ content: "\eba6";
+ }
+ .bx-paint:before {
+ content: "\eba7";
+ }
+ .bx-paint-roll:before {
+ content: "\eba8";
+ }
+ .bx-palette:before {
+ content: "\eba9";
+ }
+ .bx-paperclip:before {
+ content: "\ebaa";
+ }
+ .bx-paper-plane:before {
+ content: "\ef61";
+ }
+ .bx-paragraph:before {
+ content: "\ebac";
+ }
+ .bx-paste:before {
+ content: "\ebad";
+ }
+ .bx-pause:before {
+ content: "\ebae";
+ }
+ .bx-pause-circle:before {
+ content: "\ebaf";
+ }
+ .bx-pen:before {
+ content: "\ebb0";
+ }
+ .bx-pencil:before {
+ content: "\ebb1";
+ }
+ .bx-phone:before {
+ content: "\ebb2";
+ }
+ .bx-phone-call:before {
+ content: "\ebb3";
+ }
+ .bx-phone-incoming:before {
+ content: "\ebb4";
+ }
+ .bx-phone-off:before {
+ content: "\ebb5";
+ }
+ .bx-phone-outgoing:before {
+ content: "\ebb6";
+ }
+ .bx-photo-album:before {
+ content: "\ebb7";
+ }
+ .bx-pie-chart:before {
+ content: "\ebb8";
+ }
+ .bx-pie-chart-alt:before {
+ content: "\ebb9";
+ }
+ .bx-pie-chart-alt-2:before {
+ content: "\ebba";
+ }
+ .bx-pin:before {
+ content: "\ebbb";
+ }
+ .bx-planet:before {
+ content: "\ebbc";
+ }
+ .bx-play:before {
+ content: "\ebbd";
+ }
+ .bx-play-circle:before {
+ content: "\ebbe";
+ }
+ .bx-plug:before {
+ content: "\ebbf";
+ }
+ .bx-plus:before {
+ content: "\ebc0";
+ }
+ .bx-plus-circle:before {
+ content: "\ebc1";
+ }
+ .bx-plus-medical:before {
+ content: "\ebc2";
+ }
+ .bx-podcast:before {
+ content: "\ebc3";
+ }
+ .bx-pointer:before {
+ content: "\ef5e";
+ }
+ .bx-poll:before {
+ content: "\ebc5";
+ }
+ .bx-polygon:before {
+ content: "\ebc6";
+ }
+ .bx-pound:before {
+ content: "\ebc7";
+ }
+ .bx-power-off:before {
+ content: "\ebc8";
+ }
+ .bx-printer:before {
+ content: "\ebc9";
+ }
+ .bx-pulse:before {
+ content: "\ebca";
+ }
+ .bx-purchase-tag:before {
+ content: "\ebcb";
+ }
+ .bx-purchase-tag-alt:before {
+ content: "\ebcc";
+ }
+ .bx-pyramid:before {
+ content: "\ebcd";
+ }
+ .bx-qr:before {
+ content: "\ebce";
+ }
+ .bx-qr-scan:before {
+ content: "\ebcf";
+ }
+ .bx-question-mark:before {
+ content: "\ebd0";
+ }
+ .bx-radar:before {
+ content: "\ebd1";
+ }
+ .bx-radio:before {
+ content: "\ebd2";
+ }
+ .bx-radio-circle:before {
+ content: "\ebd3";
+ }
+ .bx-radio-circle-marked:before {
+ content: "\ebd4";
+ }
+ .bx-receipt:before {
+ content: "\ebd5";
+ }
+ .bx-rectangle:before {
+ content: "\ebd6";
+ }
+ .bx-recycle:before {
+ content: "\ebd7";
+ }
+ .bx-redo:before {
+ content: "\ebd8";
+ }
+ .bx-refresh:before {
+ content: "\ebd9";
+ }
+ .bx-registered:before {
+ content: "\ebda";
+ }
+ .bx-rename:before {
+ content: "\ebdb";
+ }
+ .bx-repeat:before {
+ content: "\ebdc";
+ }
+ .bx-reply:before {
+ content: "\ef5f";
+ }
+ .bx-reply-all:before {
+ content: "\ebde";
+ }
+ .bx-repost:before {
+ content: "\ebdf";
+ }
+ .bx-reset:before {
+ content: "\ebe0";
+ }
+ .bx-restaurant:before {
+ content: "\ebe1";
+ }
+ .bx-revision:before {
+ content: "\ebe2";
+ }
+ .bx-rewind:before {
+ content: "\ebe3";
+ }
+ .bx-rewind-circle:before {
+ content: "\ebe4";
+ }
+ .bx-right-arrow:before {
+ content: "\ebe5";
+ }
+ .bx-right-arrow-alt:before {
+ content: "\ebe6";
+ }
+ .bx-right-arrow-circle:before {
+ content: "\ebe7";
+ }
+ .bx-right-down-arrow-circle:before {
+ content: "\ebe8";
+ }
+ .bx-right-indent:before {
+ content: "\ebe9";
+ }
+ .bx-right-top-arrow-circle:before {
+ content: "\ebea";
+ }
+ .bx-rocket:before {
+ content: "\ebeb";
+ }
+ .bx-rotate-left:before {
+ content: "\ebec";
+ }
+ .bx-rotate-right:before {
+ content: "\ebed";
+ }
+ .bx-rss:before {
+ content: "\ebee";
+ }
+ .bx-ruble:before {
+ content: "\ebef";
+ }
+ .bx-ruler:before {
+ content: "\ebf0";
+ }
+ .bx-run:before {
+ content: "\ebf1";
+ }
+ .bx-rupee:before {
+ content: "\ebf2";
+ }
+ .bx-sad:before {
+ content: "\ebf3";
+ }
+ .bx-save:before {
+ content: "\ebf4";
+ }
+ .bx-scan:before {
+ content: "\ebf5";
+ }
+ .bx-screenshot:before {
+ content: "\ef60";
+ }
+ .bx-search:before {
+ content: "\ebf7";
+ }
+ .bx-search-alt:before {
+ content: "\ebf8";
+ }
+ .bx-search-alt-2:before {
+ content: "\ebf9";
+ }
+ .bx-selection:before {
+ content: "\ebfa";
+ }
+ .bx-select-multiple:before {
+ content: "\ebfb";
+ }
+ .bx-send:before {
+ content: "\ebfc";
+ }
+ .bx-server:before {
+ content: "\ebfd";
+ }
+ .bx-shape-circle:before {
+ content: "\ebfe";
+ }
+ .bx-shape-polygon:before {
+ content: "\ebff";
+ }
+ .bx-shape-square:before {
+ content: "\ec00";
+ }
+ .bx-shape-triangle:before {
+ content: "\ec01";
+ }
+ .bx-share:before {
+ content: "\ec02";
+ }
+ .bx-share-alt:before {
+ content: "\ec03";
+ }
+ .bx-shekel:before {
+ content: "\ec04";
+ }
+ .bx-shield:before {
+ content: "\ec05";
+ }
+ .bx-shield-alt:before {
+ content: "\ec06";
+ }
+ .bx-shield-alt-2:before {
+ content: "\ec07";
+ }
+ .bx-shield-quarter:before {
+ content: "\ec08";
+ }
+ .bx-shield-x:before {
+ content: "\ec09";
+ }
+ .bx-shocked:before {
+ content: "\ec0a";
+ }
+ .bx-shopping-bag:before {
+ content: "\ec0b";
+ }
+ .bx-show:before {
+ content: "\ec0c";
+ }
+ .bx-show-alt:before {
+ content: "\ec0d";
+ }
+ .bx-shuffle:before {
+ content: "\ec0e";
+ }
+ .bx-sidebar:before {
+ content: "\ec0f";
+ }
+ .bx-sitemap:before {
+ content: "\ec10";
+ }
+ .bx-skip-next:before {
+ content: "\ec11";
+ }
+ .bx-skip-next-circle:before {
+ content: "\ec12";
+ }
+ .bx-skip-previous:before {
+ content: "\ec13";
+ }
+ .bx-skip-previous-circle:before {
+ content: "\ec14";
+ }
+ .bx-sleepy:before {
+ content: "\ec15";
+ }
+ .bx-slider:before {
+ content: "\ec16";
+ }
+ .bx-slider-alt:before {
+ content: "\ec17";
+ }
+ .bx-slideshow:before {
+ content: "\ec18";
+ }
+ .bx-smile:before {
+ content: "\ec19";
+ }
+ .bx-sort:before {
+ content: "\ec1a";
+ }
+ .bx-sort-alt-2:before {
+ content: "\ec1b";
+ }
+ .bx-sort-a-z:before {
+ content: "\ec1c";
+ }
+ .bx-sort-down:before {
+ content: "\ec1d";
+ }
+ .bx-sort-up:before {
+ content: "\ec1e";
+ }
+ .bx-sort-z-a:before {
+ content: "\ec1f";
+ }
+ .bx-spa:before {
+ content: "\ec20";
+ }
+ .bx-space-bar:before {
+ content: "\ec21";
+ }
+ .bx-speaker:before {
+ content: "\ec22";
+ }
+ .bx-spray-can:before {
+ content: "\ec23";
+ }
+ .bx-spreadsheet:before {
+ content: "\ec24";
+ }
+ .bx-square:before {
+ content: "\ec25";
+ }
+ .bx-square-rounded:before {
+ content: "\ec26";
+ }
+ .bx-star:before {
+ content: "\ec27";
+ }
+ .bx-station:before {
+ content: "\ec28";
+ }
+ .bx-stats:before {
+ content: "\ec29";
+ }
+ .bx-sticker:before {
+ content: "\ec2a";
+ }
+ .bx-stop:before {
+ content: "\ec2b";
+ }
+ .bx-stop-circle:before {
+ content: "\ec2c";
+ }
+ .bx-stopwatch:before {
+ content: "\ec2d";
+ }
+ .bx-store:before {
+ content: "\ec2e";
+ }
+ .bx-store-alt:before {
+ content: "\ec2f";
+ }
+ .bx-street-view:before {
+ content: "\ec30";
+ }
+ .bx-strikethrough:before {
+ content: "\ec31";
+ }
+ .bx-subdirectory-left:before {
+ content: "\ec32";
+ }
+ .bx-subdirectory-right:before {
+ content: "\ec33";
+ }
+ .bx-sun:before {
+ content: "\ec34";
+ }
+ .bx-support:before {
+ content: "\ec35";
+ }
+ .bx-swim:before {
+ content: "\ec36";
+ }
+ .bx-sync:before {
+ content: "\ec37";
+ }
+ .bx-tab:before {
+ content: "\ec38";
+ }
+ .bx-table:before {
+ content: "\ec39";
+ }
+ .bx-tachometer:before {
+ content: "\ec3a";
+ }
+ .bx-tag:before {
+ content: "\ec3b";
+ }
+ .bx-tag-alt:before {
+ content: "\ec3c";
+ }
+ .bx-target-lock:before {
+ content: "\ec3d";
+ }
+ .bx-task:before {
+ content: "\ec3e";
+ }
+ .bx-task-x:before {
+ content: "\ec3f";
+ }
+ .bx-taxi:before {
+ content: "\ec40";
+ }
+ .bx-tennis-ball:before {
+ content: "\ec41";
+ }
+ .bx-terminal:before {
+ content: "\ec42";
+ }
+ .bx-test-tube:before {
+ content: "\ec43";
+ }
+ .bx-text:before {
+ content: "\ec44";
+ }
+ .bx-time:before {
+ content: "\ec45";
+ }
+ .bx-time-five:before {
+ content: "\ec46";
+ }
+ .bx-timer:before {
+ content: "\ec47";
+ }
+ .bx-tired:before {
+ content: "\ec48";
+ }
+ .bx-toggle-left:before {
+ content: "\ec49";
+ }
+ .bx-toggle-right:before {
+ content: "\ec4a";
+ }
+ .bx-tone:before {
+ content: "\ec4b";
+ }
+ .bx-traffic-cone:before {
+ content: "\ec4c";
+ }
+ .bx-train:before {
+ content: "\ec4d";
+ }
+ .bx-transfer:before {
+ content: "\ec4e";
+ }
+ .bx-transfer-alt:before {
+ content: "\ec4f";
+ }
+ .bx-trash:before {
+ content: "\ec50";
+ }
+ .bx-trash-alt:before {
+ content: "\ec51";
+ }
+ .bx-trending-down:before {
+ content: "\ec52";
+ }
+ .bx-trending-up:before {
+ content: "\ec53";
+ }
+ .bx-trim:before {
+ content: "\ec54";
+ }
+ .bx-trip:before {
+ content: "\ec55";
+ }
+ .bx-trophy:before {
+ content: "\ec56";
+ }
+ .bx-tv:before {
+ content: "\ec57";
+ }
+ .bx-underline:before {
+ content: "\ec58";
+ }
+ .bx-undo:before {
+ content: "\ec59";
+ }
+ .bx-unite:before {
+ content: "\ec5a";
+ }
+ .bx-unlink:before {
+ content: "\ec5b";
+ }
+ .bx-up-arrow:before {
+ content: "\ec5c";
+ }
+ .bx-up-arrow-alt:before {
+ content: "\ec5d";
+ }
+ .bx-up-arrow-circle:before {
+ content: "\ec5e";
+ }
+ .bx-upload:before {
+ content: "\ec5f";
+ }
+ .bx-upside-down:before {
+ content: "\ec60";
+ }
+ .bx-upvote:before {
+ content: "\ec61";
+ }
+ .bx-usb:before {
+ content: "\ec62";
+ }
+ .bx-user:before {
+ content: "\ec63";
+ }
+ .bx-user-check:before {
+ content: "\ec64";
+ }
+ .bx-user-circle:before {
+ content: "\ec65";
+ }
+ .bx-user-minus:before {
+ content: "\ec66";
+ }
+ .bx-user-pin:before {
+ content: "\ec67";
+ }
+ .bx-user-plus:before {
+ content: "\ec68";
+ }
+ .bx-user-voice:before {
+ content: "\ec69";
+ }
+ .bx-user-x:before {
+ content: "\ec6a";
+ }
+ .bx-vector:before {
+ content: "\ec6b";
+ }
+ .bx-vertical-center:before {
+ content: "\ec6c";
+ }
+ .bx-vial:before {
+ content: "\ec6d";
+ }
+ .bx-video:before {
+ content: "\ec6e";
+ }
+ .bx-video-off:before {
+ content: "\ec6f";
+ }
+ .bx-video-plus:before {
+ content: "\ec70";
+ }
+ .bx-video-recording:before {
+ content: "\ec71";
+ }
+ .bx-voicemail:before {
+ content: "\ec72";
+ }
+ .bx-volume:before {
+ content: "\ec73";
+ }
+ .bx-volume-full:before {
+ content: "\ec74";
+ }
+ .bx-volume-low:before {
+ content: "\ec75";
+ }
+ .bx-volume-mute:before {
+ content: "\ec76";
+ }
+ .bx-walk:before {
+ content: "\ec77";
+ }
+ .bx-wallet:before {
+ content: "\ec78";
+ }
+ .bx-wallet-alt:before {
+ content: "\ec79";
+ }
+ .bx-water:before {
+ content: "\ec7a";
+ }
+ .bx-webcam:before {
+ content: "\ec7b";
+ }
+ .bx-wifi:before {
+ content: "\ec7c";
+ }
+ .bx-wifi-0:before {
+ content: "\ec7d";
+ }
+ .bx-wifi-1:before {
+ content: "\ec7e";
+ }
+ .bx-wifi-2:before {
+ content: "\ec7f";
+ }
+ .bx-wifi-off:before {
+ content: "\ec80";
+ }
+ .bx-wind:before {
+ content: "\ec81";
+ }
+ .bx-window:before {
+ content: "\ec82";
+ }
+ .bx-window-alt:before {
+ content: "\ec83";
+ }
+ .bx-window-close:before {
+ content: "\ec84";
+ }
+ .bx-window-open:before {
+ content: "\ec85";
+ }
+ .bx-windows:before {
+ content: "\ec86";
+ }
+ .bx-wine:before {
+ content: "\ec87";
+ }
+ .bx-wink-smile:before {
+ content: "\ec88";
+ }
+ .bx-wink-tongue:before {
+ content: "\ec89";
+ }
+ .bx-won:before {
+ content: "\ec8a";
+ }
+ .bx-world:before {
+ content: "\ec8b";
+ }
+ .bx-wrench:before {
+ content: "\ec8c";
+ }
+ .bx-x:before {
+ content: "\ec8d";
+ }
+ .bx-x-circle:before {
+ content: "\ec8e";
+ }
+ .bx-yen:before {
+ content: "\ec8f";
+ }
+ .bx-zoom-in:before {
+ content: "\ec90";
+ }
+ .bx-zoom-out:before {
+ content: "\ec91";
+ }
+ .bxs-party:before {
+ content: "\ec92";
+ }
+ .bxs-hot:before {
+ content: "\ec93";
+ }
+ .bxs-droplet:before {
+ content: "\ec94";
+ }
+ .bxs-cat:before {
+ content: "\ec95";
+ }
+ .bxs-dog:before {
+ content: "\ec96";
+ }
+ .bxs-injection:before {
+ content: "\ec97";
+ }
+ .bxs-leaf:before {
+ content: "\ec98";
+ }
+ .bxs-add-to-queue:before {
+ content: "\ec99";
+ }
+ .bxs-adjust:before {
+ content: "\ec9a";
+ }
+ .bxs-adjust-alt:before {
+ content: "\ec9b";
+ }
+ .bxs-alarm:before {
+ content: "\ec9c";
+ }
+ .bxs-alarm-add:before {
+ content: "\ec9d";
+ }
+ .bxs-alarm-exclamation:before {
+ content: "\ec9e";
+ }
+ .bxs-alarm-off:before {
+ content: "\ec9f";
+ }
+ .bxs-alarm-snooze:before {
+ content: "\eca0";
+ }
+ .bxs-album:before {
+ content: "\eca1";
+ }
+ .bxs-ambulance:before {
+ content: "\eca2";
+ }
+ .bxs-analyse:before {
+ content: "\eca3";
+ }
+ .bxs-angry:before {
+ content: "\eca4";
+ }
+ .bxs-arch:before {
+ content: "\eca5";
+ }
+ .bxs-archive:before {
+ content: "\eca6";
+ }
+ .bxs-archive-in:before {
+ content: "\eca7";
+ }
+ .bxs-archive-out:before {
+ content: "\eca8";
+ }
+ .bxs-area:before {
+ content: "\eca9";
+ }
+ .bxs-arrow-from-bottom:before {
+ content: "\ecaa";
+ }
+ .bxs-arrow-from-left:before {
+ content: "\ecab";
+ }
+ .bxs-arrow-from-right:before {
+ content: "\ecac";
+ }
+ .bxs-arrow-from-top:before {
+ content: "\ecad";
+ }
+ .bxs-arrow-to-bottom:before {
+ content: "\ecae";
+ }
+ .bxs-arrow-to-left:before {
+ content: "\ecaf";
+ }
+ .bxs-arrow-to-right:before {
+ content: "\ecb0";
+ }
+ .bxs-arrow-to-top:before {
+ content: "\ecb1";
+ }
+ .bxs-award:before {
+ content: "\ecb2";
+ }
+ .bxs-baby-carriage:before {
+ content: "\ecb3";
+ }
+ .bxs-backpack:before {
+ content: "\ecb4";
+ }
+ .bxs-badge:before {
+ content: "\ecb5";
+ }
+ .bxs-badge-check:before {
+ content: "\ecb6";
+ }
+ .bxs-badge-dollar:before {
+ content: "\ecb7";
+ }
+ .bxs-ball:before {
+ content: "\ecb8";
+ }
+ .bxs-band-aid:before {
+ content: "\ecb9";
+ }
+ .bxs-bank:before {
+ content: "\ecba";
+ }
+ .bxs-bar-chart-alt-2:before {
+ content: "\ecbb";
+ }
+ .bxs-bar-chart-square:before {
+ content: "\ecbc";
+ }
+ .bxs-barcode:before {
+ content: "\ecbd";
+ }
+ .bxs-baseball:before {
+ content: "\ecbe";
+ }
+ .bxs-basket:before {
+ content: "\ecbf";
+ }
+ .bxs-basketball:before {
+ content: "\ecc0";
+ }
+ .bxs-bath:before {
+ content: "\ecc1";
+ }
+ .bxs-battery:before {
+ content: "\ecc2";
+ }
+ .bxs-battery-charging:before {
+ content: "\ecc3";
+ }
+ .bxs-battery-full:before {
+ content: "\ecc4";
+ }
+ .bxs-battery-low:before {
+ content: "\ecc5";
+ }
+ .bxs-bed:before {
+ content: "\ecc6";
+ }
+ .bxs-been-here:before {
+ content: "\ecc7";
+ }
+ .bxs-beer:before {
+ content: "\ecc8";
+ }
+ .bxs-bell:before {
+ content: "\ecc9";
+ }
+ .bxs-bell-minus:before {
+ content: "\ecca";
+ }
+ .bxs-bell-off:before {
+ content: "\eccb";
+ }
+ .bxs-bell-plus:before {
+ content: "\eccc";
+ }
+ .bxs-bell-ring:before {
+ content: "\eccd";
+ }
+ .bxs-bible:before {
+ content: "\ecce";
+ }
+ .bxs-binoculars:before {
+ content: "\eccf";
+ }
+ .bxs-blanket:before {
+ content: "\ecd0";
+ }
+ .bxs-bolt:before {
+ content: "\ecd1";
+ }
+ .bxs-bolt-circle:before {
+ content: "\ecd2";
+ }
+ .bxs-bomb:before {
+ content: "\ecd3";
+ }
+ .bxs-bone:before {
+ content: "\ecd4";
+ }
+ .bxs-bong:before {
+ content: "\ecd5";
+ }
+ .bxs-book:before {
+ content: "\ecd6";
+ }
+ .bxs-book-add:before {
+ content: "\ecd7";
+ }
+ .bxs-book-alt:before {
+ content: "\ecd8";
+ }
+ .bxs-book-bookmark:before {
+ content: "\ecd9";
+ }
+ .bxs-book-content:before {
+ content: "\ecda";
+ }
+ .bxs-book-heart:before {
+ content: "\ecdb";
+ }
+ .bxs-bookmark:before {
+ content: "\ecdc";
+ }
+ .bxs-bookmark-alt:before {
+ content: "\ecdd";
+ }
+ .bxs-bookmark-alt-minus:before {
+ content: "\ecde";
+ }
+ .bxs-bookmark-alt-plus:before {
+ content: "\ecdf";
+ }
+ .bxs-bookmark-heart:before {
+ content: "\ece0";
+ }
+ .bxs-bookmark-minus:before {
+ content: "\ece1";
+ }
+ .bxs-bookmark-plus:before {
+ content: "\ece2";
+ }
+ .bxs-bookmarks:before {
+ content: "\ece3";
+ }
+ .bxs-bookmark-star:before {
+ content: "\ece4";
+ }
+ .bxs-book-open:before {
+ content: "\ece5";
+ }
+ .bxs-book-reader:before {
+ content: "\ece6";
+ }
+ .bxs-bot:before {
+ content: "\ece7";
+ }
+ .bxs-bowling-ball:before {
+ content: "\ece8";
+ }
+ .bxs-box:before {
+ content: "\ece9";
+ }
+ .bxs-brain:before {
+ content: "\ecea";
+ }
+ .bxs-briefcase:before {
+ content: "\eceb";
+ }
+ .bxs-briefcase-alt:before {
+ content: "\ecec";
+ }
+ .bxs-briefcase-alt-2:before {
+ content: "\eced";
+ }
+ .bxs-brightness:before {
+ content: "\ecee";
+ }
+ .bxs-brightness-half:before {
+ content: "\ecef";
+ }
+ .bxs-brush:before {
+ content: "\ecf0";
+ }
+ .bxs-brush-alt:before {
+ content: "\ecf1";
+ }
+ .bxs-bug:before {
+ content: "\ecf2";
+ }
+ .bxs-bug-alt:before {
+ content: "\ecf3";
+ }
+ .bxs-building:before {
+ content: "\ecf4";
+ }
+ .bxs-building-house:before {
+ content: "\ecf5";
+ }
+ .bxs-buildings:before {
+ content: "\ecf6";
+ }
+ .bxs-bulb:before {
+ content: "\ecf7";
+ }
+ .bxs-bullseye:before {
+ content: "\ecf8";
+ }
+ .bxs-buoy:before {
+ content: "\ecf9";
+ }
+ .bxs-bus:before {
+ content: "\ecfa";
+ }
+ .bxs-business:before {
+ content: "\ecfb";
+ }
+ .bxs-bus-school:before {
+ content: "\ecfc";
+ }
+ .bxs-cabinet:before {
+ content: "\ecfd";
+ }
+ .bxs-cake:before {
+ content: "\ecfe";
+ }
+ .bxs-calculator:before {
+ content: "\ecff";
+ }
+ .bxs-calendar:before {
+ content: "\ed00";
+ }
+ .bxs-calendar-alt:before {
+ content: "\ed01";
+ }
+ .bxs-calendar-check:before {
+ content: "\ed02";
+ }
+ .bxs-calendar-edit:before {
+ content: "\ed03";
+ }
+ .bxs-calendar-event:before {
+ content: "\ed04";
+ }
+ .bxs-calendar-exclamation:before {
+ content: "\ed05";
+ }
+ .bxs-calendar-heart:before {
+ content: "\ed06";
+ }
+ .bxs-calendar-minus:before {
+ content: "\ed07";
+ }
+ .bxs-calendar-plus:before {
+ content: "\ed08";
+ }
+ .bxs-calendar-star:before {
+ content: "\ed09";
+ }
+ .bxs-calendar-week:before {
+ content: "\ed0a";
+ }
+ .bxs-calendar-x:before {
+ content: "\ed0b";
+ }
+ .bxs-camera:before {
+ content: "\ed0c";
+ }
+ .bxs-camera-home:before {
+ content: "\ed0d";
+ }
+ .bxs-camera-movie:before {
+ content: "\ed0e";
+ }
+ .bxs-camera-off:before {
+ content: "\ed0f";
+ }
+ .bxs-camera-plus:before {
+ content: "\ed10";
+ }
+ .bxs-capsule:before {
+ content: "\ed11";
+ }
+ .bxs-captions:before {
+ content: "\ed12";
+ }
+ .bxs-car:before {
+ content: "\ed13";
+ }
+ .bxs-car-battery:before {
+ content: "\ed14";
+ }
+ .bxs-car-crash:before {
+ content: "\ed15";
+ }
+ .bxs-card:before {
+ content: "\ed16";
+ }
+ .bxs-caret-down-circle:before {
+ content: "\ed17";
+ }
+ .bxs-caret-down-square:before {
+ content: "\ed18";
+ }
+ .bxs-caret-left-circle:before {
+ content: "\ed19";
+ }
+ .bxs-caret-left-square:before {
+ content: "\ed1a";
+ }
+ .bxs-caret-right-circle:before {
+ content: "\ed1b";
+ }
+ .bxs-caret-right-square:before {
+ content: "\ed1c";
+ }
+ .bxs-caret-up-circle:before {
+ content: "\ed1d";
+ }
+ .bxs-caret-up-square:before {
+ content: "\ed1e";
+ }
+ .bxs-car-garage:before {
+ content: "\ed1f";
+ }
+ .bxs-car-mechanic:before {
+ content: "\ed20";
+ }
+ .bxs-carousel:before {
+ content: "\ed21";
+ }
+ .bxs-cart:before {
+ content: "\ed22";
+ }
+ .bxs-cart-add:before {
+ content: "\ed23";
+ }
+ .bxs-cart-alt:before {
+ content: "\ed24";
+ }
+ .bxs-cart-download:before {
+ content: "\ed25";
+ }
+ .bxs-car-wash:before {
+ content: "\ed26";
+ }
+ .bxs-category:before {
+ content: "\ed27";
+ }
+ .bxs-category-alt:before {
+ content: "\ed28";
+ }
+ .bxs-cctv:before {
+ content: "\ed29";
+ }
+ .bxs-certification:before {
+ content: "\ed2a";
+ }
+ .bxs-chalkboard:before {
+ content: "\ed2b";
+ }
+ .bxs-chart:before {
+ content: "\ed2c";
+ }
+ .bxs-chat:before {
+ content: "\ed2d";
+ }
+ .bxs-checkbox:before {
+ content: "\ed2e";
+ }
+ .bxs-checkbox-checked:before {
+ content: "\ed2f";
+ }
+ .bxs-checkbox-minus:before {
+ content: "\ed30";
+ }
+ .bxs-check-circle:before {
+ content: "\ed31";
+ }
+ .bxs-check-shield:before {
+ content: "\ed32";
+ }
+ .bxs-check-square:before {
+ content: "\ed33";
+ }
+ .bxs-chess:before {
+ content: "\ed34";
+ }
+ .bxs-chevron-down:before {
+ content: "\ed35";
+ }
+ .bxs-chevron-down-circle:before {
+ content: "\ed36";
+ }
+ .bxs-chevron-down-square:before {
+ content: "\ed37";
+ }
+ .bxs-chevron-left:before {
+ content: "\ed38";
+ }
+ .bxs-chevron-left-circle:before {
+ content: "\ed39";
+ }
+ .bxs-chevron-left-square:before {
+ content: "\ed3a";
+ }
+ .bxs-chevron-right:before {
+ content: "\ed3b";
+ }
+ .bxs-chevron-right-circle:before {
+ content: "\ed3c";
+ }
+ .bxs-chevron-right-square:before {
+ content: "\ed3d";
+ }
+ .bxs-chevrons-down:before {
+ content: "\ed3e";
+ }
+ .bxs-chevrons-left:before {
+ content: "\ed3f";
+ }
+ .bxs-chevrons-right:before {
+ content: "\ed40";
+ }
+ .bxs-chevrons-up:before {
+ content: "\ed41";
+ }
+ .bxs-chevron-up:before {
+ content: "\ed42";
+ }
+ .bxs-chevron-up-circle:before {
+ content: "\ed43";
+ }
+ .bxs-chevron-up-square:before {
+ content: "\ed44";
+ }
+ .bxs-chip:before {
+ content: "\ed45";
+ }
+ .bxs-church:before {
+ content: "\ed46";
+ }
+ .bxs-circle:before {
+ content: "\ed47";
+ }
+ .bxs-city:before {
+ content: "\ed48";
+ }
+ .bxs-clinic:before {
+ content: "\ed49";
+ }
+ .bxs-cloud:before {
+ content: "\ed4a";
+ }
+ .bxs-cloud-download:before {
+ content: "\ed4b";
+ }
+ .bxs-cloud-lightning:before {
+ content: "\ed4c";
+ }
+ .bxs-cloud-rain:before {
+ content: "\ed4d";
+ }
+ .bxs-cloud-upload:before {
+ content: "\ed4e";
+ }
+ .bxs-coffee:before {
+ content: "\ed4f";
+ }
+ .bxs-coffee-alt:before {
+ content: "\ed50";
+ }
+ .bxs-coffee-togo:before {
+ content: "\ed51";
+ }
+ .bxs-cog:before {
+ content: "\ed52";
+ }
+ .bxs-coin:before {
+ content: "\ed53";
+ }
+ .bxs-coin-stack:before {
+ content: "\ed54";
+ }
+ .bxs-collection:before {
+ content: "\ed55";
+ }
+ .bxs-color-fill:before {
+ content: "\ed56";
+ }
+ .bxs-comment:before {
+ content: "\ed57";
+ }
+ .bxs-comment-add:before {
+ content: "\ed58";
+ }
+ .bxs-comment-check:before {
+ content: "\ed59";
+ }
+ .bxs-comment-detail:before {
+ content: "\ed5a";
+ }
+ .bxs-comment-dots:before {
+ content: "\ed5b";
+ }
+ .bxs-comment-edit:before {
+ content: "\ed5c";
+ }
+ .bxs-comment-error:before {
+ content: "\ed5d";
+ }
+ .bxs-comment-minus:before {
+ content: "\ed5e";
+ }
+ .bxs-comment-x:before {
+ content: "\ed5f";
+ }
+ .bxs-compass:before {
+ content: "\ed60";
+ }
+ .bxs-component:before {
+ content: "\ed61";
+ }
+ .bxs-confused:before {
+ content: "\ed62";
+ }
+ .bxs-contact:before {
+ content: "\ed63";
+ }
+ .bxs-conversation:before {
+ content: "\ed64";
+ }
+ .bxs-cookie:before {
+ content: "\ed65";
+ }
+ .bxs-cool:before {
+ content: "\ed66";
+ }
+ .bxs-copy:before {
+ content: "\ed67";
+ }
+ .bxs-copy-alt:before {
+ content: "\ed68";
+ }
+ .bxs-copyright:before {
+ content: "\ed69";
+ }
+ .bxs-coupon:before {
+ content: "\ed6a";
+ }
+ .bxs-credit-card:before {
+ content: "\ed6b";
+ }
+ .bxs-credit-card-alt:before {
+ content: "\ed6c";
+ }
+ .bxs-credit-card-front:before {
+ content: "\ed6d";
+ }
+ .bxs-crop:before {
+ content: "\ed6e";
+ }
+ .bxs-crown:before {
+ content: "\ed6f";
+ }
+ .bxs-cube:before {
+ content: "\ed70";
+ }
+ .bxs-cube-alt:before {
+ content: "\ed71";
+ }
+ .bxs-cuboid:before {
+ content: "\ed72";
+ }
+ .bxs-customize:before {
+ content: "\ed73";
+ }
+ .bxs-cylinder:before {
+ content: "\ed74";
+ }
+ .bxs-dashboard:before {
+ content: "\ed75";
+ }
+ .bxs-data:before {
+ content: "\ed76";
+ }
+ .bxs-detail:before {
+ content: "\ed77";
+ }
+ .bxs-devices:before {
+ content: "\ed78";
+ }
+ .bxs-diamond:before {
+ content: "\ed79";
+ }
+ .bxs-dice-1:before {
+ content: "\ed7a";
+ }
+ .bxs-dice-2:before {
+ content: "\ed7b";
+ }
+ .bxs-dice-3:before {
+ content: "\ed7c";
+ }
+ .bxs-dice-4:before {
+ content: "\ed7d";
+ }
+ .bxs-dice-5:before {
+ content: "\ed7e";
+ }
+ .bxs-dice-6:before {
+ content: "\ed7f";
+ }
+ .bxs-direction-left:before {
+ content: "\ed80";
+ }
+ .bxs-direction-right:before {
+ content: "\ed81";
+ }
+ .bxs-directions:before {
+ content: "\ed82";
+ }
+ .bxs-disc:before {
+ content: "\ed83";
+ }
+ .bxs-discount:before {
+ content: "\ed84";
+ }
+ .bxs-dish:before {
+ content: "\ed85";
+ }
+ .bxs-dislike:before {
+ content: "\ed86";
+ }
+ .bxs-dizzy:before {
+ content: "\ed87";
+ }
+ .bxs-dock-bottom:before {
+ content: "\ed88";
+ }
+ .bxs-dock-left:before {
+ content: "\ed89";
+ }
+ .bxs-dock-right:before {
+ content: "\ed8a";
+ }
+ .bxs-dock-top:before {
+ content: "\ed8b";
+ }
+ .bxs-dollar-circle:before {
+ content: "\ed8c";
+ }
+ .bxs-donate-blood:before {
+ content: "\ed8d";
+ }
+ .bxs-donate-heart:before {
+ content: "\ed8e";
+ }
+ .bxs-door-open:before {
+ content: "\ed8f";
+ }
+ .bxs-doughnut-chart:before {
+ content: "\ed90";
+ }
+ .bxs-down-arrow:before {
+ content: "\ed91";
+ }
+ .bxs-down-arrow-alt:before {
+ content: "\ed92";
+ }
+ .bxs-down-arrow-circle:before {
+ content: "\ed93";
+ }
+ .bxs-down-arrow-square:before {
+ content: "\ed94";
+ }
+ .bxs-download:before {
+ content: "\ed95";
+ }
+ .bxs-downvote:before {
+ content: "\ed96";
+ }
+ .bxs-drink:before {
+ content: "\ed97";
+ }
+ .bxs-droplet-half:before {
+ content: "\ed98";
+ }
+ .bxs-dryer:before {
+ content: "\ed99";
+ }
+ .bxs-duplicate:before {
+ content: "\ed9a";
+ }
+ .bxs-edit:before {
+ content: "\ed9b";
+ }
+ .bxs-edit-alt:before {
+ content: "\ed9c";
+ }
+ .bxs-edit-location:before {
+ content: "\ed9d";
+ }
+ .bxs-eject:before {
+ content: "\ed9e";
+ }
+ .bxs-envelope:before {
+ content: "\ed9f";
+ }
+ .bxs-envelope-open:before {
+ content: "\eda0";
+ }
+ .bxs-eraser:before {
+ content: "\eda1";
+ }
+ .bxs-error:before {
+ content: "\eda2";
+ }
+ .bxs-error-alt:before {
+ content: "\eda3";
+ }
+ .bxs-error-circle:before {
+ content: "\eda4";
+ }
+ .bxs-ev-station:before {
+ content: "\eda5";
+ }
+ .bxs-exit:before {
+ content: "\eda6";
+ }
+ .bxs-extension:before {
+ content: "\eda7";
+ }
+ .bxs-eyedropper:before {
+ content: "\eda8";
+ }
+ .bxs-face:before {
+ content: "\eda9";
+ }
+ .bxs-face-mask:before {
+ content: "\edaa";
+ }
+ .bxs-factory:before {
+ content: "\edab";
+ }
+ .bxs-fast-forward-circle:before {
+ content: "\edac";
+ }
+ .bxs-file:before {
+ content: "\edad";
+ }
+ .bxs-file-archive:before {
+ content: "\edae";
+ }
+ .bxs-file-blank:before {
+ content: "\edaf";
+ }
+ .bxs-file-css:before {
+ content: "\edb0";
+ }
+ .bxs-file-doc:before {
+ content: "\edb1";
+ }
+ .bxs-file-export:before {
+ content: "\edb2";
+ }
+ .bxs-file-find:before {
+ content: "\edb3";
+ }
+ .bxs-file-gif:before {
+ content: "\edb4";
+ }
+ .bxs-file-html:before {
+ content: "\edb5";
+ }
+ .bxs-file-image:before {
+ content: "\edb6";
+ }
+ .bxs-file-import:before {
+ content: "\edb7";
+ }
+ .bxs-file-jpg:before {
+ content: "\edb8";
+ }
+ .bxs-file-js:before {
+ content: "\edb9";
+ }
+ .bxs-file-json:before {
+ content: "\edba";
+ }
+ .bxs-file-md:before {
+ content: "\edbb";
+ }
+ .bxs-file-pdf:before {
+ content: "\edbc";
+ }
+ .bxs-file-plus:before {
+ content: "\edbd";
+ }
+ .bxs-file-png:before {
+ content: "\edbe";
+ }
+ .bxs-file-txt:before {
+ content: "\edbf";
+ }
+ .bxs-film:before {
+ content: "\edc0";
+ }
+ .bxs-filter-alt:before {
+ content: "\edc1";
+ }
+ .bxs-first-aid:before {
+ content: "\edc2";
+ }
+ .bxs-flag:before {
+ content: "\edc3";
+ }
+ .bxs-flag-alt:before {
+ content: "\edc4";
+ }
+ .bxs-flag-checkered:before {
+ content: "\edc5";
+ }
+ .bxs-flame:before {
+ content: "\edc6";
+ }
+ .bxs-flask:before {
+ content: "\edc7";
+ }
+ .bxs-florist:before {
+ content: "\edc8";
+ }
+ .bxs-folder:before {
+ content: "\edc9";
+ }
+ .bxs-folder-minus:before {
+ content: "\edca";
+ }
+ .bxs-folder-open:before {
+ content: "\edcb";
+ }
+ .bxs-folder-plus:before {
+ content: "\edcc";
+ }
+ .bxs-food-menu:before {
+ content: "\edcd";
+ }
+ .bxs-fridge:before {
+ content: "\edce";
+ }
+ .bxs-game:before {
+ content: "\edcf";
+ }
+ .bxs-gas-pump:before {
+ content: "\edd0";
+ }
+ .bxs-ghost:before {
+ content: "\edd1";
+ }
+ .bxs-gift:before {
+ content: "\edd2";
+ }
+ .bxs-graduation:before {
+ content: "\edd3";
+ }
+ .bxs-grid:before {
+ content: "\edd4";
+ }
+ .bxs-grid-alt:before {
+ content: "\edd5";
+ }
+ .bxs-group:before {
+ content: "\edd6";
+ }
+ .bxs-guitar-amp:before {
+ content: "\edd7";
+ }
+ .bxs-hand:before {
+ content: "\edd8";
+ }
+ .bxs-hand-down:before {
+ content: "\edd9";
+ }
+ .bxs-hand-left:before {
+ content: "\edda";
+ }
+ .bxs-hand-right:before {
+ content: "\eddb";
+ }
+ .bxs-hand-up:before {
+ content: "\eddc";
+ }
+ .bxs-happy:before {
+ content: "\eddd";
+ }
+ .bxs-happy-alt:before {
+ content: "\edde";
+ }
+ .bxs-happy-beaming:before {
+ content: "\eddf";
+ }
+ .bxs-happy-heart-eyes:before {
+ content: "\ede0";
+ }
+ .bxs-hdd:before {
+ content: "\ede1";
+ }
+ .bxs-heart:before {
+ content: "\ede2";
+ }
+ .bxs-heart-circle:before {
+ content: "\ede3";
+ }
+ .bxs-heart-square:before {
+ content: "\ede4";
+ }
+ .bxs-help-circle:before {
+ content: "\ede5";
+ }
+ .bxs-hide:before {
+ content: "\ede6";
+ }
+ .bxs-home:before {
+ content: "\ede7";
+ }
+ .bxs-home-circle:before {
+ content: "\ede8";
+ }
+ .bxs-home-heart:before {
+ content: "\ede9";
+ }
+ .bxs-home-smile:before {
+ content: "\edea";
+ }
+ .bxs-hotel:before {
+ content: "\edeb";
+ }
+ .bxs-hourglass:before {
+ content: "\edec";
+ }
+ .bxs-hourglass-bottom:before {
+ content: "\eded";
+ }
+ .bxs-hourglass-top:before {
+ content: "\edee";
+ }
+ .bxs-id-card:before {
+ content: "\edef";
+ }
+ .bxs-image:before {
+ content: "\edf0";
+ }
+ .bxs-image-add:before {
+ content: "\edf1";
+ }
+ .bxs-image-alt:before {
+ content: "\edf2";
+ }
+ .bxs-inbox:before {
+ content: "\edf3";
+ }
+ .bxs-info-circle:before {
+ content: "\edf4";
+ }
+ .bxs-info-square:before {
+ content: "\edf5";
+ }
+ .bxs-institution:before {
+ content: "\edf6";
+ }
+ .bxs-joystick:before {
+ content: "\edf7";
+ }
+ .bxs-joystick-alt:before {
+ content: "\edf8";
+ }
+ .bxs-joystick-button:before {
+ content: "\edf9";
+ }
+ .bxs-key:before {
+ content: "\edfa";
+ }
+ .bxs-keyboard:before {
+ content: "\edfb";
+ }
+ .bxs-label:before {
+ content: "\edfc";
+ }
+ .bxs-landmark:before {
+ content: "\edfd";
+ }
+ .bxs-landscape:before {
+ content: "\edfe";
+ }
+ .bxs-laugh:before {
+ content: "\edff";
+ }
+ .bxs-layer:before {
+ content: "\ee00";
+ }
+ .bxs-layer-minus:before {
+ content: "\ee01";
+ }
+ .bxs-layer-plus:before {
+ content: "\ee02";
+ }
+ .bxs-layout:before {
+ content: "\ee03";
+ }
+ .bxs-left-arrow:before {
+ content: "\ee04";
+ }
+ .bxs-left-arrow-alt:before {
+ content: "\ee05";
+ }
+ .bxs-left-arrow-circle:before {
+ content: "\ee06";
+ }
+ .bxs-left-arrow-square:before {
+ content: "\ee07";
+ }
+ .bxs-left-down-arrow-circle:before {
+ content: "\ee08";
+ }
+ .bxs-left-top-arrow-circle:before {
+ content: "\ee09";
+ }
+ .bxs-like:before {
+ content: "\ee0a";
+ }
+ .bxs-location-plus:before {
+ content: "\ee0b";
+ }
+ .bxs-lock:before {
+ content: "\ee0c";
+ }
+ .bxs-lock-alt:before {
+ content: "\ee0d";
+ }
+ .bxs-lock-open:before {
+ content: "\ee0e";
+ }
+ .bxs-lock-open-alt:before {
+ content: "\ee0f";
+ }
+ .bxs-log-in:before {
+ content: "\ee10";
+ }
+ .bxs-log-in-circle:before {
+ content: "\ee11";
+ }
+ .bxs-log-out:before {
+ content: "\ee12";
+ }
+ .bxs-log-out-circle:before {
+ content: "\ee13";
+ }
+ .bxs-low-vision:before {
+ content: "\ee14";
+ }
+ .bxs-magic-wand:before {
+ content: "\ee15";
+ }
+ .bxs-magnet:before {
+ content: "\ee16";
+ }
+ .bxs-map:before {
+ content: "\ee17";
+ }
+ .bxs-map-alt:before {
+ content: "\ee18";
+ }
+ .bxs-map-pin:before {
+ content: "\ee19";
+ }
+ .bxs-mask:before {
+ content: "\ee1a";
+ }
+ .bxs-medal:before {
+ content: "\ee1b";
+ }
+ .bxs-megaphone:before {
+ content: "\ee1c";
+ }
+ .bxs-meh:before {
+ content: "\ee1d";
+ }
+ .bxs-meh-alt:before {
+ content: "\ee1e";
+ }
+ .bxs-meh-blank:before {
+ content: "\ee1f";
+ }
+ .bxs-memory-card:before {
+ content: "\ee20";
+ }
+ .bxs-message:before {
+ content: "\ee21";
+ }
+ .bxs-message-add:before {
+ content: "\ee22";
+ }
+ .bxs-message-alt:before {
+ content: "\ee23";
+ }
+ .bxs-message-alt-add:before {
+ content: "\ee24";
+ }
+ .bxs-message-alt-check:before {
+ content: "\ee25";
+ }
+ .bxs-message-alt-detail:before {
+ content: "\ee26";
+ }
+ .bxs-message-alt-dots:before {
+ content: "\ee27";
+ }
+ .bxs-message-alt-edit:before {
+ content: "\ee28";
+ }
+ .bxs-message-alt-error:before {
+ content: "\ee29";
+ }
+ .bxs-message-alt-minus:before {
+ content: "\ee2a";
+ }
+ .bxs-message-alt-x:before {
+ content: "\ee2b";
+ }
+ .bxs-message-check:before {
+ content: "\ee2c";
+ }
+ .bxs-message-detail:before {
+ content: "\ee2d";
+ }
+ .bxs-message-dots:before {
+ content: "\ee2e";
+ }
+ .bxs-message-edit:before {
+ content: "\ee2f";
+ }
+ .bxs-message-error:before {
+ content: "\ee30";
+ }
+ .bxs-message-minus:before {
+ content: "\ee31";
+ }
+ .bxs-message-rounded:before {
+ content: "\ee32";
+ }
+ .bxs-message-rounded-add:before {
+ content: "\ee33";
+ }
+ .bxs-message-rounded-check:before {
+ content: "\ee34";
+ }
+ .bxs-message-rounded-detail:before {
+ content: "\ee35";
+ }
+ .bxs-message-rounded-dots:before {
+ content: "\ee36";
+ }
+ .bxs-message-rounded-edit:before {
+ content: "\ee37";
+ }
+ .bxs-message-rounded-error:before {
+ content: "\ee38";
+ }
+ .bxs-message-rounded-minus:before {
+ content: "\ee39";
+ }
+ .bxs-message-rounded-x:before {
+ content: "\ee3a";
+ }
+ .bxs-message-square:before {
+ content: "\ee3b";
+ }
+ .bxs-message-square-add:before {
+ content: "\ee3c";
+ }
+ .bxs-message-square-check:before {
+ content: "\ee3d";
+ }
+ .bxs-message-square-detail:before {
+ content: "\ee3e";
+ }
+ .bxs-message-square-dots:before {
+ content: "\ee3f";
+ }
+ .bxs-message-square-edit:before {
+ content: "\ee40";
+ }
+ .bxs-message-square-error:before {
+ content: "\ee41";
+ }
+ .bxs-message-square-minus:before {
+ content: "\ee42";
+ }
+ .bxs-message-square-x:before {
+ content: "\ee43";
+ }
+ .bxs-message-x:before {
+ content: "\ee44";
+ }
+ .bxs-meteor:before {
+ content: "\ee45";
+ }
+ .bxs-microchip:before {
+ content: "\ee46";
+ }
+ .bxs-microphone:before {
+ content: "\ee47";
+ }
+ .bxs-microphone-alt:before {
+ content: "\ee48";
+ }
+ .bxs-microphone-off:before {
+ content: "\ee49";
+ }
+ .bxs-minus-circle:before {
+ content: "\ee4a";
+ }
+ .bxs-minus-square:before {
+ content: "\ee4b";
+ }
+ .bxs-mobile:before {
+ content: "\ee4c";
+ }
+ .bxs-mobile-vibration:before {
+ content: "\ee4d";
+ }
+ .bxs-moon:before {
+ content: "\ee4e";
+ }
+ .bxs-mouse:before {
+ content: "\ee4f";
+ }
+ .bxs-mouse-alt:before {
+ content: "\ee50";
+ }
+ .bxs-movie:before {
+ content: "\ee51";
+ }
+ .bxs-movie-play:before {
+ content: "\ee52";
+ }
+ .bxs-music:before {
+ content: "\ee53";
+ }
+ .bxs-navigation:before {
+ content: "\ee54";
+ }
+ .bxs-network-chart:before {
+ content: "\ee55";
+ }
+ .bxs-news:before {
+ content: "\ee56";
+ }
+ .bxs-no-entry:before {
+ content: "\ee57";
+ }
+ .bxs-note:before {
+ content: "\ee58";
+ }
+ .bxs-notepad:before {
+ content: "\ee59";
+ }
+ .bxs-notification:before {
+ content: "\ee5a";
+ }
+ .bxs-notification-off:before {
+ content: "\ee5b";
+ }
+ .bxs-offer:before {
+ content: "\ee5c";
+ }
+ .bxs-package:before {
+ content: "\ee5d";
+ }
+ .bxs-paint:before {
+ content: "\ee5e";
+ }
+ .bxs-paint-roll:before {
+ content: "\ee5f";
+ }
+ .bxs-palette:before {
+ content: "\ee60";
+ }
+ .bxs-paper-plane:before {
+ content: "\ee61";
+ }
+ .bxs-parking:before {
+ content: "\ee62";
+ }
+ .bxs-paste:before {
+ content: "\ee63";
+ }
+ .bxs-pen:before {
+ content: "\ee64";
+ }
+ .bxs-pencil:before {
+ content: "\ee65";
+ }
+ .bxs-phone:before {
+ content: "\ee66";
+ }
+ .bxs-phone-call:before {
+ content: "\ee67";
+ }
+ .bxs-phone-incoming:before {
+ content: "\ee68";
+ }
+ .bxs-phone-off:before {
+ content: "\ee69";
+ }
+ .bxs-phone-outgoing:before {
+ content: "\ee6a";
+ }
+ .bxs-photo-album:before {
+ content: "\ee6b";
+ }
+ .bxs-piano:before {
+ content: "\ee6c";
+ }
+ .bxs-pie-chart:before {
+ content: "\ee6d";
+ }
+ .bxs-pie-chart-alt:before {
+ content: "\ee6e";
+ }
+ .bxs-pie-chart-alt-2:before {
+ content: "\ee6f";
+ }
+ .bxs-pin:before {
+ content: "\ee70";
+ }
+ .bxs-pizza:before {
+ content: "\ee71";
+ }
+ .bxs-plane:before {
+ content: "\ee72";
+ }
+ .bxs-plane-alt:before {
+ content: "\ee73";
+ }
+ .bxs-plane-land:before {
+ content: "\ee74";
+ }
+ .bxs-planet:before {
+ content: "\ee75";
+ }
+ .bxs-plane-take-off:before {
+ content: "\ee76";
+ }
+ .bxs-playlist:before {
+ content: "\ee77";
+ }
+ .bxs-plug:before {
+ content: "\ee78";
+ }
+ .bxs-plus-circle:before {
+ content: "\ee79";
+ }
+ .bxs-plus-square:before {
+ content: "\ee7a";
+ }
+ .bxs-pointer:before {
+ content: "\ee7b";
+ }
+ .bxs-polygon:before {
+ content: "\ee7c";
+ }
+ .bxs-printer:before {
+ content: "\ee7d";
+ }
+ .bxs-purchase-tag:before {
+ content: "\ee7e";
+ }
+ .bxs-purchase-tag-alt:before {
+ content: "\ee7f";
+ }
+ .bxs-pyramid:before {
+ content: "\ee80";
+ }
+ .bxs-quote-alt-left:before {
+ content: "\ee81";
+ }
+ .bxs-quote-alt-right:before {
+ content: "\ee82";
+ }
+ .bxs-quote-left:before {
+ content: "\ee83";
+ }
+ .bxs-quote-right:before {
+ content: "\ee84";
+ }
+ .bxs-quote-single-left:before {
+ content: "\ee85";
+ }
+ .bxs-quote-single-right:before {
+ content: "\ee86";
+ }
+ .bxs-radiation:before {
+ content: "\ee87";
+ }
+ .bxs-radio:before {
+ content: "\ee88";
+ }
+ .bxs-receipt:before {
+ content: "\ee89";
+ }
+ .bxs-rectangle:before {
+ content: "\ee8a";
+ }
+ .bxs-registered:before {
+ content: "\ee8b";
+ }
+ .bxs-rename:before {
+ content: "\ee8c";
+ }
+ .bxs-report:before {
+ content: "\ee8d";
+ }
+ .bxs-rewind-circle:before {
+ content: "\ee8e";
+ }
+ .bxs-right-arrow:before {
+ content: "\ee8f";
+ }
+ .bxs-right-arrow-alt:before {
+ content: "\ee90";
+ }
+ .bxs-right-arrow-circle:before {
+ content: "\ee91";
+ }
+ .bxs-right-arrow-square:before {
+ content: "\ee92";
+ }
+ .bxs-right-down-arrow-circle:before {
+ content: "\ee93";
+ }
+ .bxs-right-top-arrow-circle:before {
+ content: "\ee94";
+ }
+ .bxs-rocket:before {
+ content: "\ee95";
+ }
+ .bxs-ruler:before {
+ content: "\ee96";
+ }
+ .bxs-sad:before {
+ content: "\ee97";
+ }
+ .bxs-save:before {
+ content: "\ee98";
+ }
+ .bxs-school:before {
+ content: "\ee99";
+ }
+ .bxs-search:before {
+ content: "\ee9a";
+ }
+ .bxs-search-alt-2:before {
+ content: "\ee9b";
+ }
+ .bxs-select-multiple:before {
+ content: "\ee9c";
+ }
+ .bxs-send:before {
+ content: "\ee9d";
+ }
+ .bxs-server:before {
+ content: "\ee9e";
+ }
+ .bxs-shapes:before {
+ content: "\ee9f";
+ }
+ .bxs-share:before {
+ content: "\eea0";
+ }
+ .bxs-share-alt:before {
+ content: "\eea1";
+ }
+ .bxs-shield:before {
+ content: "\eea2";
+ }
+ .bxs-shield-alt-2:before {
+ content: "\eea3";
+ }
+ .bxs-shield-x:before {
+ content: "\eea4";
+ }
+ .bxs-ship:before {
+ content: "\eea5";
+ }
+ .bxs-shocked:before {
+ content: "\eea6";
+ }
+ .bxs-shopping-bag:before {
+ content: "\eea7";
+ }
+ .bxs-shopping-bag-alt:before {
+ content: "\eea8";
+ }
+ .bxs-shopping-bags:before {
+ content: "\eea9";
+ }
+ .bxs-show:before {
+ content: "\eeaa";
+ }
+ .bxs-skip-next-circle:before {
+ content: "\eeab";
+ }
+ .bxs-skip-previous-circle:before {
+ content: "\eeac";
+ }
+ .bxs-skull:before {
+ content: "\eead";
+ }
+ .bxs-sleepy:before {
+ content: "\eeae";
+ }
+ .bxs-slideshow:before {
+ content: "\eeaf";
+ }
+ .bxs-smile:before {
+ content: "\eeb0";
+ }
+ .bxs-sort-alt:before {
+ content: "\eeb1";
+ }
+ .bxs-spa:before {
+ content: "\eeb2";
+ }
+ .bxs-speaker:before {
+ content: "\eeb3";
+ }
+ .bxs-spray-can:before {
+ content: "\eeb4";
+ }
+ .bxs-spreadsheet:before {
+ content: "\eeb5";
+ }
+ .bxs-square:before {
+ content: "\eeb6";
+ }
+ .bxs-square-rounded:before {
+ content: "\eeb7";
+ }
+ .bxs-star:before {
+ content: "\eeb8";
+ }
+ .bxs-star-half:before {
+ content: "\eeb9";
+ }
+ .bxs-sticker:before {
+ content: "\eeba";
+ }
+ .bxs-stopwatch:before {
+ content: "\eebb";
+ }
+ .bxs-store:before {
+ content: "\eebc";
+ }
+ .bxs-store-alt:before {
+ content: "\eebd";
+ }
+ .bxs-sun:before {
+ content: "\eebe";
+ }
+ .bxs-tachometer:before {
+ content: "\eebf";
+ }
+ .bxs-tag:before {
+ content: "\eec0";
+ }
+ .bxs-tag-alt:before {
+ content: "\eec1";
+ }
+ .bxs-tag-x:before {
+ content: "\eec2";
+ }
+ .bxs-taxi:before {
+ content: "\eec3";
+ }
+ .bxs-tennis-ball:before {
+ content: "\eec4";
+ }
+ .bxs-terminal:before {
+ content: "\eec5";
+ }
+ .bxs-thermometer:before {
+ content: "\eec6";
+ }
+ .bxs-time:before {
+ content: "\eec7";
+ }
+ .bxs-time-five:before {
+ content: "\eec8";
+ }
+ .bxs-timer:before {
+ content: "\eec9";
+ }
+ .bxs-tired:before {
+ content: "\eeca";
+ }
+ .bxs-toggle-left:before {
+ content: "\eecb";
+ }
+ .bxs-toggle-right:before {
+ content: "\eecc";
+ }
+ .bxs-tone:before {
+ content: "\eecd";
+ }
+ .bxs-torch:before {
+ content: "\eece";
+ }
+ .bxs-to-top:before {
+ content: "\eecf";
+ }
+ .bxs-traffic:before {
+ content: "\eed0";
+ }
+ .bxs-traffic-barrier:before {
+ content: "\eed1";
+ }
+ .bxs-traffic-cone:before {
+ content: "\eed2";
+ }
+ .bxs-train:before {
+ content: "\eed3";
+ }
+ .bxs-trash:before {
+ content: "\eed4";
+ }
+ .bxs-trash-alt:before {
+ content: "\eed5";
+ }
+ .bxs-tree:before {
+ content: "\eed6";
+ }
+ .bxs-trophy:before {
+ content: "\eed7";
+ }
+ .bxs-truck:before {
+ content: "\eed8";
+ }
+ .bxs-t-shirt:before {
+ content: "\eed9";
+ }
+ .bxs-tv:before {
+ content: "\eeda";
+ }
+ .bxs-up-arrow:before {
+ content: "\eedb";
+ }
+ .bxs-up-arrow-alt:before {
+ content: "\eedc";
+ }
+ .bxs-up-arrow-circle:before {
+ content: "\eedd";
+ }
+ .bxs-up-arrow-square:before {
+ content: "\eede";
+ }
+ .bxs-upside-down:before {
+ content: "\eedf";
+ }
+ .bxs-upvote:before {
+ content: "\eee0";
+ }
+ .bxs-user:before {
+ content: "\eee1";
+ }
+ .bxs-user-account:before {
+ content: "\eee2";
+ }
+ .bxs-user-badge:before {
+ content: "\eee3";
+ }
+ .bxs-user-check:before {
+ content: "\eee4";
+ }
+ .bxs-user-circle:before {
+ content: "\eee5";
+ }
+ .bxs-user-detail:before {
+ content: "\eee6";
+ }
+ .bxs-user-minus:before {
+ content: "\eee7";
+ }
+ .bxs-user-pin:before {
+ content: "\eee8";
+ }
+ .bxs-user-plus:before {
+ content: "\eee9";
+ }
+ .bxs-user-rectangle:before {
+ content: "\eeea";
+ }
+ .bxs-user-voice:before {
+ content: "\eeeb";
+ }
+ .bxs-user-x:before {
+ content: "\eeec";
+ }
+ .bxs-vector:before {
+ content: "\eeed";
+ }
+ .bxs-vial:before {
+ content: "\eeee";
+ }
+ .bxs-video:before {
+ content: "\eeef";
+ }
+ .bxs-video-off:before {
+ content: "\eef0";
+ }
+ .bxs-video-plus:before {
+ content: "\eef1";
+ }
+ .bxs-video-recording:before {
+ content: "\eef2";
+ }
+ .bxs-videos:before {
+ content: "\eef3";
+ }
+ .bxs-virus:before {
+ content: "\eef4";
+ }
+ .bxs-virus-block:before {
+ content: "\eef5";
+ }
+ .bxs-volume:before {
+ content: "\eef6";
+ }
+ .bxs-volume-full:before {
+ content: "\eef7";
+ }
+ .bxs-volume-low:before {
+ content: "\eef8";
+ }
+ .bxs-volume-mute:before {
+ content: "\eef9";
+ }
+ .bxs-wallet:before {
+ content: "\eefa";
+ }
+ .bxs-wallet-alt:before {
+ content: "\eefb";
+ }
+ .bxs-washer:before {
+ content: "\eefc";
+ }
+ .bxs-watch:before {
+ content: "\eefd";
+ }
+ .bxs-watch-alt:before {
+ content: "\eefe";
+ }
+ .bxs-webcam:before {
+ content: "\eeff";
+ }
+ .bxs-widget:before {
+ content: "\ef00";
+ }
+ .bxs-window-alt:before {
+ content: "\ef01";
+ }
+ .bxs-wine:before {
+ content: "\ef02";
+ }
+ .bxs-wink-smile:before {
+ content: "\ef03";
+ }
+ .bxs-wink-tongue:before {
+ content: "\ef04";
+ }
+ .bxs-wrench:before {
+ content: "\ef05";
+ }
+ .bxs-x-circle:before {
+ content: "\ef06";
+ }
+ .bxs-x-square:before {
+ content: "\ef07";
+ }
+ .bxs-yin-yang:before {
+ content: "\ef08";
+ }
+ .bxs-zap:before {
+ content: "\ef09";
+ }
+ .bxs-zoom-in:before {
+ content: "\ef0a";
+ }
+ .bxs-zoom-out:before {
+ content: "\ef0b";
+ }
+
\ No newline at end of file
diff --git a/js_css/boxicons.js b/js_css/boxicons.js
new file mode 100644
index 0000000..1fb49ba
--- /dev/null
+++ b/js_css/boxicons.js
@@ -0,0 +1,2 @@
+!function(t,e,n,r,o){if("customElements"in n)o();else{if(n.AWAITING_WEB_COMPONENTS_POLYFILL)return void n.AWAITING_WEB_COMPONENTS_POLYFILL.then(o);var a=n.AWAITING_WEB_COMPONENTS_POLYFILL=f();a.then(o);var i=n.WEB_COMPONENTS_POLYFILL||"//cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.0.2/webcomponents-bundle.js",s=n.ES6_CORE_POLYFILL||"//cdnjs.cloudflare.com/ajax/libs/core-js/2.5.3/core.min.js";"Promise"in n?c(i).then((function(){a.isDone=!0,a.exec()})):c(s).then((function(){c(i).then((function(){a.isDone=!0,a.exec()}))}))}function f(){var t=[];return t.isDone=!1,t.exec=function(){t.splice(0).forEach((function(t){t()}))},t.then=function(e){return t.isDone?e():t.push(e),t},t}function c(t){var e=f(),n=r.createElement("script");return n.type="text/javascript",n.readyState?n.onreadystatechange=function(){"loaded"!=n.readyState&&"complete"!=n.readyState||(n.onreadystatechange=null,e.isDone=!0,e.exec())}:n.onload=function(){e.isDone=!0,e.exec()},n.src=t,r.getElementsByTagName("head")[0].appendChild(n),n.then=e.then,n}}(0,0,window,document,(function(){var t,e;t=window,e=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=5)}([function(t,e){t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n,r=t[1]||"",o=t[3];if(!o)return r;if(e&&"function"==typeof btoa){var a=(n=o,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),i=o.sources.map((function(t){return"/*# sourceURL="+o.sourceRoot+t+" */"}));return[r].concat(i).concat([a]).join("\n")}return[r].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n})).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},o=0;o\n:host {\n display: inline-block;\n font-size: initial;\n box-sizing: border-box;\n width: 24px;\n height: 24px;\n}\n:host([size=xs]) {\n width: 0.8rem;\n height: 0.8rem;\n}\n:host([size=sm]) {\n width: 1.55rem;\n height: 1.55rem;\n}\n:host([size=md]) {\n width: 2.25rem;\n height: 2.25rem;\n}\n:host([size=lg]) {\n width: 3.0rem;\n height: 3.0rem;\n}\n\n:host([size]:not([size=""]):not([size=xs]):not([size=sm]):not([size=md]):not([size=lg])) {\n width: auto;\n height: auto;\n}\n:host([pull=left]) #icon {\n float: left;\n margin-right: .3em!important;\n}\n:host([pull=right]) #icon {\n float: right;\n margin-left: .3em!important;\n}\n:host([border=square]) #icon {\n padding: .25em;\n border: .07em solid rgba(0,0,0,.1);\n border-radius: .25em;\n}\n:host([border=circle]) #icon {\n padding: .25em;\n border: .07em solid rgba(0,0,0,.1);\n border-radius: 50%;\n}\n#icon,\nsvg {\n width: 100%;\n height: 100%;\n}\n#icon {\n box-sizing: border-box;\n} \n'+f.a+"\n"+l.a+'\n\n';var g=d(function(t){function e(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e);var t=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return t.$ui=t.attachShadow({mode:"open"}),t.$ui.appendChild(t.ownerDocument.importNode(y.content,!0)),h()&&p.ShadyCSS.styleElement(t),t._state={$iconHolder:t.$ui.getElementById("icon"),type:t.getAttribute("type")},t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,HTMLElement),u(e,null,[{key:"getIconSvg",value:function(t,e){var n=this.cdnUrl+"/regular/bx-"+t+".svg";return"solid"===e?n=this.cdnUrl+"/solid/bxs-"+t+".svg":"logo"===e&&(n=this.cdnUrl+"/logos/bxl-"+t+".svg"),n&&b[n]||(b[n]=new Promise((function(t,e){var r=new XMLHttpRequest;r.addEventListener("load",(function(){this.status<200||this.status>=300?e(new Error(this.status+" "+this.responseText)):t(this.responseText)})),r.onerror=e,r.onabort=e,r.open("GET",n),r.send()}))),b[n]}},{key:"define",value:function(t){t=t||this.tagName,h()&&p.ShadyCSS.prepareTemplate(y,t),customElements.define(t,this)}},{key:"cdnUrl",get:function(){return"//unpkg.com/boxicons@2.1.4/svg"}},{key:"tagName",get:function(){return"box-icon"}},{key:"observedAttributes",get:function(){return["type","name","color","size","rotate","flip","animation","border","pull"]}}]),u(e,[{key:"attributeChangedCallback",value:function(t,e,n){var r=this._state.$iconHolder;switch(t){case"type":!function(t,e,n){var r=t._state;r.$iconHolder.textContent="",r.type&&(r.type=null),r.type=!n||"solid"!==n&&"logo"!==n?"regular":n,void 0!==r.currentName&&t.constructor.getIconSvg(r.currentName,r.type).then((function(t){r.type===n&&(r.$iconHolder.innerHTML=t)})).catch((function(t){console.error("Failed to load icon: "+r.currentName+"\n"+t)}))}(this,0,n);break;case"name":!function(t,e,n){var r=t._state;r.currentName=n,r.$iconHolder.textContent="",n&&void 0!==r.type&&t.constructor.getIconSvg(n,r.type).then((function(t){r.currentName===n&&(r.$iconHolder.innerHTML=t)})).catch((function(t){console.error("Failed to load icon: "+n+"\n"+t)}))}(this,0,n);break;case"color":r.style.fill=n||"";break;case"size":!function(t,e,n){var r=t._state;r.size&&(r.$iconHolder.style.width=r.$iconHolder.style.height="",r.size=r.sizeType=null),n&&!/^(xs|sm|md|lg)$/.test(r.size)&&(r.size=n.trim(),r.$iconHolder.style.width=r.$iconHolder.style.height=r.size)}(this,0,n);break;case"rotate":e&&r.classList.remove("bx-rotate-"+e),n&&r.classList.add("bx-rotate-"+n);break;case"flip":e&&r.classList.remove("bx-flip-"+e),n&&r.classList.add("bx-flip-"+n);break;case"animation":e&&r.classList.remove("bx-"+e),n&&r.classList.add("bx-"+n)}}},{key:"connectedCallback",value:function(){h()&&p.ShadyCSS.styleElement(this)}}]),e}());e.default=g,g.define()}])},"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.BoxIconElement=e():t.BoxIconElement=e()}));
+//# sourceMappingURL=boxicons.js.map
\ No newline at end of file
diff --git a/js_css/fount/boxicons.eot b/js_css/fount/boxicons.eot
new file mode 100644
index 0000000..6e58e99
Binary files /dev/null and b/js_css/fount/boxicons.eot differ
diff --git a/js_css/fount/boxicons.svg b/js_css/fount/boxicons.svg
new file mode 100644
index 0000000..1ecfe44
--- /dev/null
+++ b/js_css/fount/boxicons.svg
@@ -0,0 +1,1660 @@
+
+
+
\ No newline at end of file
diff --git a/js_css/fount/boxicons.ttf b/js_css/fount/boxicons.ttf
new file mode 100644
index 0000000..89a5096
Binary files /dev/null and b/js_css/fount/boxicons.ttf differ
diff --git a/js_css/fount/boxicons.woff b/js_css/fount/boxicons.woff
new file mode 100644
index 0000000..841e1d4
Binary files /dev/null and b/js_css/fount/boxicons.woff differ
diff --git a/js_css/fount/boxicons.woff2 b/js_css/fount/boxicons.woff2
new file mode 100644
index 0000000..79c35e4
Binary files /dev/null and b/js_css/fount/boxicons.woff2 differ
diff --git a/js_css/fount/remixicon.ttf b/js_css/fount/remixicon.ttf
new file mode 100644
index 0000000..c461f40
Binary files /dev/null and b/js_css/fount/remixicon.ttf differ
diff --git a/js_css/naive.js b/js_css/naive.js
new file mode 100644
index 0000000..2b11eef
--- /dev/null
+++ b/js_css/naive.js
@@ -0,0 +1,104126 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
+ typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.naive = {}, global.Vue));
+})(this, (function (exports, vue) { 'use strict';
+
+ let onceCbs = [];
+ const paramsMap = new WeakMap();
+
+ function flushOnceCallbacks() {
+ onceCbs.forEach(cb => cb(...paramsMap.get(cb)));
+ onceCbs = [];
+ }
+
+ function beforeNextFrameOnce(cb) {
+ for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ params[_key - 1] = arguments[_key];
+ }
+
+ paramsMap.set(cb, params);
+ if (onceCbs.includes(cb)) return;
+ onceCbs.push(cb) === 1 && requestAnimationFrame(flushOnceCallbacks);
+ }
+
+ function getParentNode$1(node) {
+ // document type
+ if (node.nodeType === 9) {
+ return null;
+ }
+
+ return node.parentNode;
+ }
+
+ function getScrollParent$1(node) {
+ if (node === null) return null;
+ const parentNode = getParentNode$1(node);
+
+ if (parentNode === null) {
+ return null;
+ } // Document
+
+
+ if (parentNode.nodeType === 9) {
+ return document.documentElement;
+ } // Element
+
+
+ if (parentNode.nodeType === 1) {
+ // Firefox want us to check `-x` and `-y` variations as well
+ const {
+ overflow,
+ overflowX,
+ overflowY
+ } = getComputedStyle(parentNode);
+
+ if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
+ return parentNode;
+ }
+ }
+
+ return getScrollParent$1(parentNode);
+ }
+
+ function unwrapElement(target) {
+ if (typeof target === 'string') return document.querySelector(target);
+ if (typeof target === 'function') return target();
+ return target;
+ }
+
+ function happensIn(e, dataSetPropName) {
+ let {
+ target
+ } = e;
+
+ while (target) {
+ if (target.dataset) {
+ if (target.dataset[dataSetPropName] !== undefined) return true;
+ }
+
+ target = target.parentElement;
+ }
+
+ return false;
+ }
+
+ function getPreciseEventTarget(event) {
+ return event.composedPath()[0] || null;
+ }
+
+ function parseResponsiveProp(reponsiveProp) {
+ if (typeof reponsiveProp === "number") {
+ return {
+ '': reponsiveProp.toString()
+ };
+ }
+
+ const params = {};
+ reponsiveProp.split(/ +/).forEach(pairLiteral => {
+ if (pairLiteral === '') return;
+ const [prefix, value] = pairLiteral.split(':');
+
+ if (value === undefined) {
+ params[''] = prefix;
+ } else {
+ params[prefix] = value;
+ }
+ });
+ return params;
+ }
+
+ function parseResponsivePropValue(reponsiveProp, activeKeyOrSize) {
+ var _a;
+
+ if (reponsiveProp === undefined || reponsiveProp === null) return undefined;
+ const classObj = parseResponsiveProp(reponsiveProp);
+ if (activeKeyOrSize === undefined) return classObj[''];
+
+ if (typeof activeKeyOrSize === 'string') {
+ return (_a = classObj[activeKeyOrSize]) !== null && _a !== void 0 ? _a : classObj[''];
+ } else if (Array.isArray(activeKeyOrSize)) {
+ for (let i = activeKeyOrSize.length - 1; i >= 0; --i) {
+ const key = activeKeyOrSize[i];
+ if (key in classObj) return classObj[key];
+ }
+
+ return classObj[''];
+ } else {
+ // Here we suppose all the keys are number formatted
+ let activeValue = undefined;
+ let activeKey = -1;
+ Object.keys(classObj).forEach(key => {
+ const keyAsNum = Number(key);
+
+ if (!Number.isNaN(keyAsNum) && activeKeyOrSize >= keyAsNum && keyAsNum >= activeKey) {
+ activeKey = keyAsNum;
+ activeValue = classObj[key];
+ }
+ });
+ return activeValue;
+ }
+ }
+
+ function depx(value) {
+ if (typeof value === 'string') {
+ if (value.endsWith('px')) {
+ return Number(value.slice(0, value.length - 2));
+ }
+
+ return Number(value);
+ }
+
+ return value;
+ }
+
+ function pxfy(value) {
+ if (value === undefined || value === null) return undefined;
+ if (typeof value === 'number') return `${value}px`;
+ if (value.endsWith('px')) return value;
+ return `${value}px`;
+ }
+
+ function getMargin(value, position) {
+ const parts = value.trim().split(/\s+/g);
+ const margin = {
+ top: parts[0]
+ };
+
+ switch (parts.length) {
+ case 1:
+ margin.right = parts[0];
+ margin.bottom = parts[0];
+ margin.left = parts[0];
+ break;
+
+ case 2:
+ margin.right = parts[1];
+ margin.left = parts[1];
+ margin.bottom = parts[0];
+ break;
+
+ case 3:
+ margin.right = parts[1];
+ margin.bottom = parts[2];
+ margin.left = parts[1];
+ break;
+
+ case 4:
+ margin.right = parts[1];
+ margin.bottom = parts[2];
+ margin.left = parts[3];
+ break;
+
+ default:
+ throw new Error('[seemly/getMargin]:' + value + ' is not a valid value.');
+ }
+
+ if (position === undefined) return margin;
+ return margin[position];
+ }
+
+ function getGap(value, orient) {
+ const [rowGap, colGap] = value.split(' ');
+ if (!orient) return {
+ row: rowGap,
+ col: colGap || rowGap
+ };
+ return orient === 'row' ? rowGap : colGap;
+ }
+
+ var colors = {
+ black: '#000',
+ silver: '#C0C0C0',
+ gray: '#808080',
+ white: '#FFF',
+ maroon: '#800000',
+ red: '#F00',
+ purple: '#800080',
+ fuchsia: '#F0F',
+ green: '#008000',
+ lime: '#0F0',
+ olive: '#808000',
+ yellow: '#FF0',
+ navy: '#000080',
+ blue: '#00F',
+ teal: '#008080',
+ aqua: '#0FF',
+ transparent: '#0000'
+ };
+
+ // All the algorithms credit to https://stackoverflow.com/questions/36721830/convert-hsl-to-rgb-and-hex/54014428#54014428
+ // original author: Kamil Kiełczewski
+
+ /**
+ * @param h 360
+ * @param s 100
+ * @param l 100
+ * @returns [h, s, v] 360, 100, 100
+ */
+ function hsl2hsv(h, s, l) {
+ s /= 100;
+ l /= 100;
+ const v = s * Math.min(l, 1 - l) + l;
+ return [h, v ? (2 - 2 * l / v) * 100 : 0, v * 100];
+ }
+ /**
+ * @param h 360
+ * @param s 100
+ * @param v 100
+ * @returns [h, s, l] 360, 100, 100
+ */
+
+ function hsv2hsl(h, s, v) {
+ s /= 100;
+ v /= 100;
+ const l = v - v * s / 2;
+ const m = Math.min(l, 1 - l);
+ return [h, m ? (v - l) / m * 100 : 0, l * 100];
+ }
+ /**
+ * @param h 360
+ * @param s 100
+ * @param v 100
+ * @returns [r, g, b] 255, 255, 255
+ */
+
+ function hsv2rgb(h, s, v) {
+ s /= 100;
+ v /= 100;
+
+ let f = function (n) {
+ let k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 60) % 6;
+ return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);
+ };
+
+ return [f(5) * 255, f(3) * 255, f(1) * 255];
+ }
+ /**
+ * @param r 255
+ * @param g 255
+ * @param b 255
+ * @returns [360, 100, 100]
+ */
+
+ function rgb2hsv(r, g, b) {
+ r /= 255;
+ g /= 255;
+ b /= 255;
+ let v = Math.max(r, g, b),
+ c = v - Math.min(r, g, b);
+ let h = c && (v == r ? (g - b) / c : v == g ? 2 + (b - r) / c : 4 + (r - g) / c);
+ return [60 * (h < 0 ? h + 6 : h), v && c / v * 100, v * 100];
+ }
+ /**
+ * @param r 255
+ * @param g 255
+ * @param b 255
+ * @returns [360, 100, 100]
+ */
+
+ function rgb2hsl(r, g, b) {
+ r /= 255;
+ g /= 255;
+ b /= 255;
+ let v = Math.max(r, g, b),
+ c = v - Math.min(r, g, b),
+ f = 1 - Math.abs(v + v - c - 1);
+ let h = c && (v == r ? (g - b) / c : v == g ? 2 + (b - r) / c : 4 + (r - g) / c);
+ return [60 * (h < 0 ? h + 6 : h), f ? c / f * 100 : 0, (v + v - c) * 50];
+ }
+ /**
+ * @param h 360
+ * @param s 100
+ * @param l 100
+ * @returns [255, 255, 255]
+ */
+
+ function hsl2rgb(h, s, l) {
+ s /= 100;
+ l /= 100;
+ let a = s * Math.min(l, 1 - l);
+
+ let f = function (n) {
+ let k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 30) % 12;
+ return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
+ };
+
+ return [f(0) * 255, f(8) * 255, f(4) * 255];
+ }
+
+ const prefix$1 = '^\\s*';
+ const suffix = '\\s*$';
+ const percent = '\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))%\\s*'; // 4 offset
+
+ const float = '\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))\\s*'; // 4 offset
+
+ const hex = '([0-9A-Fa-f])';
+ const dhex = '([0-9A-Fa-f]{2})';
+ const hslRegex = new RegExp(`${prefix$1}hsl\\s*\\(${float},${percent},${percent}\\)${suffix}`);
+ const hsvRegex = new RegExp(`${prefix$1}hsv\\s*\\(${float},${percent},${percent}\\)${suffix}`);
+ const hslaRegex = new RegExp(`${prefix$1}hsla\\s*\\(${float},${percent},${percent},${float}\\)${suffix}`);
+ const hsvaRegex = new RegExp(`${prefix$1}hsva\\s*\\(${float},${percent},${percent},${float}\\)${suffix}`);
+ const rgbRegex = new RegExp(`${prefix$1}rgb\\s*\\(${float},${float},${float}\\)${suffix}`);
+ const rgbaRegex = new RegExp(`${prefix$1}rgba\\s*\\(${float},${float},${float},${float}\\)${suffix}`);
+ const sHexRegex = new RegExp(`${prefix$1}#${hex}${hex}${hex}${suffix}`);
+ const hexRegex = new RegExp(`${prefix$1}#${dhex}${dhex}${dhex}${suffix}`);
+ const sHexaRegex = new RegExp(`${prefix$1}#${hex}${hex}${hex}${hex}${suffix}`);
+ const hexaRegex = new RegExp(`${prefix$1}#${dhex}${dhex}${dhex}${dhex}${suffix}`);
+
+ function parseHex(value) {
+ return parseInt(value, 16);
+ }
+ /**
+ * Convert color string to hsla array
+ * @param color format like hsl(180, 100%, 100%), hsla(180, 100%, 100%, 1)
+ * @returns
+ */
+
+
+ function hsla(color) {
+ try {
+ let i;
+
+ if (i = hslaRegex.exec(color)) {
+ return [roundDeg(i[1]), roundPercent(i[5]), roundPercent(i[9]), roundAlpha(i[13])];
+ } else if (i = hslRegex.exec(color)) {
+ return [roundDeg(i[1]), roundPercent(i[5]), roundPercent(i[9]), 1];
+ }
+
+ throw new Error(`[seemly/hsla]: Invalid color value ${color}.`);
+ } catch (e) {
+ throw e;
+ }
+ }
+ /**
+ * Convert color string to hsva array
+ * @param color format like hsv(180, 100%, 100%), hsva(180, 100%, 100%, 1)
+ * @returns
+ */
+
+ function hsva(color) {
+ try {
+ let i;
+
+ if (i = hsvaRegex.exec(color)) {
+ return [roundDeg(i[1]), roundPercent(i[5]), roundPercent(i[9]), roundAlpha(i[13])];
+ } else if (i = hsvRegex.exec(color)) {
+ return [roundDeg(i[1]), roundPercent(i[5]), roundPercent(i[9]), 1];
+ }
+
+ throw new Error(`[seemly/hsva]: Invalid color value ${color}.`);
+ } catch (e) {
+ throw e;
+ }
+ }
+ /**
+ * Convert color string to rgba array.
+ * @param color format like #000[0], #000000[00], rgb(0, 0, 0), rgba(0, 0, 0, 0) and basic color keywords https://www.w3.org/TR/css-color-3/#html4 and transparent
+ * @returns
+ */
+
+ function rgba(color) {
+ try {
+ let i;
+
+ if (i = hexRegex.exec(color)) {
+ return [parseHex(i[1]), parseHex(i[2]), parseHex(i[3]), 1];
+ } else if (i = rgbRegex.exec(color)) {
+ return [roundChannel(i[1]), roundChannel(i[5]), roundChannel(i[9]), 1];
+ } else if (i = rgbaRegex.exec(color)) {
+ return [roundChannel(i[1]), roundChannel(i[5]), roundChannel(i[9]), roundAlpha(i[13])];
+ } else if (i = sHexRegex.exec(color)) {
+ return [parseHex(i[1] + i[1]), parseHex(i[2] + i[2]), parseHex(i[3] + i[3]), 1];
+ } else if (i = hexaRegex.exec(color)) {
+ return [parseHex(i[1]), parseHex(i[2]), parseHex(i[3]), roundAlpha(parseHex(i[4]) / 255)];
+ } else if (i = sHexaRegex.exec(color)) {
+ return [parseHex(i[1] + i[1]), parseHex(i[2] + i[2]), parseHex(i[3] + i[3]), roundAlpha(parseHex(i[4] + i[4]) / 255)];
+ } else if (color in colors) {
+ return rgba(colors[color]);
+ }
+
+ throw new Error(`[seemly/rgba]: Invalid color value ${color}.`);
+ } catch (e) {
+ throw e;
+ }
+ }
+
+ function normalizeAlpha$1(alphaValue) {
+ return alphaValue > 1 ? 1 : alphaValue < 0 ? 0 : alphaValue;
+ }
+
+ function stringifyRgb(r, g, b) {
+ return `rgb(${roundChannel(r)}, ${roundChannel(g)}, ${roundChannel(b)})`;
+ }
+
+ function stringifyRgba(r, g, b, a) {
+ return `rgba(${roundChannel(r)}, ${roundChannel(g)}, ${roundChannel(b)}, ${normalizeAlpha$1(a)})`;
+ }
+
+ function compositeChannel(v1, a1, v2, a2, a) {
+ return roundChannel((v1 * a1 * (1 - a2) + v2 * a2) / a);
+ }
+
+ function composite(background, overlay) {
+ if (!Array.isArray(background)) background = rgba(background);
+ if (!Array.isArray(overlay)) overlay = rgba(overlay);
+ const a1 = background[3];
+ const a2 = overlay[3];
+ const alpha = roundAlpha(a1 + a2 - a1 * a2);
+ return stringifyRgba(compositeChannel(background[0], a1, overlay[0], a2, alpha), compositeChannel(background[1], a1, overlay[1], a2, alpha), compositeChannel(background[2], a1, overlay[2], a2, alpha), alpha);
+ }
+ function changeColor(base, options) {
+ const [r, g, b, a = 1] = Array.isArray(base) ? base : rgba(base);
+
+ if (options.alpha) {
+ return stringifyRgba(r, g, b, options.alpha);
+ }
+
+ return stringifyRgba(r, g, b, a);
+ }
+ function scaleColor(base, options) {
+ const [r, g, b, a = 1] = Array.isArray(base) ? base : rgba(base);
+ const {
+ lightness = 1,
+ alpha = 1
+ } = options;
+ return toRgbaString([r * lightness, g * lightness, b * lightness, a * alpha]);
+ }
+ function roundAlpha(value) {
+ const v = Math.round(Number(value) * 100) / 100;
+ if (v > 1) return 1;
+ if (v < 0) return 0;
+ return v;
+ }
+ function roundDeg(value) {
+ const v = Math.round(Number(value));
+ if (v >= 360) return 0;
+ if (v < 0) return 0;
+ return v;
+ }
+ function roundChannel(value) {
+ const v = Math.round(Number(value));
+ if (v > 255) return 255;
+ if (v < 0) return 0;
+ return v;
+ }
+ function roundPercent(value) {
+ const v = Math.round(Number(value));
+ if (v > 100) return 100;
+ if (v < 0) return 0;
+ return v;
+ }
+ function toRgbString(base) {
+ const [r, g, b] = Array.isArray(base) ? base : rgba(base);
+ return stringifyRgb(r, g, b);
+ }
+ function toRgbaString(base) {
+ const [r, g, b] = base;
+
+ if (3 in base) {
+ return `rgba(${roundChannel(r)}, ${roundChannel(g)}, ${roundChannel(b)}, ${roundAlpha(base[3])})`;
+ }
+
+ return `rgba(${roundChannel(r)}, ${roundChannel(g)}, ${roundChannel(b)}, 1)`;
+ }
+ function toHsvString(base) {
+ return `hsv(${roundDeg(base[0])}, ${roundPercent(base[1])}%, ${roundPercent(base[2])}%)`;
+ }
+ function toHsvaString(base) {
+ const [h, s, v] = base;
+
+ if (3 in base) {
+ return `hsva(${roundDeg(h)}, ${roundPercent(s)}%, ${roundPercent(v)}%, ${roundAlpha(base[3])})`;
+ }
+
+ return `hsva(${roundDeg(h)}, ${roundPercent(s)}%, ${roundPercent(v)}%, 1)`;
+ }
+ function toHslString(base) {
+ return `hsl(${roundDeg(base[0])}, ${roundPercent(base[1])}%, ${roundPercent(base[2])}%)`;
+ }
+ function toHslaString(base) {
+ const [h, s, l] = base;
+
+ if (3 in base) {
+ return `hsla(${roundDeg(h)}, ${roundPercent(s)}%, ${roundPercent(l)}%, ${roundAlpha(base[3])})`;
+ }
+
+ return `hsla(${roundDeg(h)}, ${roundPercent(s)}%, ${roundPercent(l)}%, 1)`;
+ }
+ /**
+ *
+ * @param base [255, 255, 255, 255], [255, 255, 255], any hex string
+ * @returns
+ */
+
+ function toHexaString(base) {
+ if (typeof base === 'string') {
+ let i;
+
+ if (i = hexRegex.exec(base)) {
+ return `${i[0]}FF`;
+ } else if (i = hexaRegex.exec(base)) {
+ return i[0];
+ } else if (i = sHexRegex.exec(base)) {
+ return `#${i[1]}${i[1]}${i[2]}${i[2]}${i[3]}${i[3]}FF`;
+ } else if (i = sHexaRegex.exec(base)) {
+ return `#${i[1]}${i[1]}${i[2]}${i[2]}${i[3]}${i[3]}${i[4]}${i[4]}`;
+ }
+
+ throw new Error(`[seemly/toHexString]: Invalid hex value ${base}.`);
+ }
+
+ const hex = `#${base.slice(0, 3).map(unit => roundChannel(unit).toString(16).toUpperCase().padStart(2, '0')).join('')}`;
+ const a = base.length === 3 ? 'FF' : roundChannel(base[3] * 255).toString(16).padStart(2, '0').toUpperCase();
+ return hex + a;
+ }
+ /**
+ *
+ * @param base [255, 255, 255, 255], [255, 255, 255], any hex string
+ * @returns
+ */
+
+ function toHexString(base) {
+ if (typeof base === 'string') {
+ let i;
+
+ if (i = hexRegex.exec(base)) {
+ return i[0];
+ } else if (i = hexaRegex.exec(base)) {
+ return i[0].slice(0, 7);
+ } else if (i = sHexRegex.exec(base) || sHexaRegex.exec(base)) {
+ return `#${i[1]}${i[1]}${i[2]}${i[2]}${i[3]}${i[3]}`;
+ }
+
+ throw new Error(`[seemly/toHexString]: Invalid hex value ${base}.`);
+ }
+
+ return `#${base.slice(0, 3).map(unit => roundChannel(unit).toString(16).toUpperCase().padStart(2, '0')).join('')}`;
+ }
+
+ function createId() {
+ let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 8;
+ return Math.random().toString(16).slice(2, 2 + length);
+ }
+ function repeat(count, v) {
+ const ret = [];
+
+ for (let i = 0; i < count; ++i) {
+ ret.push(v);
+ }
+
+ return ret;
+ }
+
+ function indexMap(count, createValue) {
+ const ret = [];
+
+ if (!createValue) {
+ for (let i = 0; i < count; ++i) {
+ ret.push(i);
+ }
+
+ return ret;
+ }
+
+ for (let i = 0; i < count; ++i) {
+ ret.push(createValue(i));
+ }
+
+ return ret;
+ }
+
+ function getSlot$1(instance) {
+ let slotName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "default";
+ let fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
+ const slots = instance.$slots;
+ const slot = slots[slotName];
+ if (slot === void 0) return fallback;
+ return slot();
+ }
+
+ function getVNodeChildren(vNode) {
+ let slotName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "default";
+ let fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
+ const {
+ children
+ } = vNode;
+
+ if (children !== null && typeof children === "object" && !Array.isArray(children)) {
+ const slot = children[slotName];
+
+ if (typeof slot === "function") {
+ return slot();
+ }
+ }
+
+ return fallback;
+ }
+
+ function keep(object) {
+ let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+ let rest = arguments.length > 2 ? arguments[2] : undefined;
+ const keepedObject = {};
+ keys.forEach(key => {
+ keepedObject[key] = object[key];
+ });
+ return Object.assign(keepedObject, rest);
+ }
+
+ function omit(object) {
+ let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+ let rest = arguments.length > 2 ? arguments[2] : undefined;
+ const omitedObject = {};
+ const originalKeys = Object.getOwnPropertyNames(object);
+ originalKeys.forEach(originalKey => {
+ if (!keys.includes(originalKey)) {
+ omitedObject[originalKey] = object[originalKey];
+ }
+ });
+ return Object.assign(omitedObject, rest);
+ }
+
+ function flatten$3(vNodes) {
+ let filterCommentNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ let result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
+ vNodes.forEach(vNode => {
+ if (vNode === null) return;
+
+ if (typeof vNode !== "object") {
+ if (typeof vNode === "string" || typeof vNode === "number") {
+ result.push(vue.createTextVNode(String(vNode)));
+ }
+
+ return;
+ }
+
+ if (Array.isArray(vNode)) {
+ flatten$3(vNode, filterCommentNode, result);
+ return;
+ }
+
+ if (vNode.type === vue.Fragment) {
+ if (vNode.children === null) return;
+
+ if (Array.isArray(vNode.children)) {
+ flatten$3(vNode.children, filterCommentNode, result);
+ }
+ } else if (vNode.type !== vue.Comment) {
+ result.push(vNode);
+ }
+ });
+ return result;
+ }
+
+ function call(funcs) {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (Array.isArray(funcs)) {
+ funcs.forEach(func => call(func, ...args));
+ } else return funcs(...args);
+ }
+
+ function keysOf(obj) {
+ return Object.keys(obj);
+ }
+
+ const render$1 = function (r) {
+ if (typeof r === "function") {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ return r(...args);
+ } else if (typeof r === "string") {
+ return vue.createTextVNode(r);
+ } else if (typeof r === "number") {
+ return vue.createTextVNode(String(r));
+ } else {
+ return null;
+ }
+ };
+
+ const warnedMessages = /* @__PURE__ */new Set();
+ function warnOnce(location, message) {
+ const mergedMessage = `[naive/${location}]: ${message}`;
+ if (warnedMessages.has(mergedMessage)) return;
+ warnedMessages.add(mergedMessage);
+ console.error(mergedMessage);
+ }
+ function warn$2(location, message) {
+ console.error(`[naive/${location}]: ${message}`);
+ }
+ function throwError(location, message) {
+ throw new Error(`[naive/${location}]: ${message}`);
+ }
+
+ function smallerSize(size) {
+ switch (size) {
+ case "tiny":
+ return "mini";
+
+ case "small":
+ return "tiny";
+
+ case "medium":
+ return "small";
+
+ case "large":
+ return "medium";
+
+ case "huge":
+ return "large";
+ }
+
+ throw Error(`${size} has no smaller size.`);
+ }
+
+ function getTitleAttribute(value) {
+ switch (typeof value) {
+ case "string":
+ return value || void 0;
+
+ case "number":
+ return String(value);
+
+ default:
+ return void 0;
+ }
+ }
+
+ function getFirstSlotVNode(slots) {
+ let slotName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "default";
+ let props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : void 0;
+ const slot = slots[slotName];
+
+ if (!slot) {
+ warn$2("getFirstSlotVNode", `slot[${slotName}] is empty`);
+ return null;
+ }
+
+ const slotContent = flatten$3(slot(props));
+
+ if (slotContent.length === 1) {
+ return slotContent[0];
+ } else {
+ warn$2("getFirstSlotVNode", `slot[${slotName}] should have exactly one child`);
+ return null;
+ }
+ }
+
+ function createDataKey(key) {
+ return typeof key === "string" ? `s-${key}` : `n-${key}`;
+ }
+
+ function createRefSetter(ref) {
+ return inst => {
+ if (inst) {
+ ref.value = inst.$el;
+ } else {
+ ref.value = null;
+ }
+ };
+ }
+
+ function createInjectionKey(key) {
+ return key;
+ }
+
+ function ensureValidVNode(vnodes) {
+ return vnodes.some(child => {
+ if (!vue.isVNode(child)) {
+ return true;
+ }
+
+ if (child.type === vue.Comment) {
+ return false;
+ }
+
+ if (child.type === vue.Fragment && !ensureValidVNode(child.children)) {
+ return false;
+ }
+
+ return true;
+ }) ? vnodes : null;
+ }
+
+ function resolveSlot(slot, fallback) {
+ return slot && ensureValidVNode(slot()) || fallback();
+ }
+ function resolveSlotWithProps(slot, props, fallback) {
+ return slot && ensureValidVNode(slot(props)) || fallback(props);
+ }
+ function resolveWrappedSlot(slot, wrapper) {
+ const children = slot && ensureValidVNode(slot());
+ return wrapper(children || null);
+ }
+ function isSlotEmpty(slot) {
+ return !(slot && ensureValidVNode(slot()));
+ }
+
+ function mergeEventHandlers(handlers) {
+ const filteredHandlers = handlers.filter(handler => handler !== void 0);
+ if (filteredHandlers.length === 0) return void 0;
+ if (filteredHandlers.length === 1) return filteredHandlers[0];
+ return e => {
+ handlers.forEach(handler => {
+ if (handler) {
+ handler(e);
+ }
+ });
+ };
+ }
+
+ function isNodeVShowFalse(vNode) {
+ const showDir = vNode.dirs?.find(_ref => {
+ let {
+ dir
+ } = _ref;
+ return dir === vue.vShow;
+ });
+ return !!(showDir && showDir.value === false);
+ }
+
+ const Wrapper = vue.defineComponent({
+ render() {
+ return this.$slots.default?.();
+ }
+ });
+
+ const pureNumberRegex = /^(\d|\.)+$/;
+ const numberRegex = /(\d|\.)+/;
+ function formatLength(length) {
+ let {
+ c = 1,
+ offset = 0,
+ attachPx = true
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (typeof length === "number") {
+ const result = (length + offset) * c;
+ if (result === 0) return "0";
+ return `${result}px`;
+ } else if (typeof length === "string") {
+ if (pureNumberRegex.test(length)) {
+ const result = (Number(length) + offset) * c;
+
+ if (attachPx) {
+ if (result === 0) return "0";
+ return `${result}px`;
+ } else {
+ return `${result}`;
+ }
+ } else {
+ const result = numberRegex.exec(length);
+ if (!result) return length;
+ return length.replace(numberRegex, String((Number(result[0]) + offset) * c));
+ }
+ }
+
+ return length;
+ }
+
+ function color2Class(color) {
+ return color.replace(/#|\(|\)|,|\s/g, "_");
+ }
+
+ function ampCount(selector) {
+ let cnt = 0;
+
+ for (let i = 0; i < selector.length; ++i) {
+ if (selector[i] === '&') ++cnt;
+ }
+
+ return cnt;
+ }
+ /**
+ * Don't just use ',' to separate css selector. For example:
+ * x:(a, b) {} will be split into 'x:(a' and 'b)', which is not expected.
+ * Make sure comma doesn't exist inside parentheses.
+ */
+
+
+ const separatorRegex = /\s*,(?![^(]*\))\s*/g;
+ const extraSpaceRegex = /\s+/g;
+ /**
+ * selector must includes '&'
+ * selector is trimmed
+ * every part of amp is trimmed
+ */
+
+ function resolveSelectorWithAmp(amp, selector) {
+ const nextAmp = [];
+ selector.split(separatorRegex).forEach(partialSelector => {
+ let round = ampCount(partialSelector); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ if (!round) {
+ amp.forEach(partialAmp => {
+ nextAmp.push( // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ (partialAmp && partialAmp + ' ') + partialSelector);
+ });
+ return;
+ } else if (round === 1) {
+ amp.forEach(partialAmp => {
+ nextAmp.push(partialSelector.replace('&', partialAmp));
+ });
+ return;
+ }
+
+ let partialNextAmp = [partialSelector]; // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ while (round--) {
+ const nextPartialNextAmp = [];
+ partialNextAmp.forEach(selectorItr => {
+ amp.forEach(partialAmp => {
+ nextPartialNextAmp.push(selectorItr.replace('&', partialAmp));
+ });
+ });
+ partialNextAmp = nextPartialNextAmp;
+ }
+
+ partialNextAmp.forEach(part => nextAmp.push(part));
+ });
+ return nextAmp;
+ }
+ /**
+ * selector mustn't includes '&'
+ * selector is trimmed
+ */
+
+
+ function resolveSelector(amp, selector) {
+ const nextAmp = [];
+ selector.split(separatorRegex).forEach(partialSelector => {
+ amp.forEach(partialAmp => {
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ nextAmp.push((partialAmp && partialAmp + ' ') + partialSelector);
+ });
+ });
+ return nextAmp;
+ }
+
+ function parseSelectorPath(selectorPaths) {
+ let amp = [''];
+ selectorPaths.forEach(selector => {
+ // eslint-disable-next-line
+ selector = selector && selector.trim();
+
+ if ( // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ !selector) {
+ /**
+ * if it's a empty selector, do nothing
+ */
+ return;
+ } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+
+ if (selector.includes('&')) {
+ amp = resolveSelectorWithAmp(amp, selector);
+ } else {
+ amp = resolveSelector(amp, selector);
+ }
+ });
+ return amp.join(', ').replace(extraSpaceRegex, ' ');
+ }
+
+ function removeElement(el) {
+ /* istanbul ignore if */
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ if (!el) return;
+ const parentElement = el.parentElement;
+ /* istanbul ignore else */
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ if (parentElement) parentElement.removeChild(el);
+ }
+ function queryElement(id) {
+ return document.head.querySelector(`style[cssr-id="${id}"]`);
+ }
+ function createElement(id) {
+ const el = document.createElement('style');
+ el.setAttribute('cssr-id', id);
+ return el;
+ }
+ function isMediaOrSupports(selector) {
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ if (!selector) return false;
+ return /^\s*@(s|m)/.test(selector);
+ }
+
+ const kebabRegex = /[A-Z]/g;
+
+ function kebabCase(pattern) {
+ return pattern.replace(kebabRegex, match => '-' + match.toLowerCase());
+ }
+ /** TODO: refine it to solve nested object */
+
+
+ function unwrapProperty(prop) {
+ let indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ' ';
+
+ if (typeof prop === 'object' && prop !== null) {
+ return ' {\n' + Object.entries(prop).map(v => {
+ return indent + ` ${kebabCase(v[0])}: ${v[1]};`;
+ }).join('\n') + '\n' + indent + '}';
+ }
+
+ return `: ${prop};`;
+ }
+ /** unwrap properties */
+
+
+ function unwrapProperties(props, instance, params) {
+ if (typeof props === 'function') {
+ return props({
+ context: instance.context,
+ props: params
+ });
+ }
+
+ return props;
+ }
+
+ function createStyle(selector, props, instance, params) {
+ if (!props) return ''; // eslint-disable-next-line
+
+ const unwrappedProps = unwrapProperties(props, instance, params);
+ if (!unwrappedProps) return '';
+
+ if (typeof unwrappedProps === 'string') {
+ return `${selector} {\n${unwrappedProps}\n}`;
+ }
+
+ const propertyNames = Object.keys(unwrappedProps);
+
+ if (propertyNames.length === 0) {
+ if (instance.config.keepEmptyBlock) return selector + ' {\n}';
+ return '';
+ }
+
+ const statements = selector ? [selector + ' {'] : [];
+ propertyNames.forEach(propertyName => {
+ const property = unwrappedProps[propertyName];
+
+ if (propertyName === 'raw') {
+ statements.push('\n' + property + '\n');
+ return;
+ }
+
+ propertyName = kebabCase(propertyName);
+
+ if (property !== null && property !== undefined) {
+ statements.push(` ${propertyName}${unwrapProperty(property)}`);
+ }
+ });
+
+ if (selector) {
+ statements.push('}');
+ }
+
+ return statements.join('\n');
+ }
+
+ function loopCNodeListWithCallback(children, options, callback) {
+ /* istanbul ignore if */
+ if (!children) return;
+ children.forEach(child => {
+ if (Array.isArray(child)) {
+ loopCNodeListWithCallback(child, options, callback);
+ } else if (typeof child === 'function') {
+ const grandChildren = child(options);
+
+ if (Array.isArray(grandChildren)) {
+ loopCNodeListWithCallback(grandChildren, options, callback);
+ } else if (grandChildren) {
+ callback(grandChildren);
+ }
+ } else if (child) {
+ callback(child);
+ }
+ });
+ }
+
+ function traverseCNode(node, selectorPaths, styles, instance, params, styleSheet) {
+ const $ = node.$;
+ let blockSelector = '';
+
+ if (!$ || typeof $ === 'string') {
+ if (isMediaOrSupports($)) {
+ blockSelector = $;
+ } else {
+ // as a string selector
+ selectorPaths.push($);
+ }
+ } else if (typeof $ === 'function') {
+ const selector = $({
+ context: instance.context,
+ props: params
+ });
+
+ if (isMediaOrSupports(selector)) {
+ blockSelector = selector;
+ } else {
+ // as a lazy selector
+ selectorPaths.push(selector);
+ }
+ } else {
+ // as a option selector
+ if ($.before) $.before(instance.context);
+
+ if (!$.$ || typeof $.$ === 'string') {
+ if (isMediaOrSupports($.$)) {
+ blockSelector = $.$;
+ } else {
+ // as a string selector
+ selectorPaths.push($.$);
+ }
+ } else
+ /* istanbul ignore else */
+ if ($.$) {
+ const selector = $.$({
+ context: instance.context,
+ props: params
+ });
+
+ if (isMediaOrSupports(selector)) {
+ blockSelector = selector;
+ } else {
+ // as a lazy selector
+ selectorPaths.push(selector);
+ }
+ }
+ }
+
+ const selector = parseSelectorPath(selectorPaths);
+ const style = createStyle(selector, node.props, instance, params);
+
+ if (blockSelector) {
+ styles.push(`${blockSelector} {`);
+
+ if (styleSheet && style) {
+ styleSheet.insertRule(`${blockSelector} {\n${style}\n}\n`);
+ }
+ } else {
+ if (styleSheet && style) {
+ styleSheet.insertRule(style);
+ }
+
+ if (!styleSheet && style.length) styles.push(style);
+ }
+
+ if (node.children) {
+ loopCNodeListWithCallback(node.children, {
+ context: instance.context,
+ props: params
+ }, childNode => {
+ if (typeof childNode === 'string') {
+ const style = createStyle(selector, {
+ raw: childNode
+ }, instance, params);
+
+ if (styleSheet) {
+ styleSheet.insertRule(style);
+ } else {
+ styles.push(style);
+ }
+ } else {
+ traverseCNode(childNode, selectorPaths, styles, instance, params, styleSheet);
+ }
+ });
+ }
+
+ selectorPaths.pop();
+
+ if (blockSelector) {
+ styles.push('}');
+ }
+
+ if ($ && $.after) $.after(instance.context);
+ }
+
+ function render(node, instance, props) {
+ let insertRule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+ const styles = [];
+ traverseCNode(node, [], styles, instance, props, insertRule ? node.instance.__styleSheet : undefined);
+ if (insertRule) return '';
+ return styles.join('\n\n');
+ }
+
+ /* eslint-disable */
+ // Inspired by https://github.com/garycourt/murmurhash-js
+ // Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86
+ function murmur2(str) {
+ // 'm' and 'r' are mixing constants generated offline.
+ // They're not really 'magic', they just happen to work well.
+ // const m = 0x5bd1e995;
+ // const r = 24;
+ // Initialize the hash
+ var h = 0; // Mix 4 bytes at a time into the hash
+
+ var k,
+ i = 0,
+ len = str.length;
+
+ for (; len >= 4; ++i, len -= 4) {
+ k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;
+ k =
+ /* Math.imul(k, m): */
+ (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);
+ k ^=
+ /* k >>> r: */
+ k >>> 24;
+ h =
+ /* Math.imul(k, m): */
+ (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^
+ /* Math.imul(h, m): */
+ (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);
+ } // Handle the last few bytes of the input array
+
+
+ switch (len) {
+ 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 =
+ /* Math.imul(h, m): */
+ (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);
+ } // Do a few final mixes of the hash to ensure the last few
+ // bytes are well-incorporated.
+
+
+ h ^= h >>> 13;
+ h =
+ /* Math.imul(h, m): */
+ (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);
+ return ((h ^ h >>> 15) >>> 0).toString(36);
+ }
+
+ /* eslint-disable @typescript-eslint/prefer-ts-expect-error */
+
+ if (typeof window !== 'undefined') {
+ window.__cssrContext = {};
+ }
+
+ function unmount(intance, node, id) {
+ const {
+ els
+ } = node; // If id is undefined, unmount all styles
+
+ if (id === undefined) {
+ els.forEach(removeElement);
+ node.els = [];
+ } else {
+ const target = queryElement(id); // eslint-disable-next-line
+
+ if (target && els.includes(target)) {
+ removeElement(target);
+ node.els = els.filter(el => el !== target);
+ }
+ }
+ }
+
+ function addElementToList(els, target) {
+ els.push(target);
+ }
+
+ function mount(instance, node, id, props, head, silent, force, anchorMetaName, ssrAdapter // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
+ ) {
+ if (silent && !ssrAdapter) {
+ if (id === undefined) {
+ // it is possible to use hash to get rid of the requirements of id
+ // if you are interested in it, please create a pr
+ // i have no time to impl it
+ console.error('[css-render/mount]: `id` is required in `silent` mode.');
+ return;
+ }
+
+ const cssrContext = window.__cssrContext;
+
+ if (!cssrContext[id]) {
+ cssrContext[id] = true;
+ render(node, instance, props, silent);
+ }
+
+ return;
+ }
+
+ let style;
+
+ if (id === undefined) {
+ style = node.render(props);
+ id = murmur2(style);
+ }
+
+ if (ssrAdapter) {
+ ssrAdapter.adapter(id, style !== null && style !== void 0 ? style : node.render(props));
+ return;
+ }
+
+ const queriedTarget = queryElement(id);
+
+ if (queriedTarget !== null && !force) {
+ return queriedTarget;
+ }
+
+ const target = queriedTarget !== null && queriedTarget !== void 0 ? queriedTarget : createElement(id);
+ if (style === undefined) style = node.render(props);
+ target.textContent = style;
+ if (queriedTarget !== null) return queriedTarget;
+
+ if (anchorMetaName) {
+ const anchorMetaEl = document.head.querySelector(`meta[name="${anchorMetaName}"]`);
+
+ if (anchorMetaEl) {
+ document.head.insertBefore(target, anchorMetaEl);
+ addElementToList(node.els, target);
+ return target;
+ }
+ }
+
+ if (head) {
+ document.head.insertBefore(target, document.head.querySelector('style, link'));
+ } else {
+ document.head.appendChild(target);
+ }
+
+ addElementToList(node.els, target);
+ return target;
+ }
+
+ function wrappedRender(props) {
+ return render(this, this.instance, props);
+ } // do not guard node calling, it should throw an error.
+
+
+ function wrappedMount() {
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ const {
+ id,
+ ssr,
+ props,
+ head = false,
+ silent = false,
+ force = false,
+ anchorMetaName
+ } = options;
+ const targetElement = mount(this.instance, this, id, props, head, silent, force, anchorMetaName, ssr);
+ return targetElement;
+ }
+
+ function wrappedUnmount() {
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ /* istanbul ignore next */
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ const {
+ id
+ } = options;
+ unmount(this.instance, this, id);
+ }
+
+ const createCNode = function (instance, $, props, children) {
+ return {
+ instance,
+ $,
+ props,
+ children,
+ els: [],
+ render: wrappedRender,
+ mount: wrappedMount,
+ unmount: wrappedUnmount
+ };
+ };
+
+ const c$2 = function (instance, $, props, children) {
+ if (Array.isArray($)) {
+ return createCNode(instance, {
+ $: null
+ }, null, $);
+ } else if (Array.isArray(props)) {
+ return createCNode(instance, $, null, props);
+ } else if (Array.isArray(children)) {
+ return createCNode(instance, $, props, children);
+ } else {
+ return createCNode(instance, $, props, null);
+ }
+ };
+
+ function CssRender() {
+ let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ let styleSheet = null;
+ const cssr = {
+ c: function () {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return c$2(cssr, ...args);
+ },
+ use: function (plugin) {
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ return plugin.install(cssr, ...args);
+ },
+ find: queryElement,
+ context: {},
+ config,
+
+ get __styleSheet() {
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ if (!styleSheet) {
+ const style = document.createElement('style');
+ document.head.appendChild(style);
+ styleSheet = document.styleSheets[document.styleSheets.length - 1];
+ return styleSheet;
+ }
+
+ return styleSheet;
+ }
+
+ };
+ return cssr;
+ }
+
+ function exists(id, ssr) {
+ if (id === undefined) return false;
+
+ if (ssr) {
+ const {
+ context: {
+ ids
+ }
+ } = ssr;
+ return ids.has(id);
+ }
+
+ return queryElement(id) !== null;
+ }
+
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */
+
+ /* eslint-disable @typescript-eslint/strict-boolean-expressions */
+ function plugin$1(options) {
+ let _bPrefix = '.';
+ let _ePrefix = '__';
+ let _mPrefix = '--';
+ let c;
+
+ if (options) {
+ let t = options.blockPrefix;
+
+ if (t) {
+ _bPrefix = t;
+ }
+
+ t = options.elementPrefix;
+
+ if (t) {
+ _ePrefix = t;
+ }
+
+ t = options.modifierPrefix;
+
+ if (t) {
+ _mPrefix = t;
+ }
+ }
+
+ const _plugin = {
+ install(instance) {
+ c = instance.c;
+ const ctx = instance.context;
+ ctx.bem = {};
+ ctx.bem.b = null;
+ ctx.bem.els = null;
+ }
+
+ };
+
+ function b(arg) {
+ let memorizedB;
+ let memorizedE;
+ return {
+ before(ctx) {
+ memorizedB = ctx.bem.b;
+ memorizedE = ctx.bem.els;
+ ctx.bem.els = null;
+ },
+
+ after(ctx) {
+ ctx.bem.b = memorizedB;
+ ctx.bem.els = memorizedE;
+ },
+
+ $(_ref) {
+ let {
+ context,
+ props
+ } = _ref;
+ arg = typeof arg === 'string' ? arg : arg({
+ context,
+ props
+ });
+ context.bem.b = arg;
+ return `${(props === null || props === void 0 ? void 0 : props.bPrefix) || _bPrefix}${context.bem.b}`;
+ }
+
+ };
+ }
+
+ function e(arg) {
+ let memorizedE;
+ return {
+ before(ctx) {
+ memorizedE = ctx.bem.els;
+ },
+
+ after(ctx) {
+ ctx.bem.els = memorizedE;
+ },
+
+ $(_ref2) {
+ let {
+ context,
+ props
+ } = _ref2;
+ arg = typeof arg === 'string' ? arg : arg({
+ context,
+ props
+ });
+ context.bem.els = arg.split(',').map(v => v.trim());
+ return context.bem.els.map(el => `${(props === null || props === void 0 ? void 0 : props.bPrefix) || _bPrefix}${context.bem.b}${_ePrefix}${el}`).join(', ');
+ }
+
+ };
+ }
+
+ function m(arg) {
+ return {
+ $(_ref3) {
+ let {
+ context,
+ props
+ } = _ref3;
+ arg = typeof arg === 'string' ? arg : arg({
+ context,
+ props
+ });
+ const modifiers = arg.split(',').map(v => v.trim());
+
+ function elementToSelector(el) {
+ return modifiers.map(modifier => `&${(props === null || props === void 0 ? void 0 : props.bPrefix) || _bPrefix}${context.bem.b}${el !== undefined ? `${_ePrefix}${el}` : ''}${_mPrefix}${modifier}`).join(', ');
+ }
+
+ const els = context.bem.els;
+
+ if (els !== null) {
+ if (els.length >= 2) {
+ throw Error(`[css-render/plugin-bem]: m(${arg}) is invalid, using modifier inside multiple elements is not allowed`);
+ }
+
+ return elementToSelector(els[0]);
+ } else {
+ return elementToSelector();
+ }
+ }
+
+ };
+ }
+
+ function notM(arg) {
+ return {
+ $(_ref4) {
+ let {
+ context,
+ props
+ } = _ref4;
+ arg = typeof arg === 'string' ? arg : arg({
+ context,
+ props
+ });
+ const els = context.bem.els;
+
+ if (els !== null && els.length >= 2) {
+ throw Error(`[css-render/plugin-bem]: notM(${arg}) is invalid, using modifier inside multiple elements is not allowed`);
+ }
+
+ return `&:not(${(props === null || props === void 0 ? void 0 : props.bPrefix) || _bPrefix}${context.bem.b}${els !== null && els.length > 0 ? `${_ePrefix}${els[0]}` : ''}${_mPrefix}${arg})`;
+ }
+
+ };
+ }
+
+ const cB = function () {
+ return c(b(arguments.length <= 0 ? undefined : arguments[0]), arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]);
+ };
+
+ const cE = function () {
+ return c(e(arguments.length <= 0 ? undefined : arguments[0]), arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]);
+ };
+
+ const cM = function () {
+ return c(m(arguments.length <= 0 ? undefined : arguments[0]), arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]);
+ };
+
+ const cNotM = function () {
+ return c(notM(arguments.length <= 0 ? undefined : arguments[0]), arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]);
+ };
+
+ Object.assign(_plugin, {
+ cB,
+ cE,
+ cM,
+ cNotM
+ });
+ return _plugin;
+ }
+
+ function createKey(prefix, suffix) {
+ return prefix + (suffix === "default" ? "" : suffix.replace(/^[a-z]/, startChar => startChar.toUpperCase()));
+ }
+ createKey("abc", "def");
+
+ const namespace = "n";
+ const prefix = `.${namespace}-`;
+ const elementPrefix = "__";
+ const modifierPrefix = "--";
+ const cssr = CssRender();
+ const plugin = plugin$1({
+ blockPrefix: prefix,
+ elementPrefix,
+ modifierPrefix
+ });
+ cssr.use(plugin);
+ const {
+ c: c$1,
+ find
+ } = cssr;
+ const {
+ cB,
+ cE,
+ cM,
+ cNotM
+ } = plugin;
+
+ function insideModal(style) {
+ return c$1(_ref => {
+ let {
+ props: {
+ bPrefix
+ }
+ } = _ref;
+ return `${bPrefix || prefix}modal, ${bPrefix || prefix}drawer`;
+ }, [style]);
+ }
+
+ function insidePopover(style) {
+ return c$1(_ref2 => {
+ let {
+ props: {
+ bPrefix
+ }
+ } = _ref2;
+ return `${bPrefix || prefix}popover`;
+ }, [style]);
+ }
+
+ function asModal(style) {
+ return c$1(_ref3 => {
+ let {
+ props: {
+ bPrefix
+ }
+ } = _ref3;
+ return `&${bPrefix || prefix}modal`;
+ }, style);
+ }
+
+ const cCB = function () {
+ return c$1(">", [cB(...arguments)]);
+ };
+
+ let _isJsdom;
+
+ function isJsdom() {
+ if (_isJsdom === void 0) {
+ _isJsdom = navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom");
+ }
+
+ return _isJsdom;
+ }
+
+ const isBrowser$2 = typeof document !== "undefined" && typeof window !== "undefined";
+
+ const eventSet = /* @__PURE__ */new WeakSet();
+ function markEventEffectPerformed(event) {
+ eventSet.add(event);
+ }
+ function eventEffectNotPerformed(event) {
+ return !eventSet.has(event);
+ }
+
+ function useInjectionInstanceCollection(injectionName, collectionKey, registerKeyRef) {
+ const injection = vue.inject(injectionName, null);
+ if (injection === null) return;
+ const vm = vue.getCurrentInstance()?.proxy;
+ vue.watch(registerKeyRef, registerInstance);
+ registerInstance(registerKeyRef.value);
+ vue.onBeforeUnmount(() => {
+ registerInstance(void 0, registerKeyRef.value);
+ });
+
+ function registerInstance(key, oldKey) {
+ const collection = injection[collectionKey];
+ if (oldKey !== void 0) removeInstance(collection, oldKey);
+ if (key !== void 0) addInstance(collection, key);
+ }
+
+ function removeInstance(collection, key) {
+ if (!collection[key]) collection[key] = [];
+ collection[key].splice(collection[key].findIndex(instance => instance === vm), 1);
+ }
+
+ function addInstance(collection, key) {
+ if (!collection[key]) collection[key] = [];
+
+ if (!~collection[key].findIndex(instance => instance === vm)) {
+ collection[key].push(vm);
+ }
+ }
+ }
+ function useInjectionCollection(injectionName, collectionKey, valueRef) {
+ const injection = vue.inject(injectionName, null);
+ if (injection === null) return;
+
+ if (!(collectionKey in injection)) {
+ injection[collectionKey] = [];
+ }
+
+ injection[collectionKey].push(valueRef.value);
+ vue.watch(valueRef, (value, prevValue) => {
+ const collectionArray = injection[collectionKey];
+ const index = collectionArray.findIndex(collectionValue => collectionValue === prevValue);
+ if (~index) collectionArray.splice(index, 1);
+ collectionArray.push(value);
+ });
+ vue.onBeforeUnmount(() => {
+ const collectionArray = injection[collectionKey];
+ const index = collectionArray.findIndex(collectionValue => collectionValue === valueRef.value);
+ if (~index) collectionArray.splice(index, 1);
+ });
+ }
+ function useInjectionElementCollection(injectionName, collectionKey, getElement) {
+ const injection = vue.inject(injectionName, null);
+ if (injection === null) return;
+
+ if (!(collectionKey in injection)) {
+ injection[collectionKey] = [];
+ }
+
+ vue.onMounted(() => {
+ const el = getElement();
+ if (!el) return;
+ injection[collectionKey].push(el);
+ });
+ vue.onBeforeUnmount(() => {
+ const collectionArray = injection[collectionKey];
+ const element = getElement();
+ const index = collectionArray.findIndex(collectionElement => collectionElement === element);
+ if (~index) collectionArray.splice(index, 1);
+ });
+ }
+
+ function useDeferredTrue(valueRef, delay, shouldDelayRef) {
+ if (!delay) return valueRef;
+ const delayedRef = vue.ref(valueRef.value);
+ let timerId = null;
+ vue.watch(valueRef, value => {
+ if (timerId !== null) window.clearTimeout(timerId);
+
+ if (value === true) {
+ if (shouldDelayRef && !shouldDelayRef.value) {
+ delayedRef.value = true;
+ } else {
+ timerId = window.setTimeout(() => {
+ delayedRef.value = true;
+ }, delay);
+ }
+ } else {
+ delayedRef.value = false;
+ }
+ });
+ return delayedRef;
+ }
+
+ function useFalseUntilTruthy(originalRef) {
+ const currentRef = vue.ref(!!originalRef.value);
+ if (currentRef.value) return vue.readonly(currentRef);
+ const stop = vue.watch(originalRef, value => {
+ if (value) {
+ currentRef.value = true;
+ stop();
+ }
+ });
+ return vue.readonly(currentRef);
+ }
+
+ function useMemo(getterOrOptions) {
+ const computedValueRef = vue.computed(getterOrOptions); // Maybe it's not possible to lazy evaluate the value, since we can't make
+ // render phase capture the deps behind useMemo
+
+ const valueRef = vue.ref(computedValueRef.value);
+ vue.watch(computedValueRef, value => {
+ valueRef.value = value;
+ });
+
+ if (typeof getterOrOptions === 'function') {
+ return valueRef;
+ } else {
+ return {
+ __v_isRef: true,
+
+ get value() {
+ return valueRef.value;
+ },
+
+ set value(v) {
+ getterOrOptions.set(v);
+ }
+
+ };
+ }
+ }
+
+ function hasInstance() {
+ return vue.getCurrentInstance() !== null;
+ }
+ const isBrowser$1 = typeof window !== 'undefined';
+
+ let fontsReady;
+ let isFontReady;
+
+ const init$1 = () => {
+ var _a, _b;
+
+ fontsReady = isBrowser$1 ? (_b = (_a = document) === null || _a === void 0 ? void 0 : _a.fonts) === null || _b === void 0 ? void 0 : _b.ready : undefined;
+ isFontReady = false;
+ /* istanbul ignore if */
+
+ if (fontsReady !== undefined) {
+ void fontsReady.then(() => {
+ isFontReady = true;
+ });
+ } else {
+ isFontReady = true;
+ }
+ };
+
+ init$1(); // For testing
+ /**
+ * Call callback on fontsReady is resolved. If fontsReady is already resolved,
+ * callback won't be called.
+ */
+
+ function onFontsReady(cb) {
+ /* istanbul ignore next */
+ if (isFontReady) return;
+ let deactivated = false;
+ vue.onMounted(() => {
+ /* istanbul ignore next */
+ if (!isFontReady) {
+ fontsReady === null || fontsReady === void 0 ? void 0 : fontsReady.then(() => {
+ if (deactivated) return;
+ cb();
+ });
+ }
+ });
+ vue.onBeforeUnmount(() => {
+ deactivated = true;
+ });
+ }
+
+ function getEventTarget(e) {
+ const path = e.composedPath();
+ return path[0];
+ }
+
+ const traps = {
+ mousemoveoutside: new WeakMap(),
+ clickoutside: new WeakMap()
+ };
+
+ function createTrapHandler(name, el, originalHandler) {
+ if (name === 'mousemoveoutside') {
+ const moveHandler = e => {
+ if (el.contains(getEventTarget(e))) return;
+ originalHandler(e);
+ };
+
+ return {
+ mousemove: moveHandler,
+ touchstart: moveHandler
+ };
+ } else if (name === 'clickoutside') {
+ let mouseDownOutside = false;
+
+ const downHandler = e => {
+ mouseDownOutside = !el.contains(getEventTarget(e));
+ };
+
+ const upHanlder = e => {
+ if (!mouseDownOutside) return;
+ if (el.contains(getEventTarget(e))) return;
+ originalHandler(e);
+ };
+
+ return {
+ mousedown: downHandler,
+ mouseup: upHanlder,
+ touchstart: downHandler,
+ touchend: upHanlder
+ };
+ }
+
+ console.error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ `[evtd/create-trap-handler]: name \`${name}\` is invalid. This could be a bug of evtd.`);
+ return {};
+ }
+
+ function ensureTrapHandlers(name, el, handler) {
+ const handlers = traps[name];
+ let elHandlers = handlers.get(el);
+
+ if (elHandlers === undefined) {
+ handlers.set(el, elHandlers = new WeakMap());
+ }
+
+ let trapHandler = elHandlers.get(handler);
+
+ if (trapHandler === undefined) {
+ elHandlers.set(handler, trapHandler = createTrapHandler(name, el, handler));
+ }
+
+ return trapHandler;
+ }
+
+ function trapOn(name, el, handler, options) {
+ if (name === 'mousemoveoutside' || name === 'clickoutside') {
+ const trapHandlers = ensureTrapHandlers(name, el, handler);
+ Object.keys(trapHandlers).forEach(key => {
+ on(key, document, trapHandlers[key], options);
+ });
+ return true;
+ }
+
+ return false;
+ }
+
+ function trapOff(name, el, handler, options) {
+ if (name === 'mousemoveoutside' || name === 'clickoutside') {
+ const trapHandlers = ensureTrapHandlers(name, el, handler);
+ Object.keys(trapHandlers).forEach(key => {
+ off(key, document, trapHandlers[key], options);
+ });
+ return true;
+ }
+
+ return false;
+ }
+
+ function createDelegate() {
+ if (typeof window === 'undefined') {
+ return {
+ on: () => {},
+ off: () => {}
+ };
+ }
+
+ const propagationStopped = new WeakMap();
+ const immediatePropagationStopped = new WeakMap();
+
+ function trackPropagation() {
+ propagationStopped.set(this, true);
+ }
+
+ function trackImmediate() {
+ propagationStopped.set(this, true);
+ immediatePropagationStopped.set(this, true);
+ }
+
+ function spy(event, propName, fn) {
+ const source = event[propName];
+
+ event[propName] = function () {
+ fn.apply(event, arguments);
+ return source.apply(event, arguments);
+ };
+
+ return event;
+ }
+
+ function unspy(event, propName) {
+ event[propName] = Event.prototype[propName];
+ }
+
+ const currentTargets = new WeakMap();
+ const currentTargetDescriptor = Object.getOwnPropertyDescriptor(Event.prototype, 'currentTarget');
+
+ function getCurrentTarget() {
+ var _a;
+
+ return (_a = currentTargets.get(this)) !== null && _a !== void 0 ? _a : null;
+ }
+
+ function defineCurrentTarget(event, getter) {
+ if (currentTargetDescriptor === undefined) return;
+ Object.defineProperty(event, 'currentTarget', {
+ configurable: true,
+ enumerable: true,
+ get: getter !== null && getter !== void 0 ? getter : currentTargetDescriptor.get
+ });
+ }
+
+ const phaseToTypeToElToHandlers = {
+ bubble: {},
+ capture: {}
+ };
+ const typeToWindowEventHandlers = {};
+
+ function createUnifiedHandler() {
+ const delegeteHandler = function (e) {
+ const {
+ type,
+ eventPhase,
+ bubbles
+ } = e;
+ const target = getEventTarget(e);
+ if (eventPhase === 2) return;
+ const phase = eventPhase === 1 ? 'capture' : 'bubble';
+ let cursor = target;
+ const path = []; // collecting bubble path
+
+ while (true) {
+ if (cursor === null) cursor = window;
+ path.push(cursor);
+
+ if (cursor === window) {
+ break;
+ } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+
+ cursor = cursor.parentNode || null;
+ }
+
+ const captureElToHandlers = phaseToTypeToElToHandlers.capture[type];
+ const bubbleElToHandlers = phaseToTypeToElToHandlers.bubble[type];
+ spy(e, 'stopPropagation', trackPropagation);
+ spy(e, 'stopImmediatePropagation', trackImmediate);
+ defineCurrentTarget(e, getCurrentTarget);
+
+ if (phase === 'capture') {
+ if (captureElToHandlers === undefined) return; // capture
+
+ for (let i = path.length - 1; i >= 0; --i) {
+ if (propagationStopped.has(e)) break;
+ const target = path[i];
+ const handlers = captureElToHandlers.get(target);
+
+ if (handlers !== undefined) {
+ currentTargets.set(e, target);
+
+ for (const handler of handlers) {
+ if (immediatePropagationStopped.has(e)) break;
+ handler(e);
+ }
+ }
+
+ if (i === 0 && !bubbles && bubbleElToHandlers !== undefined) {
+ const bubbleHandlers = bubbleElToHandlers.get(target);
+
+ if (bubbleHandlers !== undefined) {
+ for (const handler of bubbleHandlers) {
+ if (immediatePropagationStopped.has(e)) break;
+ handler(e);
+ }
+ }
+ }
+ }
+ } else if (phase === 'bubble') {
+ if (bubbleElToHandlers === undefined) return; // bubble
+
+ for (let i = 0; i < path.length; ++i) {
+ if (propagationStopped.has(e)) break;
+ const target = path[i];
+ const handlers = bubbleElToHandlers.get(target);
+
+ if (handlers !== undefined) {
+ currentTargets.set(e, target);
+
+ for (const handler of handlers) {
+ if (immediatePropagationStopped.has(e)) break;
+ handler(e);
+ }
+ }
+ }
+ }
+
+ unspy(e, 'stopPropagation');
+ unspy(e, 'stopImmediatePropagation');
+ defineCurrentTarget(e);
+ };
+
+ delegeteHandler.displayName = 'evtdUnifiedHandler';
+ return delegeteHandler;
+ }
+
+ function createUnifiedWindowEventHandler() {
+ const delegateHandler = function (e) {
+ const {
+ type,
+ eventPhase
+ } = e;
+ if (eventPhase !== 2) return;
+ const handlers = typeToWindowEventHandlers[type];
+ if (handlers === undefined) return;
+ handlers.forEach(handler => handler(e));
+ };
+
+ delegateHandler.displayName = 'evtdUnifiedWindowEventHandler';
+ return delegateHandler;
+ }
+
+ const unifiedHandler = createUnifiedHandler();
+ const unfiendWindowEventHandler = createUnifiedWindowEventHandler();
+
+ function ensureElToHandlers(phase, type) {
+ const phaseHandlers = phaseToTypeToElToHandlers[phase];
+
+ if (phaseHandlers[type] === undefined) {
+ phaseHandlers[type] = new Map();
+ window.addEventListener(type, unifiedHandler, phase === 'capture');
+ }
+
+ return phaseHandlers[type];
+ }
+
+ function ensureWindowEventHandlers(type) {
+ const windowEventHandlers = typeToWindowEventHandlers[type];
+
+ if (windowEventHandlers === undefined) {
+ typeToWindowEventHandlers[type] = new Set();
+ window.addEventListener(type, unfiendWindowEventHandler);
+ }
+
+ return typeToWindowEventHandlers[type];
+ }
+
+ function ensureHandlers(elToHandlers, el) {
+ let elHandlers = elToHandlers.get(el);
+
+ if (elHandlers === undefined) {
+ elToHandlers.set(el, elHandlers = new Set());
+ }
+
+ return elHandlers;
+ }
+
+ function handlerExist(el, phase, type, handler) {
+ const elToHandlers = phaseToTypeToElToHandlers[phase][type]; // phase ${type} event has handlers
+
+ if (elToHandlers !== undefined) {
+ const handlers = elToHandlers.get(el); // phase using el with ${type} event has handlers
+
+ if (handlers !== undefined) {
+ if (handlers.has(handler)) return true;
+ }
+ }
+
+ return false;
+ }
+
+ function windowEventHandlerExist(type, handler) {
+ const handlers = typeToWindowEventHandlers[type];
+
+ if (handlers !== undefined) {
+ if (handlers.has(handler)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function on(type, el, handler, options) {
+ let mergedHandler;
+
+ if (typeof options === 'object' && options.once === true) {
+ mergedHandler = e => {
+ off(type, el, mergedHandler, options);
+ handler(e);
+ };
+ } else {
+ mergedHandler = handler;
+ }
+
+ const trapped = trapOn(type, el, mergedHandler, options);
+ if (trapped) return;
+ const phase = options === true || typeof options === 'object' && options.capture === true ? 'capture' : 'bubble';
+ const elToHandlers = ensureElToHandlers(phase, type);
+ const handlers = ensureHandlers(elToHandlers, el);
+ if (!handlers.has(mergedHandler)) handlers.add(mergedHandler);
+
+ if (el === window) {
+ const windowEventHandlers = ensureWindowEventHandlers(type);
+
+ if (!windowEventHandlers.has(mergedHandler)) {
+ windowEventHandlers.add(mergedHandler);
+ }
+ }
+ }
+
+ function off(type, el, handler, options) {
+ const trapped = trapOff(type, el, handler, options);
+ if (trapped) return;
+ const capture = options === true || typeof options === 'object' && options.capture === true;
+ const phase = capture ? 'capture' : 'bubble';
+ const elToHandlers = ensureElToHandlers(phase, type);
+ const handlers = ensureHandlers(elToHandlers, el);
+
+ if (el === window) {
+ const mirrorPhase = capture ? 'bubble' : 'capture';
+
+ if (!handlerExist(el, mirrorPhase, type, handler) && windowEventHandlerExist(type, handler)) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const windowEventHandlers = typeToWindowEventHandlers[type];
+ windowEventHandlers.delete(handler);
+
+ if (windowEventHandlers.size === 0) {
+ window.removeEventListener(type, unfiendWindowEventHandler);
+ typeToWindowEventHandlers[type] = undefined;
+ }
+ }
+ }
+
+ if (handlers.has(handler)) handlers.delete(handler);
+
+ if (handlers.size === 0) {
+ elToHandlers.delete(el);
+ }
+
+ if (elToHandlers.size === 0) {
+ window.removeEventListener(type, unifiedHandler, phase === 'capture');
+ phaseToTypeToElToHandlers[phase][type] = undefined;
+ }
+ }
+
+ return {
+ on: on,
+ off: off
+ };
+ }
+
+ const {
+ on,
+ off
+ } = createDelegate();
+
+ const mousePositionRef = vue.ref(null);
+
+ function clickHandler(e) {
+ if (e.clientX > 0 || e.clientY > 0) {
+ mousePositionRef.value = {
+ x: e.clientX,
+ y: e.clientY
+ };
+ } else {
+ // x = 0 & y = 0
+ const {
+ target
+ } = e;
+
+ if (target instanceof Element) {
+ const {
+ left,
+ top,
+ width,
+ height
+ } = target.getBoundingClientRect();
+
+ if (left > 0 || top > 0) {
+ // impossible to be triggered by real click
+ mousePositionRef.value = {
+ x: left + width / 2,
+ y: top + height / 2
+ };
+ } else {
+ mousePositionRef.value = {
+ x: 0,
+ y: 0
+ };
+ }
+ } else {
+ mousePositionRef.value = null;
+ }
+ }
+ }
+
+ let usedCount$2 = 0;
+ let managable$2 = true;
+ function useClickPosition() {
+ if (!isBrowser$1) return vue.readonly(vue.ref(null));
+ if (usedCount$2 === 0) on('click', document, clickHandler, true);
+
+ const setup = () => {
+ usedCount$2 += 1;
+ };
+
+ if (managable$2 && (managable$2 = hasInstance())) {
+ vue.onBeforeMount(setup);
+ vue.onBeforeUnmount(() => {
+ usedCount$2 -= 1;
+ if (usedCount$2 === 0) off('click', document, clickHandler, true);
+ });
+ } else {
+ setup();
+ }
+
+ return vue.readonly(mousePositionRef);
+ }
+
+ const clickedTimeRef = vue.ref(undefined);
+ let usedCount$1 = 0;
+
+ function handleClick() {
+ clickedTimeRef.value = Date.now();
+ }
+
+ let managable$1 = true;
+ function useClicked(timeout) {
+ if (!isBrowser$1) return vue.readonly(vue.ref(false));
+ const clickedRef = vue.ref(false);
+ let timerId = null;
+
+ function clearTimer() {
+ if (timerId !== null) window.clearTimeout(timerId);
+ }
+
+ function clickedHandler() {
+ clearTimer();
+ clickedRef.value = true;
+ timerId = window.setTimeout(() => {
+ clickedRef.value = false;
+ }, timeout);
+ }
+
+ if (usedCount$1 === 0) {
+ on('click', window, handleClick, true);
+ }
+
+ const setup = () => {
+ usedCount$1 += 1;
+ on('click', window, clickedHandler, true);
+ };
+
+ if (managable$1 && (managable$1 = hasInstance())) {
+ vue.onBeforeMount(setup);
+ vue.onBeforeUnmount(() => {
+ usedCount$1 -= 1;
+
+ if (usedCount$1 === 0) {
+ off('click', window, handleClick, true);
+ }
+
+ off('click', window, clickedHandler, true);
+ clearTimer();
+ });
+ } else {
+ setup();
+ }
+
+ return vue.readonly(clickedRef);
+ }
+
+ /* eslint-disable @typescript-eslint/strict-boolean-expressions */
+ let usedCount = 0; // Mql means media query list
+
+ const supportMatchMedia = typeof window !== 'undefined' && window.matchMedia !== undefined;
+ const osTheme = vue.ref(null);
+ let darkMql;
+ let lightMql;
+
+ function handleDarkMqlChange(e) {
+ if (e.matches) {
+ osTheme.value = 'dark';
+ }
+ }
+
+ function handleLightMqlChange(e) {
+ if (e.matches) {
+ osTheme.value = 'light';
+ }
+ }
+
+ function init() {
+ darkMql = window.matchMedia('(prefers-color-scheme: dark)');
+ lightMql = window.matchMedia('(prefers-color-scheme: light)');
+
+ if (darkMql.matches) {
+ osTheme.value = 'dark';
+ } else if (lightMql.matches) {
+ osTheme.value = 'light';
+ } else {
+ osTheme.value = null;
+ }
+
+ if (darkMql.addEventListener) {
+ darkMql.addEventListener('change', handleDarkMqlChange);
+ lightMql.addEventListener('change', handleLightMqlChange);
+ } else if (darkMql.addListener) {
+ darkMql.addListener(handleDarkMqlChange);
+ lightMql.addListener(handleLightMqlChange);
+ }
+ }
+
+ function clean() {
+ if ('removeEventListener' in darkMql) {
+ darkMql.removeEventListener('change', handleDarkMqlChange);
+ lightMql.removeEventListener('change', handleLightMqlChange);
+ } else if ('removeListener' in darkMql) {
+ darkMql.removeListener(handleDarkMqlChange);
+ lightMql.removeListener(handleLightMqlChange);
+ }
+
+ darkMql = undefined;
+ lightMql = undefined;
+ }
+
+ let managable = true;
+ function useOsTheme() {
+ /* istanbul ignore next */
+ if (!supportMatchMedia) {
+ return vue.readonly(osTheme);
+ }
+
+ if (usedCount === 0) init();
+
+ if (managable && (managable = hasInstance())) {
+ vue.onBeforeMount(() => {
+ usedCount += 1;
+ });
+ vue.onBeforeUnmount(() => {
+ usedCount -= 1;
+ if (usedCount === 0) clean();
+ });
+ }
+
+ return vue.readonly(osTheme);
+ }
+
+ function useMergedState(controlledStateRef, uncontrolledStateRef) {
+ vue.watch(controlledStateRef, value => {
+ if (value !== undefined) {
+ uncontrolledStateRef.value = value;
+ }
+ });
+ return vue.computed(() => {
+ if (controlledStateRef.value === undefined) {
+ return uncontrolledStateRef.value;
+ }
+
+ return controlledStateRef.value;
+ });
+ }
+
+ function isMounted() {
+ const isMounted = vue.ref(false);
+ vue.onMounted(() => {
+ isMounted.value = true;
+ });
+ return vue.readonly(isMounted);
+ }
+
+ function useCompitable(reactive, keys) {
+ // @ts-expect-error
+ return vue.computed(() => {
+ for (const key of keys) {
+ if (reactive[key] !== undefined) return reactive[key];
+ }
+
+ return reactive[keys[keys.length - 1]];
+ });
+ }
+
+ const isIos = (typeof window === 'undefined' ? false : /iPad|iPhone|iPod/.test(navigator.platform) || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) && // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ !window.MSStream;
+ function useIsIos() {
+ return isIos;
+ }
+
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
+ const defaultBreakpointOptions = {
+ // mobile
+ // 0 ~ 640 doesn't mean it should display well in all the range,
+ // but means you should treat it like a mobile phone.)
+ xs: 0,
+ s: 640,
+ m: 1024,
+ l: 1280,
+ xl: 1536,
+ '2xl': 1920 // normal desktop display
+
+ };
+
+ function createMediaQuery(screenWidth) {
+ return `(min-width: ${screenWidth}px)`;
+ }
+
+ const mqlMap = {};
+
+ function useBreakpoints() {
+ let screens = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultBreakpointOptions;
+ if (!isBrowser$1) return vue.computed(() => []); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ if (typeof window.matchMedia !== 'function') return vue.computed(() => []);
+ const breakpointStatusRef = vue.ref({});
+ const breakpoints = Object.keys(screens);
+
+ const updateBreakpoints = (e, breakpointName) => {
+ if (e.matches) breakpointStatusRef.value[breakpointName] = true;else breakpointStatusRef.value[breakpointName] = false;
+ };
+
+ breakpoints.forEach(key => {
+ const breakpointValue = screens[key];
+ let mql;
+ let cbs;
+
+ if (mqlMap[breakpointValue] === undefined) {
+ mql = window.matchMedia(createMediaQuery(breakpointValue)); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ if (mql.addEventListener) {
+ mql.addEventListener('change', e => {
+ cbs.forEach(cb => {
+ cb(e, key);
+ });
+ }); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+ } else if (mql.addListener) {
+ mql.addListener(e => {
+ cbs.forEach(cb => {
+ cb(e, key);
+ });
+ });
+ }
+
+ cbs = new Set();
+ mqlMap[breakpointValue] = {
+ mql,
+ cbs
+ };
+ } else {
+ mql = mqlMap[breakpointValue].mql;
+ cbs = mqlMap[breakpointValue].cbs;
+ }
+
+ cbs.add(updateBreakpoints);
+
+ if (mql.matches) {
+ cbs.forEach(cb => {
+ cb(mql, key);
+ });
+ }
+ });
+ vue.onBeforeUnmount(() => {
+ breakpoints.forEach(breakpoint => {
+ const {
+ cbs
+ } = mqlMap[screens[breakpoint]];
+
+ if (cbs.has(updateBreakpoints)) {
+ cbs.delete(updateBreakpoints);
+ }
+ });
+ });
+ return vue.computed(() => {
+ const {
+ value
+ } = breakpointStatusRef;
+ return breakpoints.filter(key => value[key]);
+ });
+ }
+
+ function useKeyboard$1() {
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ let enabledRef = arguments.length > 1 ? arguments[1] : undefined;
+ const state = vue.reactive({
+ ctrl: false,
+ command: false,
+ win: false,
+ shift: false,
+ tab: false
+ });
+ const {
+ keydown,
+ keyup
+ } = options;
+
+ const keydownHandler = e => {
+ switch (e.key) {
+ case 'Control':
+ state.ctrl = true;
+ break;
+
+ case 'Meta':
+ state.command = true;
+ state.win = true;
+ break;
+
+ case 'Shift':
+ state.shift = true;
+ break;
+
+ case 'Tab':
+ state.tab = true;
+ break;
+ }
+
+ if (keydown !== undefined) {
+ Object.keys(keydown).forEach(key => {
+ if (key !== e.key) return;
+ const handler = keydown[key];
+
+ if (typeof handler === 'function') {
+ handler(e);
+ } else {
+ const {
+ stop = false,
+ prevent = false
+ } = handler;
+ if (stop) e.stopPropagation();
+ if (prevent) e.preventDefault();
+ handler.handler(e);
+ }
+ });
+ }
+ };
+
+ const keyupHandler = e => {
+ switch (e.key) {
+ case 'Control':
+ state.ctrl = false;
+ break;
+
+ case 'Meta':
+ state.command = false;
+ state.win = false;
+ break;
+
+ case 'Shift':
+ state.shift = false;
+ break;
+
+ case 'Tab':
+ state.tab = false;
+ break;
+ }
+
+ if (keyup !== undefined) {
+ Object.keys(keyup).forEach(key => {
+ if (key !== e.key) return;
+ const handler = keyup[key];
+
+ if (typeof handler === 'function') {
+ handler(e);
+ } else {
+ const {
+ stop = false,
+ prevent = false
+ } = handler;
+ if (stop) e.stopPropagation();
+ if (prevent) e.preventDefault();
+ handler.handler(e);
+ }
+ });
+ }
+ };
+
+ const setup = () => {
+ if (enabledRef === undefined || enabledRef.value) {
+ on('keydown', document, keydownHandler);
+ on('keyup', document, keyupHandler);
+ }
+
+ if (enabledRef !== undefined) {
+ vue.watch(enabledRef, value => {
+ if (value) {
+ on('keydown', document, keydownHandler);
+ on('keyup', document, keyupHandler);
+ } else {
+ off('keydown', document, keydownHandler);
+ off('keyup', document, keyupHandler);
+ }
+ });
+ }
+ };
+
+ if (hasInstance()) {
+ vue.onBeforeMount(setup);
+ vue.onBeforeUnmount(() => {
+ if (enabledRef === undefined || enabledRef.value) {
+ off('keydown', document, keydownHandler);
+ off('keyup', document, keyupHandler);
+ }
+ });
+ } else {
+ setup();
+ }
+
+ return vue.readonly(state);
+ }
+
+ const internalSelectionMenuInjectionKey = createInjectionKey("n-internal-select-menu");
+ const internalSelectionMenuBodyInjectionKey = createInjectionKey("n-internal-select-menu-body");
+
+ const modalBodyInjectionKey = createInjectionKey("n-modal-body");
+ const modalInjectionKey = createInjectionKey("n-modal");
+
+ const drawerBodyInjectionKey = createInjectionKey("n-drawer-body");
+ const drawerInjectionKey = createInjectionKey("n-drawer");
+
+ const popoverBodyInjectionKey = createInjectionKey("n-popover-body");
+
+ const teleportDisabled = "__disabled__";
+
+ function useAdjustedTo(props) {
+ const modal = vue.inject(modalBodyInjectionKey, null);
+ const drawer = vue.inject(drawerBodyInjectionKey, null);
+ const popover = vue.inject(popoverBodyInjectionKey, null);
+ const selectMenu = vue.inject(internalSelectionMenuBodyInjectionKey, null);
+ const fullscreenElementRef = vue.ref();
+
+ if (typeof document !== "undefined") {
+ fullscreenElementRef.value = document.fullscreenElement;
+
+ const handleFullscreenChange = () => {
+ fullscreenElementRef.value = document.fullscreenElement;
+ };
+
+ vue.onMounted(() => {
+ on("fullscreenchange", document, handleFullscreenChange);
+ });
+ vue.onBeforeUnmount(() => {
+ off("fullscreenchange", document, handleFullscreenChange);
+ });
+ }
+
+ return useMemo(() => {
+ const {
+ to
+ } = props;
+
+ if (to !== void 0) {
+ if (to === false) return teleportDisabled;
+ if (to === true) return fullscreenElementRef.value || "body";
+ return to;
+ }
+
+ if (modal?.value) {
+ return modal.value.$el ?? modal.value;
+ }
+
+ if (drawer?.value) return drawer.value;
+ if (popover?.value) return popover.value;
+ if (selectMenu?.value) return selectMenu.value;
+ return to ?? (fullscreenElementRef.value || "body");
+ });
+ }
+
+ useAdjustedTo.tdkey = teleportDisabled;
+ useAdjustedTo.propTo = {
+ type: [String, Object, Boolean],
+ default: void 0
+ };
+
+ let houdiniRegistered = false;
+ function useHoudini() {
+ if (!isBrowser$2) return;
+ if (!window.CSS) return;
+
+ if (!houdiniRegistered) {
+ houdiniRegistered = true;
+
+ if ("registerProperty" in window?.CSS) {
+ try {
+ ;
+ CSS.registerProperty({
+ name: "--n-color-start",
+ syntax: "",
+ inherits: false,
+ initialValue: "#0000"
+ });
+ CSS.registerProperty({
+ name: "--n-color-end",
+ syntax: "",
+ inherits: false,
+ initialValue: "#0000"
+ });
+ } catch (e) {}
+ }
+ }
+ }
+
+ function getSlot(scope, slots) {
+ let slotName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';
+ const slot = slots[slotName];
+
+ if (slot === undefined) {
+ throw new Error(`[vueuc/${scope}]: slot[${slotName}] is empty.`);
+ }
+
+ return slot();
+ } // o(n) flatten
+
+ function flatten$2(vNodes) {
+ let filterCommentNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ let result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
+ vNodes.forEach(vNode => {
+ if (vNode === null) return;
+
+ if (typeof vNode !== 'object') {
+ if (typeof vNode === 'string' || typeof vNode === 'number') {
+ result.push(vue.createTextVNode(String(vNode)));
+ }
+
+ return;
+ }
+
+ if (Array.isArray(vNode)) {
+ flatten$2(vNode, filterCommentNode, result);
+ return;
+ }
+
+ if (vNode.type === vue.Fragment) {
+ if (vNode.children === null) return;
+
+ if (Array.isArray(vNode.children)) {
+ flatten$2(vNode.children, filterCommentNode, result);
+ } // rawSlot
+
+ } else if (vNode.type !== vue.Comment) {
+ result.push(vNode);
+ }
+ });
+ return result;
+ }
+ function getFirstVNode(scope, slots) {
+ let slotName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';
+ const slot = slots[slotName];
+
+ if (slot === undefined) {
+ throw new Error(`[vueuc/${scope}]: slot[${slotName}] is empty.`);
+ }
+
+ const content = flatten$2(slot()); // vue will normalize the slot, so slot must be an array
+
+ if (content.length === 1) {
+ return content[0];
+ } else {
+ throw new Error(`[vueuc/${scope}]: slot[${slotName}] should have exactly one child.`);
+ }
+ }
+
+ let viewMeasurer = null;
+ function ensureViewBoundingRect() {
+ if (viewMeasurer === null) {
+ viewMeasurer = document.getElementById('v-binder-view-measurer');
+
+ if (viewMeasurer === null) {
+ viewMeasurer = document.createElement('div');
+ viewMeasurer.id = 'v-binder-view-measurer';
+ const {
+ style
+ } = viewMeasurer;
+ style.position = 'fixed';
+ style.left = '0';
+ style.right = '0';
+ style.top = '0';
+ style.bottom = '0';
+ style.pointerEvents = 'none';
+ style.visibility = 'hidden';
+ document.body.appendChild(viewMeasurer);
+ }
+ }
+
+ return viewMeasurer.getBoundingClientRect();
+ }
+ function getPointRect(x, y) {
+ const viewRect = ensureViewBoundingRect();
+ return {
+ top: y,
+ left: x,
+ height: 0,
+ width: 0,
+ right: viewRect.width - x,
+ bottom: viewRect.height - y
+ };
+ }
+ function getRect$1(el) {
+ const elRect = el.getBoundingClientRect();
+ const viewRect = ensureViewBoundingRect();
+ return {
+ left: elRect.left - viewRect.left,
+ top: elRect.top - viewRect.top,
+ bottom: viewRect.height + viewRect.top - elRect.bottom,
+ right: viewRect.width + viewRect.left - elRect.right,
+ width: elRect.width,
+ height: elRect.height
+ };
+ }
+ function getParentNode(node) {
+ // document type
+ if (node.nodeType === 9) {
+ return null;
+ }
+
+ return node.parentNode;
+ }
+ function getScrollParent(node) {
+ if (node === null) return null;
+ const parentNode = getParentNode(node);
+
+ if (parentNode === null) {
+ return null;
+ } // Document
+
+
+ if (parentNode.nodeType === 9) {
+ return document;
+ } // Element
+
+
+ if (parentNode.nodeType === 1) {
+ // Firefox want us to check `-x` and `-y` variations as well
+ const {
+ overflow,
+ overflowX,
+ overflowY
+ } = getComputedStyle(parentNode);
+
+ if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
+ return parentNode;
+ }
+ }
+
+ return getScrollParent(parentNode);
+ }
+
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
+ const Binder = vue.defineComponent({
+ name: 'Binder',
+ props: {
+ syncTargetWithParent: Boolean,
+ syncTarget: {
+ type: Boolean,
+ default: true
+ }
+ },
+
+ setup(props) {
+ var _a;
+
+ vue.provide('VBinder', (_a = vue.getCurrentInstance()) === null || _a === void 0 ? void 0 : _a.proxy);
+ const VBinder = vue.inject('VBinder', null);
+ const targetRef = vue.ref(null);
+ /**
+ * If there's no nested vbinder, we can simply set the target ref.
+ *
+ * However, when it comes to:
+ * <- syncTarget = false
+ *
+ * Should hold target DOM ref, but can't get it directly from
+ * its VTarget. So if there are nested VBinder, we should:
+ * 1. Stop setting target DOM from level-1 VTarget
+ * 2. Set target DOM from level-2 VTarget
+ * For (1), we need `syncTarget` to `false`
+ * For (2), we need to set `syncTargetWithParent` to `true` on
+ * level-2 VBinder
+ *
+ * <- syncTargetWithParent = true
+ * target
+ *
+ *
+ * content1
+ *
+ *
+ *
+ * content2
+ *
+ *
+ */
+
+ const setTargetRef = el => {
+ targetRef.value = el; // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
+
+ if (VBinder && props.syncTargetWithParent) {
+ VBinder.setTargetRef(el);
+ }
+ }; // scroll related
+
+
+ let scrollableNodes = [];
+
+ const ensureScrollListener = () => {
+ let cursor = targetRef.value;
+
+ while (true) {
+ cursor = getScrollParent(cursor);
+ if (cursor === null) break;
+ scrollableNodes.push(cursor);
+ }
+
+ for (const el of scrollableNodes) {
+ on('scroll', el, onScroll, true);
+ }
+ };
+
+ const removeScrollListeners = () => {
+ for (const el of scrollableNodes) {
+ off('scroll', el, onScroll, true);
+ }
+
+ scrollableNodes = [];
+ };
+
+ const followerScrollListeners = new Set();
+
+ const addScrollListener = listener => {
+ if (followerScrollListeners.size === 0) {
+ ensureScrollListener();
+ }
+
+ if (!followerScrollListeners.has(listener)) {
+ followerScrollListeners.add(listener);
+ }
+ };
+
+ const removeScrollListener = listener => {
+ if (followerScrollListeners.has(listener)) {
+ followerScrollListeners.delete(listener);
+ }
+
+ if (followerScrollListeners.size === 0) {
+ removeScrollListeners();
+ }
+ };
+
+ const onScroll = () => {
+ beforeNextFrameOnce(onScrollRaf);
+ };
+
+ const onScrollRaf = () => {
+ followerScrollListeners.forEach(listener => listener());
+ }; // resize related
+
+
+ const followerResizeListeners = new Set();
+
+ const addResizeListener = listener => {
+ if (followerResizeListeners.size === 0) {
+ on('resize', window, onResize);
+ }
+
+ if (!followerResizeListeners.has(listener)) {
+ followerResizeListeners.add(listener);
+ }
+ };
+
+ const removeResizeListener = listener => {
+ if (followerResizeListeners.has(listener)) {
+ followerResizeListeners.delete(listener);
+ }
+
+ if (followerResizeListeners.size === 0) {
+ off('resize', window, onResize);
+ }
+ };
+
+ const onResize = () => {
+ followerResizeListeners.forEach(listener => listener());
+ };
+
+ vue.onBeforeUnmount(() => {
+ off('resize', window, onResize);
+ removeScrollListeners();
+ });
+ return {
+ targetRef,
+ setTargetRef,
+ addScrollListener,
+ removeScrollListener,
+ addResizeListener,
+ removeResizeListener
+ };
+ },
+
+ render() {
+ return getSlot('binder', this.$slots);
+ }
+
+ });
+ var VBinder = Binder;
+
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
+ var VTarget = vue.defineComponent({
+ name: 'Target',
+
+ setup() {
+ const {
+ setTargetRef,
+ syncTarget
+ } = vue.inject('VBinder');
+ const setTargetDirective = {
+ mounted: setTargetRef,
+ updated: setTargetRef
+ };
+ return {
+ syncTarget,
+ setTargetDirective
+ };
+ },
+
+ render() {
+ const {
+ syncTarget,
+ setTargetDirective
+ } = this;
+ /**
+ * If you are using VBinder as a child of VBinder, the children wouldn't be
+ * a valid DOM or component that can be attached to by directive.
+ * So we won't sync target on those kind of situation and control the
+ * target sync logic manually.
+ */
+
+ if (syncTarget) {
+ return vue.withDirectives(getFirstVNode('follower', this.$slots), [[setTargetDirective]]);
+ }
+
+ return getFirstVNode('follower', this.$slots);
+ }
+
+ });
+
+ const ctxKey$1 = '@@mmoContext';
+ const mousemoveoutside = {
+ mounted(el, _ref) {
+ let {
+ value
+ } = _ref;
+ el[ctxKey$1] = {
+ handler: undefined
+ };
+
+ if (typeof value === 'function') {
+ el[ctxKey$1].handler = value;
+ on('mousemoveoutside', el, value);
+ }
+ },
+
+ updated(el, _ref2) {
+ let {
+ value
+ } = _ref2;
+ const ctx = el[ctxKey$1];
+
+ if (typeof value === 'function') {
+ if (ctx.handler) {
+ if (ctx.handler !== value) {
+ off('mousemoveoutside', el, ctx.handler);
+ ctx.handler = value;
+ on('mousemoveoutside', el, value);
+ }
+ } else {
+ el[ctxKey$1].handler = value;
+ on('mousemoveoutside', el, value);
+ }
+ } else {
+ if (ctx.handler) {
+ off('mousemoveoutside', el, ctx.handler);
+ ctx.handler = undefined;
+ }
+ }
+ },
+
+ unmounted(el) {
+ const {
+ handler
+ } = el[ctxKey$1];
+
+ if (handler) {
+ off('mousemoveoutside', el, handler);
+ }
+
+ el[ctxKey$1].handler = undefined;
+ }
+
+ };
+ var mousemoveoutside$1 = mousemoveoutside;
+
+ const ctxKey = '@@coContext';
+ const clickoutside = {
+ mounted(el, _ref) {
+ let {
+ value,
+ modifiers
+ } = _ref;
+ el[ctxKey] = {
+ handler: undefined
+ };
+
+ if (typeof value === 'function') {
+ el[ctxKey].handler = value;
+ on('clickoutside', el, value, {
+ capture: modifiers.capture
+ });
+ }
+ },
+
+ updated(el, _ref2) {
+ let {
+ value,
+ modifiers
+ } = _ref2;
+ const ctx = el[ctxKey];
+
+ if (typeof value === 'function') {
+ if (ctx.handler) {
+ if (ctx.handler !== value) {
+ off('clickoutside', el, ctx.handler, {
+ capture: modifiers.capture
+ });
+ ctx.handler = value;
+ on('clickoutside', el, value, {
+ capture: modifiers.capture
+ });
+ }
+ } else {
+ el[ctxKey].handler = value;
+ on('clickoutside', el, value, {
+ capture: modifiers.capture
+ });
+ }
+ } else {
+ if (ctx.handler) {
+ off('clickoutside', el, ctx.handler, {
+ capture: modifiers.capture
+ });
+ ctx.handler = undefined;
+ }
+ }
+ },
+
+ unmounted(el, _ref3) {
+ let {
+ modifiers
+ } = _ref3;
+ const {
+ handler
+ } = el[ctxKey];
+
+ if (handler) {
+ off('clickoutside', el, handler, {
+ capture: modifiers.capture
+ });
+ }
+
+ el[ctxKey].handler = undefined;
+ }
+
+ };
+ var clickoutside$1 = clickoutside;
+
+ function warn$1(location, message) {
+ console.error(`[vdirs/${location}]: ${message}`);
+ }
+
+ class ZIndexManager {
+ constructor() {
+ this.elementZIndex = new Map();
+ this.nextZIndex = 2000;
+ }
+
+ get elementCount() {
+ return this.elementZIndex.size;
+ }
+
+ ensureZIndex(el, zIndex) {
+ const {
+ elementZIndex
+ } = this;
+
+ if (zIndex !== undefined) {
+ el.style.zIndex = `${zIndex}`;
+ elementZIndex.delete(el);
+ return;
+ }
+
+ const {
+ nextZIndex
+ } = this;
+
+ if (elementZIndex.has(el)) {
+ const currentZIndex = elementZIndex.get(el);
+ if (currentZIndex + 1 === this.nextZIndex) return;
+ }
+
+ el.style.zIndex = `${nextZIndex}`;
+ elementZIndex.set(el, nextZIndex);
+ this.nextZIndex = nextZIndex + 1;
+ this.squashState();
+ }
+
+ unregister(el, zIndex) {
+ const {
+ elementZIndex
+ } = this;
+
+ if (elementZIndex.has(el)) {
+ elementZIndex.delete(el);
+ } else if (zIndex === undefined) {
+ warn$1('z-index-manager/unregister-element', 'Element not found when unregistering.');
+ }
+
+ this.squashState();
+ }
+
+ squashState() {
+ const {
+ elementCount
+ } = this;
+
+ if (!elementCount) {
+ this.nextZIndex = 2000;
+ }
+
+ if (this.nextZIndex - elementCount > 2500) this.rearrange();
+ }
+
+ rearrange() {
+ const elementZIndexPair = Array.from(this.elementZIndex.entries());
+ elementZIndexPair.sort((pair1, pair2) => {
+ return pair1[1] - pair2[1];
+ });
+ this.nextZIndex = 2000;
+ elementZIndexPair.forEach(pair => {
+ const el = pair[0];
+ const zIndex = this.nextZIndex++;
+ if (`${zIndex}` !== el.style.zIndex) el.style.zIndex = `${zIndex}`;
+ });
+ }
+
+ }
+
+ var zIndexManager = new ZIndexManager();
+
+ const ctx = '@@ziContext'; // We don't expect manually bound zindex should be changed
+
+ const zindexable = {
+ mounted(el, bindings) {
+ const {
+ value = {}
+ } = bindings;
+ const {
+ zIndex,
+ enabled
+ } = value;
+ el[ctx] = {
+ enabled: !!enabled,
+ initialized: false
+ };
+
+ if (enabled) {
+ zIndexManager.ensureZIndex(el, zIndex);
+ el[ctx].initialized = true;
+ }
+ },
+
+ updated(el, bindings) {
+ const {
+ value = {}
+ } = bindings;
+ const {
+ zIndex,
+ enabled
+ } = value;
+ const cachedEnabled = el[ctx].enabled;
+
+ if (enabled && !cachedEnabled) {
+ zIndexManager.ensureZIndex(el, zIndex);
+ el[ctx].initialized = true;
+ }
+
+ el[ctx].enabled = !!enabled;
+ },
+
+ unmounted(el, bindings) {
+ if (!el[ctx].initialized) return;
+ const {
+ value = {}
+ } = bindings;
+ const {
+ zIndex
+ } = value;
+ zIndexManager.unregister(el, zIndex);
+ }
+
+ };
+ var zindexable$1 = zindexable;
+
+ const ssrContextKey = Symbol('@css-render/vue3-ssr');
+
+ function createStyleString(id, style) {
+ return ``;
+ }
+
+ function ssrAdapter(id, style) {
+ const ssrContext = vue.inject(ssrContextKey, null);
+
+ if (ssrContext === null) {
+ console.error('[css-render/vue3-ssr]: no ssr context found.');
+ return;
+ }
+
+ const {
+ styles,
+ ids
+ } = ssrContext; // we need to impl other options to make it behaves the same as the client side
+
+ if (ids.has(id)) return;
+
+ if (styles !== null) {
+ ids.add(id);
+ styles.push(createStyleString(id, style));
+ }
+ }
+
+ const isBrowser = typeof document !== 'undefined';
+ function useSsrAdapter() {
+ if (isBrowser) return undefined;
+ const context = vue.inject(ssrContextKey, null);
+ if (context === null) return undefined;
+ return {
+ adapter: ssrAdapter,
+ context
+ };
+ }
+
+ function warn(location, message) {
+ console.error(`[vueuc/${location}]: ${message}`);
+ }
+
+ const {
+ c
+ } = CssRender();
+ const cssrAnchorMetaName$1 = 'vueuc-style';
+
+ function lowBit(n) {
+ return n & -n;
+ }
+
+ class FinweckTree {
+ /**
+ * @param l length of the array
+ * @param min min value of the array
+ */
+ constructor(l, min) {
+ this.l = l;
+ this.min = min;
+ const ft = new Array(l + 1);
+
+ for (let i = 0; i < l + 1; ++i) {
+ ft[i] = 0;
+ }
+
+ this.ft = ft;
+ }
+ /**
+ * Add arr[i] by n, start from 0
+ * @param i the index of the element to be added
+ * @param n the value to be added
+ */
+
+
+ add(i, n) {
+ if (n === 0) return;
+ const {
+ l,
+ ft
+ } = this;
+ i += 1;
+
+ while (i <= l) {
+ ft[i] += n;
+ i += lowBit(i);
+ }
+ }
+ /**
+ * Get the value of index i
+ * @param i index
+ * @returns value of the index
+ */
+
+
+ get(i) {
+ return this.sum(i + 1) - this.sum(i);
+ }
+ /**
+ * Get the sum of first i elements
+ * @param i count of head elements to be added
+ * @returns the sum of first i elements
+ */
+
+
+ sum(i) {
+ if (i === undefined) i = this.l;
+ if (i <= 0) return 0;
+ const {
+ ft,
+ min,
+ l
+ } = this;
+ if (i > l) throw new Error('[FinweckTree.sum]: `i` is larger than length.');
+ let ret = i * min;
+
+ while (i > 0) {
+ ret += ft[i];
+ i -= lowBit(i);
+ }
+
+ return ret;
+ }
+ /**
+ * Get the largest count of head elements whose sum are <= threshold
+ * @param threshold
+ * @returns the largest count of head elements whose sum are <= threshold
+ */
+
+
+ getBound(threshold) {
+ let l = 0;
+ let r = this.l;
+
+ while (r > l) {
+ const m = Math.floor((l + r) / 2);
+ const sumM = this.sum(m);
+
+ if (sumM > threshold) {
+ r = m;
+ continue;
+ } else if (sumM < threshold) {
+ if (l === m) {
+ if (this.sum(l + 1) <= threshold) return l + 1;
+ return m;
+ }
+
+ l = m;
+ } else {
+ return m;
+ }
+ }
+
+ return l;
+ }
+
+ }
+
+ function resolveTo(selector) {
+ if (typeof selector === 'string') {
+ return document.querySelector(selector);
+ }
+
+ return selector();
+ }
+
+ var LazyTeleport = vue.defineComponent({
+ name: 'LazyTeleport',
+ props: {
+ to: {
+ type: [String, Object],
+ default: undefined
+ },
+ disabled: Boolean,
+ show: {
+ type: Boolean,
+ required: true
+ }
+ },
+
+ setup(props) {
+ return {
+ showTeleport: useFalseUntilTruthy(vue.toRef(props, 'show')),
+ mergedTo: vue.computed(() => {
+ const {
+ to
+ } = props;
+ return to !== null && to !== void 0 ? to : 'body';
+ })
+ };
+ },
+
+ render() {
+ return this.showTeleport ? this.disabled ? getSlot('lazy-teleport', this.$slots) : vue.h(vue.Teleport, {
+ disabled: this.disabled,
+ to: this.mergedTo
+ }, getSlot('lazy-teleport', this.$slots)) : null;
+ }
+
+ });
+
+ const oppositionPositions = {
+ top: 'bottom',
+ bottom: 'top',
+ left: 'right',
+ right: 'left'
+ };
+ const oppositeAligns = {
+ start: 'end',
+ center: 'center',
+ end: 'start'
+ };
+ const propToCompare = {
+ top: 'height',
+ bottom: 'height',
+ left: 'width',
+ right: 'width'
+ };
+ const transformOrigins = {
+ 'bottom-start': 'top left',
+ bottom: 'top center',
+ 'bottom-end': 'top right',
+ 'top-start': 'bottom left',
+ top: 'bottom center',
+ 'top-end': 'bottom right',
+ 'right-start': 'top left',
+ right: 'center left',
+ 'right-end': 'bottom left',
+ 'left-start': 'top right',
+ left: 'center right',
+ 'left-end': 'bottom right'
+ };
+ const overlapTransformOrigin = {
+ 'bottom-start': 'bottom left',
+ bottom: 'bottom center',
+ 'bottom-end': 'bottom right',
+ 'top-start': 'top left',
+ top: 'top center',
+ 'top-end': 'top right',
+ 'right-start': 'top right',
+ right: 'center right',
+ 'right-end': 'bottom right',
+ 'left-start': 'top left',
+ left: 'center left',
+ 'left-end': 'bottom left'
+ };
+ const oppositeAlignCssPositionProps = {
+ 'bottom-start': 'right',
+ 'bottom-end': 'left',
+ 'top-start': 'right',
+ 'top-end': 'left',
+ 'right-start': 'bottom',
+ 'right-end': 'top',
+ 'left-start': 'bottom',
+ 'left-end': 'top'
+ };
+ const keepOffsetDirection = {
+ top: true,
+ bottom: false,
+ left: true,
+ right: false // left--
+
+ };
+ const cssPositionToOppositeAlign = {
+ top: 'end',
+ bottom: 'start',
+ left: 'end',
+ right: 'start'
+ };
+ function getPlacementAndOffsetOfFollower(placement, targetRect, followerRect, shift, flip, overlap) {
+ if (!flip || overlap) {
+ return {
+ placement: placement,
+ top: 0,
+ left: 0
+ };
+ }
+
+ const [position, align] = placement.split('-');
+ let properAlign = align !== null && align !== void 0 ? align : 'center';
+ let properOffset = {
+ top: 0,
+ left: 0
+ };
+
+ const deriveOffset = (oppositeAlignCssSizeProp, alignCssPositionProp, offsetVertically) => {
+ let left = 0;
+ let top = 0;
+ const diff = followerRect[oppositeAlignCssSizeProp] - targetRect[alignCssPositionProp] - targetRect[oppositeAlignCssSizeProp];
+
+ if (diff > 0 && shift) {
+ if (offsetVertically) {
+ // screen border
+ // |-----------------------------------------|
+ // | | f | |
+ // | | o | |
+ // | | l | |
+ // | | l |---- |
+ // | | o |tar | |
+ // | | w |get | |
+ // | | e | | |
+ // | | r |---- |
+ // | ---- |
+ // |-----------------------------------------|
+ top = keepOffsetDirection[alignCssPositionProp] ? diff : -diff;
+ } else {
+ // screen border
+ // |----------------------------------------|
+ // | |
+ // | ---------- |
+ // | | target | |
+ // | ----------------------------------
+ // | | follower |
+ // | ----------------------------------
+ // | |
+ // |----------------------------------------|
+ left = keepOffsetDirection[alignCssPositionProp] ? diff : -diff;
+ }
+ }
+
+ return {
+ left,
+ top
+ };
+ };
+
+ const offsetVertically = position === 'left' || position === 'right'; // choose proper placement for non-center align
+
+ if (properAlign !== 'center') {
+ const oppositeAlignCssPositionProp = oppositeAlignCssPositionProps[placement];
+ const currentAlignCssPositionProp = oppositionPositions[oppositeAlignCssPositionProp];
+ const oppositeAlignCssSizeProp = propToCompare[oppositeAlignCssPositionProp]; // if follower rect is larger than target rect in align direction
+ // ----------[ target ]---------|
+ // ----------[ follower ]
+
+ if (followerRect[oppositeAlignCssSizeProp] > targetRect[oppositeAlignCssSizeProp]) {
+ if ( // current space is not enough
+ // ----------[ target ]---------|
+ // -------[ follower ]
+ targetRect[oppositeAlignCssPositionProp] + targetRect[oppositeAlignCssSizeProp] < followerRect[oppositeAlignCssSizeProp]) {
+ const followerOverTargetSize = (followerRect[oppositeAlignCssSizeProp] - targetRect[oppositeAlignCssSizeProp]) / 2;
+
+ if (targetRect[oppositeAlignCssPositionProp] < followerOverTargetSize || targetRect[currentAlignCssPositionProp] < followerOverTargetSize) {
+ // opposite align has larger space
+ // -------[ target ]-----------|
+ // -------[ follower ]-|
+ if (targetRect[oppositeAlignCssPositionProp] < targetRect[currentAlignCssPositionProp]) {
+ properAlign = oppositeAligns[align];
+ properOffset = deriveOffset(oppositeAlignCssSizeProp, currentAlignCssPositionProp, offsetVertically);
+ } else {
+ // ----------------[ target ]----|
+ // --------[ follower ]----|
+ properOffset = deriveOffset(oppositeAlignCssSizeProp, oppositeAlignCssPositionProp, offsetVertically);
+ }
+ } else {
+ // 'center' align is better
+ // ------------[ target ]--------|
+ // -------[ follower ]--|
+ properAlign = 'center';
+ }
+ }
+ } else if (followerRect[oppositeAlignCssSizeProp] < targetRect[oppositeAlignCssSizeProp]) {
+ // TODO: maybe center is better
+ if (targetRect[currentAlignCssPositionProp] < 0 && // opposite align has larger space
+ // ------------[ target ]
+ // ----------------[follower]
+ targetRect[oppositeAlignCssPositionProp] > targetRect[currentAlignCssPositionProp]) {
+ properAlign = oppositeAligns[align];
+ }
+ }
+ } else {
+ const possibleAlternativeAlignCssPositionProp1 = position === 'bottom' || position === 'top' ? 'left' : 'top';
+ const possibleAlternativeAlignCssPositionProp2 = oppositionPositions[possibleAlternativeAlignCssPositionProp1];
+ const alternativeAlignCssSizeProp = propToCompare[possibleAlternativeAlignCssPositionProp1];
+ const followerOverTargetSize = (followerRect[alternativeAlignCssSizeProp] - targetRect[alternativeAlignCssSizeProp]) / 2;
+
+ if ( // center is not enough
+ // ----------- [ target ]--|
+ // -------[ follower ]
+ targetRect[possibleAlternativeAlignCssPositionProp1] < followerOverTargetSize || targetRect[possibleAlternativeAlignCssPositionProp2] < followerOverTargetSize) {
+ // alternative 2 position's space is larger
+ if (targetRect[possibleAlternativeAlignCssPositionProp1] > targetRect[possibleAlternativeAlignCssPositionProp2]) {
+ properAlign = cssPositionToOppositeAlign[possibleAlternativeAlignCssPositionProp1];
+ properOffset = deriveOffset(alternativeAlignCssSizeProp, possibleAlternativeAlignCssPositionProp1, offsetVertically);
+ } else {
+ // alternative 1 position's space is larger
+ properAlign = cssPositionToOppositeAlign[possibleAlternativeAlignCssPositionProp2];
+ properOffset = deriveOffset(alternativeAlignCssSizeProp, possibleAlternativeAlignCssPositionProp2, offsetVertically);
+ }
+ }
+ }
+
+ let properPosition = position;
+
+ if ( // space is not enough
+ targetRect[position] < followerRect[propToCompare[position]] && // opposite position's space is larger
+ targetRect[position] < targetRect[oppositionPositions[position]]) {
+ properPosition = oppositionPositions[position];
+ }
+
+ return {
+ placement: properAlign !== 'center' ? `${properPosition}-${properAlign}` : properPosition,
+ left: properOffset.left,
+ top: properOffset.top
+ };
+ }
+ function getProperTransformOrigin(placement, overlap) {
+ if (overlap) return overlapTransformOrigin[placement];
+ return transformOrigins[placement];
+ } // ------------
+ // | offset |
+ // | |
+ // | [target] |
+ // | |
+ // ------------
+ // TODO: refactor it to remove dup logic
+
+ function getOffset$1(placement, offsetRect, targetRect, offsetTopToStandardPlacement, offsetLeftToStandardPlacement, overlap) {
+ if (overlap) {
+ switch (placement) {
+ case 'bottom-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left)}px`,
+ transform: 'translateY(-100%)'
+ };
+
+ case 'bottom-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width)}px`,
+ transform: 'translateX(-100%) translateY(-100%)'
+ };
+
+ case 'top-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left)}px`,
+ transform: ''
+ };
+
+ case 'top-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width)}px`,
+ transform: 'translateX(-100%)'
+ };
+
+ case 'right-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width)}px`,
+ transform: 'translateX(-100%)'
+ };
+
+ case 'right-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width)}px`,
+ transform: 'translateX(-100%) translateY(-100%)'
+ };
+
+ case 'left-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left)}px`,
+ transform: ''
+ };
+
+ case 'left-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left)}px`,
+ transform: 'translateY(-100%)'
+ };
+
+ case 'top':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width / 2)}px`,
+ transform: 'translateX(-50%)'
+ };
+
+ case 'right':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height / 2)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width)}px`,
+ transform: 'translateX(-100%) translateY(-50%)'
+ };
+
+ case 'left':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height / 2)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left)}px`,
+ transform: 'translateY(-50%)'
+ };
+
+ case 'bottom':
+ default:
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width / 2)}px`,
+ transform: 'translateX(-50%) translateY(-100%)'
+ };
+ }
+ }
+
+ switch (placement) {
+ case 'bottom-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + offsetLeftToStandardPlacement)}px`,
+ transform: ''
+ };
+
+ case 'bottom-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateX(-100%)'
+ };
+
+ case 'top-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateY(-100%)'
+ };
+
+ case 'top-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateX(-100%) translateY(-100%)'
+ };
+
+ case 'right-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width + offsetLeftToStandardPlacement)}px`,
+ transform: ''
+ };
+
+ case 'right-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateY(-100%)'
+ };
+
+ case 'left-start':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateX(-100%)'
+ };
+
+ case 'left-end':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateX(-100%) translateY(-100%)'
+ };
+
+ case 'top':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width / 2 + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateY(-100%) translateX(-50%)'
+ };
+
+ case 'right':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height / 2 + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateY(-50%)'
+ };
+
+ case 'left':
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height / 2 + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateY(-50%) translateX(-100%)'
+ };
+
+ case 'bottom':
+ default:
+ return {
+ top: `${Math.round(targetRect.top - offsetRect.top + targetRect.height + offsetTopToStandardPlacement)}px`,
+ left: `${Math.round(targetRect.left - offsetRect.left + targetRect.width / 2 + offsetLeftToStandardPlacement)}px`,
+ transform: 'translateX(-50%)'
+ };
+ }
+ }
+
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
+ const style$1B = c([c('.v-binder-follower-container', {
+ position: 'absolute',
+ left: '0',
+ right: '0',
+ top: '0',
+ height: '0',
+ pointerEvents: 'none',
+ zIndex: 'auto'
+ }), c('.v-binder-follower-content', {
+ position: 'absolute',
+ zIndex: 'auto'
+ }, [c('> *', {
+ pointerEvents: 'all'
+ })])]);
+ var VFollower = vue.defineComponent({
+ name: 'Follower',
+ inheritAttrs: false,
+ props: {
+ show: Boolean,
+ enabled: {
+ type: Boolean,
+ default: undefined
+ },
+ placement: {
+ type: String,
+ default: 'bottom'
+ },
+ syncTrigger: {
+ type: Array,
+ default: ['resize', 'scroll']
+ },
+ to: [String, Object],
+ flip: {
+ type: Boolean,
+ default: true
+ },
+ internalShift: Boolean,
+ x: Number,
+ y: Number,
+ width: String,
+ minWidth: String,
+ containerClass: String,
+ teleportDisabled: Boolean,
+ zindexable: {
+ type: Boolean,
+ default: true
+ },
+ zIndex: Number,
+ overlap: Boolean
+ },
+
+ setup(props) {
+ const VBinder = vue.inject('VBinder');
+ const mergedEnabledRef = useMemo(() => {
+ return props.enabled !== undefined ? props.enabled : props.show;
+ });
+ const followerRef = vue.ref(null);
+ const offsetContainerRef = vue.ref(null);
+
+ const ensureListeners = () => {
+ const {
+ syncTrigger
+ } = props;
+
+ if (syncTrigger.includes('scroll')) {
+ VBinder.addScrollListener(syncPosition);
+ }
+
+ if (syncTrigger.includes('resize')) {
+ VBinder.addResizeListener(syncPosition);
+ }
+ };
+
+ const removeListeners = () => {
+ VBinder.removeScrollListener(syncPosition);
+ VBinder.removeResizeListener(syncPosition);
+ };
+
+ vue.onMounted(() => {
+ if (mergedEnabledRef.value) {
+ syncPosition();
+ ensureListeners();
+ }
+ });
+ const ssrAdapter = useSsrAdapter();
+ style$1B.mount({
+ id: 'vueuc/binder',
+ head: true,
+ anchorMetaName: cssrAnchorMetaName$1,
+ ssr: ssrAdapter
+ });
+ vue.onBeforeUnmount(() => {
+ removeListeners();
+ });
+ onFontsReady(() => {
+ if (mergedEnabledRef.value) {
+ syncPosition();
+ }
+ });
+
+ const syncPosition = () => {
+ if (!mergedEnabledRef.value) {
+ return;
+ }
+
+ const follower = followerRef.value; // sometimes watched props change before its dom is ready
+ // for example: show=false, x=undefined, y=undefined
+ // show=true, x=0, y=0
+ // will cause error
+ // I may optimize the watch start point later
+
+ if (follower === null) return;
+ const target = VBinder.targetRef;
+ const {
+ x,
+ y,
+ overlap
+ } = props;
+ const targetRect = x !== undefined && y !== undefined ? getPointRect(x, y) : getRect$1(target);
+ follower.style.setProperty('--v-target-width', `${Math.round(targetRect.width)}px`);
+ follower.style.setProperty('--v-target-height', `${Math.round(targetRect.height)}px`);
+ const {
+ width,
+ minWidth,
+ placement,
+ internalShift,
+ flip
+ } = props;
+ follower.setAttribute('v-placement', placement);
+
+ if (overlap) {
+ follower.setAttribute('v-overlap', '');
+ } else {
+ follower.removeAttribute('v-overlap');
+ }
+
+ const {
+ style
+ } = follower;
+
+ if (width === 'target') {
+ style.width = `${targetRect.width}px`;
+ } else if (width !== undefined) {
+ style.width = width;
+ } else {
+ style.width = '';
+ }
+
+ if (minWidth === 'target') {
+ style.minWidth = `${targetRect.width}px`;
+ } else if (minWidth !== undefined) {
+ style.minWidth = minWidth;
+ } else {
+ style.minWidth = '';
+ }
+
+ const followerRect = getRect$1(follower);
+ const offsetContainerRect = getRect$1(offsetContainerRef.value);
+ const {
+ left: offsetLeftToStandardPlacement,
+ top: offsetTopToStandardPlacement,
+ placement: properPlacement
+ } = getPlacementAndOffsetOfFollower(placement, targetRect, followerRect, internalShift, flip, overlap);
+ const properTransformOrigin = getProperTransformOrigin(properPlacement, overlap);
+ const {
+ left,
+ top,
+ transform
+ } = getOffset$1(properPlacement, offsetContainerRect, targetRect, offsetTopToStandardPlacement, offsetLeftToStandardPlacement, overlap); // we assume that the content size doesn't change after flip,
+ // nor we need to make sync logic more complex
+
+ follower.setAttribute('v-placement', properPlacement);
+ follower.style.setProperty('--v-offset-left', `${Math.round(offsetLeftToStandardPlacement)}px`);
+ follower.style.setProperty('--v-offset-top', `${Math.round(offsetTopToStandardPlacement)}px`);
+ follower.style.transform = `translateX(${left}) translateY(${top}) ${transform}`;
+ follower.style.setProperty('--v-transform-origin', properTransformOrigin);
+ follower.style.transformOrigin = properTransformOrigin;
+ };
+
+ vue.watch(mergedEnabledRef, value => {
+ if (value) {
+ ensureListeners();
+ syncOnNextTick();
+ } else {
+ removeListeners();
+ }
+ });
+
+ const syncOnNextTick = () => {
+ vue.nextTick().then(syncPosition).catch(e => console.error(e));
+ };
+
+ ['placement', 'x', 'y', 'internalShift', 'flip', 'width', 'overlap', 'minWidth'].forEach(prop => {
+ vue.watch(vue.toRef(props, prop), syncPosition);
+ });
+ ['teleportDisabled'].forEach(prop => {
+ vue.watch(vue.toRef(props, prop), syncOnNextTick);
+ });
+ vue.watch(vue.toRef(props, 'syncTrigger'), value => {
+ if (!value.includes('resize')) {
+ VBinder.removeResizeListener(syncPosition);
+ } else {
+ VBinder.addResizeListener(syncPosition);
+ }
+
+ if (!value.includes('scroll')) {
+ VBinder.removeScrollListener(syncPosition);
+ } else {
+ VBinder.addScrollListener(syncPosition);
+ }
+ });
+ const isMountedRef = isMounted();
+ const mergedToRef = useMemo(() => {
+ const {
+ to
+ } = props;
+ if (to !== undefined) return to;
+
+ if (isMountedRef.value) {
+ // TODO: find proper container
+ return undefined;
+ }
+
+ return undefined;
+ });
+ return {
+ VBinder,
+ mergedEnabled: mergedEnabledRef,
+ offsetContainerRef,
+ followerRef,
+ mergedTo: mergedToRef,
+ syncPosition
+ };
+ },
+
+ render() {
+ return vue.h(LazyTeleport, {
+ show: this.show,
+ to: this.mergedTo,
+ disabled: this.teleportDisabled
+ }, {
+ default: () => {
+ var _a, _b;
+
+ const vNode = vue.h('div', {
+ class: ['v-binder-follower-container', this.containerClass],
+ ref: 'offsetContainerRef'
+ }, [vue.h('div', {
+ class: 'v-binder-follower-content',
+ ref: 'followerRef'
+ }, (_b = (_a = this.$slots).default) === null || _b === void 0 ? void 0 : _b.call(_a))]);
+
+ if (this.zindexable) {
+ return vue.withDirectives(vNode, [[zindexable$1, {
+ enabled: this.mergedEnabled,
+ zIndex: this.zIndex
+ }]]);
+ }
+
+ return vNode;
+ }
+ });
+ }
+
+ });
+
+ var resizeObservers = [];
+
+ var hasActiveObservations = function () {
+ return resizeObservers.some(function (ro) {
+ return ro.activeTargets.length > 0;
+ });
+ };
+
+ var hasSkippedObservations = function () {
+ return resizeObservers.some(function (ro) {
+ return ro.skippedTargets.length > 0;
+ });
+ };
+
+ var msg = 'ResizeObserver loop completed with undelivered notifications.';
+
+ var deliverResizeLoopError = function () {
+ var event;
+
+ if (typeof ErrorEvent === 'function') {
+ event = new ErrorEvent('error', {
+ message: msg
+ });
+ } else {
+ event = document.createEvent('Event');
+ event.initEvent('error', false, false);
+ event.message = msg;
+ }
+
+ window.dispatchEvent(event);
+ };
+
+ var ResizeObserverBoxOptions;
+
+ (function (ResizeObserverBoxOptions) {
+ ResizeObserverBoxOptions["BORDER_BOX"] = "border-box";
+ ResizeObserverBoxOptions["CONTENT_BOX"] = "content-box";
+ ResizeObserverBoxOptions["DEVICE_PIXEL_CONTENT_BOX"] = "device-pixel-content-box";
+ })(ResizeObserverBoxOptions || (ResizeObserverBoxOptions = {}));
+
+ var freeze = function (obj) {
+ return Object.freeze(obj);
+ };
+
+ var ResizeObserverSize = function () {
+ function ResizeObserverSize(inlineSize, blockSize) {
+ this.inlineSize = inlineSize;
+ this.blockSize = blockSize;
+ freeze(this);
+ }
+
+ return ResizeObserverSize;
+ }();
+
+ var DOMRectReadOnly = function () {
+ function DOMRectReadOnly(x, y, width, height) {
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ this.top = this.y;
+ this.left = this.x;
+ this.bottom = this.top + this.height;
+ this.right = this.left + this.width;
+ return freeze(this);
+ }
+
+ DOMRectReadOnly.prototype.toJSON = function () {
+ var _a = this,
+ x = _a.x,
+ y = _a.y,
+ top = _a.top,
+ right = _a.right,
+ bottom = _a.bottom,
+ left = _a.left,
+ width = _a.width,
+ height = _a.height;
+
+ return {
+ x: x,
+ y: y,
+ top: top,
+ right: right,
+ bottom: bottom,
+ left: left,
+ width: width,
+ height: height
+ };
+ };
+
+ DOMRectReadOnly.fromRect = function (rectangle) {
+ return new DOMRectReadOnly(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+ };
+
+ return DOMRectReadOnly;
+ }();
+
+ var isSVG = function (target) {
+ return target instanceof SVGElement && 'getBBox' in target;
+ };
+
+ var isHidden = function (target) {
+ if (isSVG(target)) {
+ var _a = target.getBBox(),
+ width = _a.width,
+ height = _a.height;
+
+ return !width && !height;
+ }
+
+ var _b = target,
+ offsetWidth = _b.offsetWidth,
+ offsetHeight = _b.offsetHeight;
+ return !(offsetWidth || offsetHeight || target.getClientRects().length);
+ };
+
+ var isElement = function (obj) {
+ var _a;
+
+ if (obj instanceof Element) {
+ return true;
+ }
+
+ var scope = (_a = obj === null || obj === void 0 ? void 0 : obj.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView;
+ return !!(scope && obj instanceof scope.Element);
+ };
+
+ var isReplacedElement = function (target) {
+ switch (target.tagName) {
+ case 'INPUT':
+ if (target.type !== 'image') {
+ break;
+ }
+
+ case 'VIDEO':
+ case 'AUDIO':
+ case 'EMBED':
+ case 'OBJECT':
+ case 'CANVAS':
+ case 'IFRAME':
+ case 'IMG':
+ return true;
+ }
+
+ return false;
+ };
+
+ var global$1 = typeof window !== 'undefined' ? window : {};
+
+ var cache = new WeakMap();
+ var scrollRegexp = /auto|scroll/;
+ var verticalRegexp = /^tb|vertical/;
+ var IE = /msie|trident/i.test(global$1.navigator && global$1.navigator.userAgent);
+
+ var parseDimension = function (pixel) {
+ return parseFloat(pixel || '0');
+ };
+
+ var size = function (inlineSize, blockSize, switchSizes) {
+ if (inlineSize === void 0) {
+ inlineSize = 0;
+ }
+
+ if (blockSize === void 0) {
+ blockSize = 0;
+ }
+
+ if (switchSizes === void 0) {
+ switchSizes = false;
+ }
+
+ return new ResizeObserverSize((switchSizes ? blockSize : inlineSize) || 0, (switchSizes ? inlineSize : blockSize) || 0);
+ };
+
+ var zeroBoxes = freeze({
+ devicePixelContentBoxSize: size(),
+ borderBoxSize: size(),
+ contentBoxSize: size(),
+ contentRect: new DOMRectReadOnly(0, 0, 0, 0)
+ });
+
+ var calculateBoxSizes = function (target, forceRecalculation) {
+ if (forceRecalculation === void 0) {
+ forceRecalculation = false;
+ }
+
+ if (cache.has(target) && !forceRecalculation) {
+ return cache.get(target);
+ }
+
+ if (isHidden(target)) {
+ cache.set(target, zeroBoxes);
+ return zeroBoxes;
+ }
+
+ var cs = getComputedStyle(target);
+ var svg = isSVG(target) && target.ownerSVGElement && target.getBBox();
+ var removePadding = !IE && cs.boxSizing === 'border-box';
+ var switchSizes = verticalRegexp.test(cs.writingMode || '');
+ var canScrollVertically = !svg && scrollRegexp.test(cs.overflowY || '');
+ var canScrollHorizontally = !svg && scrollRegexp.test(cs.overflowX || '');
+ var paddingTop = svg ? 0 : parseDimension(cs.paddingTop);
+ var paddingRight = svg ? 0 : parseDimension(cs.paddingRight);
+ var paddingBottom = svg ? 0 : parseDimension(cs.paddingBottom);
+ var paddingLeft = svg ? 0 : parseDimension(cs.paddingLeft);
+ var borderTop = svg ? 0 : parseDimension(cs.borderTopWidth);
+ var borderRight = svg ? 0 : parseDimension(cs.borderRightWidth);
+ var borderBottom = svg ? 0 : parseDimension(cs.borderBottomWidth);
+ var borderLeft = svg ? 0 : parseDimension(cs.borderLeftWidth);
+ var horizontalPadding = paddingLeft + paddingRight;
+ var verticalPadding = paddingTop + paddingBottom;
+ var horizontalBorderArea = borderLeft + borderRight;
+ var verticalBorderArea = borderTop + borderBottom;
+ var horizontalScrollbarThickness = !canScrollHorizontally ? 0 : target.offsetHeight - verticalBorderArea - target.clientHeight;
+ var verticalScrollbarThickness = !canScrollVertically ? 0 : target.offsetWidth - horizontalBorderArea - target.clientWidth;
+ var widthReduction = removePadding ? horizontalPadding + horizontalBorderArea : 0;
+ var heightReduction = removePadding ? verticalPadding + verticalBorderArea : 0;
+ var contentWidth = svg ? svg.width : parseDimension(cs.width) - widthReduction - verticalScrollbarThickness;
+ var contentHeight = svg ? svg.height : parseDimension(cs.height) - heightReduction - horizontalScrollbarThickness;
+ var borderBoxWidth = contentWidth + horizontalPadding + verticalScrollbarThickness + horizontalBorderArea;
+ var borderBoxHeight = contentHeight + verticalPadding + horizontalScrollbarThickness + verticalBorderArea;
+ var boxes = freeze({
+ devicePixelContentBoxSize: size(Math.round(contentWidth * devicePixelRatio), Math.round(contentHeight * devicePixelRatio), switchSizes),
+ borderBoxSize: size(borderBoxWidth, borderBoxHeight, switchSizes),
+ contentBoxSize: size(contentWidth, contentHeight, switchSizes),
+ contentRect: new DOMRectReadOnly(paddingLeft, paddingTop, contentWidth, contentHeight)
+ });
+ cache.set(target, boxes);
+ return boxes;
+ };
+
+ var calculateBoxSize = function (target, observedBox, forceRecalculation) {
+ var _a = calculateBoxSizes(target, forceRecalculation),
+ borderBoxSize = _a.borderBoxSize,
+ contentBoxSize = _a.contentBoxSize,
+ devicePixelContentBoxSize = _a.devicePixelContentBoxSize;
+
+ switch (observedBox) {
+ case ResizeObserverBoxOptions.DEVICE_PIXEL_CONTENT_BOX:
+ return devicePixelContentBoxSize;
+
+ case ResizeObserverBoxOptions.BORDER_BOX:
+ return borderBoxSize;
+
+ default:
+ return contentBoxSize;
+ }
+ };
+
+ var ResizeObserverEntry = function () {
+ function ResizeObserverEntry(target) {
+ var boxes = calculateBoxSizes(target);
+ this.target = target;
+ this.contentRect = boxes.contentRect;
+ this.borderBoxSize = freeze([boxes.borderBoxSize]);
+ this.contentBoxSize = freeze([boxes.contentBoxSize]);
+ this.devicePixelContentBoxSize = freeze([boxes.devicePixelContentBoxSize]);
+ }
+
+ return ResizeObserverEntry;
+ }();
+
+ var calculateDepthForNode = function (node) {
+ if (isHidden(node)) {
+ return Infinity;
+ }
+
+ var depth = 0;
+ var parent = node.parentNode;
+
+ while (parent) {
+ depth += 1;
+ parent = parent.parentNode;
+ }
+
+ return depth;
+ };
+
+ var broadcastActiveObservations = function () {
+ var shallowestDepth = Infinity;
+ var callbacks = [];
+ resizeObservers.forEach(function processObserver(ro) {
+ if (ro.activeTargets.length === 0) {
+ return;
+ }
+
+ var entries = [];
+ ro.activeTargets.forEach(function processTarget(ot) {
+ var entry = new ResizeObserverEntry(ot.target);
+ var targetDepth = calculateDepthForNode(ot.target);
+ entries.push(entry);
+ ot.lastReportedSize = calculateBoxSize(ot.target, ot.observedBox);
+
+ if (targetDepth < shallowestDepth) {
+ shallowestDepth = targetDepth;
+ }
+ });
+ callbacks.push(function resizeObserverCallback() {
+ ro.callback.call(ro.observer, entries, ro.observer);
+ });
+ ro.activeTargets.splice(0, ro.activeTargets.length);
+ });
+
+ for (var _i = 0, callbacks_1 = callbacks; _i < callbacks_1.length; _i++) {
+ var callback = callbacks_1[_i];
+ callback();
+ }
+
+ return shallowestDepth;
+ };
+
+ var gatherActiveObservationsAtDepth = function (depth) {
+ resizeObservers.forEach(function processObserver(ro) {
+ ro.activeTargets.splice(0, ro.activeTargets.length);
+ ro.skippedTargets.splice(0, ro.skippedTargets.length);
+ ro.observationTargets.forEach(function processTarget(ot) {
+ if (ot.isActive()) {
+ if (calculateDepthForNode(ot.target) > depth) {
+ ro.activeTargets.push(ot);
+ } else {
+ ro.skippedTargets.push(ot);
+ }
+ }
+ });
+ });
+ };
+
+ var process$1 = function () {
+ var depth = 0;
+ gatherActiveObservationsAtDepth(depth);
+
+ while (hasActiveObservations()) {
+ depth = broadcastActiveObservations();
+ gatherActiveObservationsAtDepth(depth);
+ }
+
+ if (hasSkippedObservations()) {
+ deliverResizeLoopError();
+ }
+
+ return depth > 0;
+ };
+
+ var trigger;
+ var callbacks = [];
+
+ var notify = function () {
+ return callbacks.splice(0).forEach(function (cb) {
+ return cb();
+ });
+ };
+
+ var queueMicroTask = function (callback) {
+ if (!trigger) {
+ var toggle_1 = 0;
+ var el_1 = document.createTextNode('');
+ var config = {
+ characterData: true
+ };
+ new MutationObserver(function () {
+ return notify();
+ }).observe(el_1, config);
+
+ trigger = function () {
+ el_1.textContent = "".concat(toggle_1 ? toggle_1-- : toggle_1++);
+ };
+ }
+
+ callbacks.push(callback);
+ trigger();
+ };
+
+ var queueResizeObserver = function (cb) {
+ queueMicroTask(function ResizeObserver() {
+ requestAnimationFrame(cb);
+ });
+ };
+
+ var watching = 0;
+
+ var isWatching = function () {
+ return !!watching;
+ };
+
+ var CATCH_PERIOD = 250;
+ var observerConfig = {
+ attributes: true,
+ characterData: true,
+ childList: true,
+ subtree: true
+ };
+ var events = ['resize', 'load', 'transitionend', 'animationend', 'animationstart', 'animationiteration', 'keyup', 'keydown', 'mouseup', 'mousedown', 'mouseover', 'mouseout', 'blur', 'focus'];
+
+ var time$1 = function (timeout) {
+ if (timeout === void 0) {
+ timeout = 0;
+ }
+
+ return Date.now() + timeout;
+ };
+
+ var scheduled = false;
+
+ var Scheduler = function () {
+ function Scheduler() {
+ var _this = this;
+
+ this.stopped = true;
+
+ this.listener = function () {
+ return _this.schedule();
+ };
+ }
+
+ Scheduler.prototype.run = function (timeout) {
+ var _this = this;
+
+ if (timeout === void 0) {
+ timeout = CATCH_PERIOD;
+ }
+
+ if (scheduled) {
+ return;
+ }
+
+ scheduled = true;
+ var until = time$1(timeout);
+ queueResizeObserver(function () {
+ var elementsHaveResized = false;
+
+ try {
+ elementsHaveResized = process$1();
+ } finally {
+ scheduled = false;
+ timeout = until - time$1();
+
+ if (!isWatching()) {
+ return;
+ }
+
+ if (elementsHaveResized) {
+ _this.run(1000);
+ } else if (timeout > 0) {
+ _this.run(timeout);
+ } else {
+ _this.start();
+ }
+ }
+ });
+ };
+
+ Scheduler.prototype.schedule = function () {
+ this.stop();
+ this.run();
+ };
+
+ Scheduler.prototype.observe = function () {
+ var _this = this;
+
+ var cb = function () {
+ return _this.observer && _this.observer.observe(document.body, observerConfig);
+ };
+
+ document.body ? cb() : global$1.addEventListener('DOMContentLoaded', cb);
+ };
+
+ Scheduler.prototype.start = function () {
+ var _this = this;
+
+ if (this.stopped) {
+ this.stopped = false;
+ this.observer = new MutationObserver(this.listener);
+ this.observe();
+ events.forEach(function (name) {
+ return global$1.addEventListener(name, _this.listener, true);
+ });
+ }
+ };
+
+ Scheduler.prototype.stop = function () {
+ var _this = this;
+
+ if (!this.stopped) {
+ this.observer && this.observer.disconnect();
+ events.forEach(function (name) {
+ return global$1.removeEventListener(name, _this.listener, true);
+ });
+ this.stopped = true;
+ }
+ };
+
+ return Scheduler;
+ }();
+
+ var scheduler = new Scheduler();
+
+ var updateCount = function (n) {
+ !watching && n > 0 && scheduler.start();
+ watching += n;
+ !watching && scheduler.stop();
+ };
+
+ var skipNotifyOnElement = function (target) {
+ return !isSVG(target) && !isReplacedElement(target) && getComputedStyle(target).display === 'inline';
+ };
+
+ var ResizeObservation = function () {
+ function ResizeObservation(target, observedBox) {
+ this.target = target;
+ this.observedBox = observedBox || ResizeObserverBoxOptions.CONTENT_BOX;
+ this.lastReportedSize = {
+ inlineSize: 0,
+ blockSize: 0
+ };
+ }
+
+ ResizeObservation.prototype.isActive = function () {
+ var size = calculateBoxSize(this.target, this.observedBox, true);
+
+ if (skipNotifyOnElement(this.target)) {
+ this.lastReportedSize = size;
+ }
+
+ if (this.lastReportedSize.inlineSize !== size.inlineSize || this.lastReportedSize.blockSize !== size.blockSize) {
+ return true;
+ }
+
+ return false;
+ };
+
+ return ResizeObservation;
+ }();
+
+ var ResizeObserverDetail = function () {
+ function ResizeObserverDetail(resizeObserver, callback) {
+ this.activeTargets = [];
+ this.skippedTargets = [];
+ this.observationTargets = [];
+ this.observer = resizeObserver;
+ this.callback = callback;
+ }
+
+ return ResizeObserverDetail;
+ }();
+
+ var observerMap = new WeakMap();
+
+ var getObservationIndex = function (observationTargets, target) {
+ for (var i = 0; i < observationTargets.length; i += 1) {
+ if (observationTargets[i].target === target) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ var ResizeObserverController = function () {
+ function ResizeObserverController() {}
+
+ ResizeObserverController.connect = function (resizeObserver, callback) {
+ var detail = new ResizeObserverDetail(resizeObserver, callback);
+ observerMap.set(resizeObserver, detail);
+ };
+
+ ResizeObserverController.observe = function (resizeObserver, target, options) {
+ var detail = observerMap.get(resizeObserver);
+ var firstObservation = detail.observationTargets.length === 0;
+
+ if (getObservationIndex(detail.observationTargets, target) < 0) {
+ firstObservation && resizeObservers.push(detail);
+ detail.observationTargets.push(new ResizeObservation(target, options && options.box));
+ updateCount(1);
+ scheduler.schedule();
+ }
+ };
+
+ ResizeObserverController.unobserve = function (resizeObserver, target) {
+ var detail = observerMap.get(resizeObserver);
+ var index = getObservationIndex(detail.observationTargets, target);
+ var lastObservation = detail.observationTargets.length === 1;
+
+ if (index >= 0) {
+ lastObservation && resizeObservers.splice(resizeObservers.indexOf(detail), 1);
+ detail.observationTargets.splice(index, 1);
+ updateCount(-1);
+ }
+ };
+
+ ResizeObserverController.disconnect = function (resizeObserver) {
+ var _this = this;
+
+ var detail = observerMap.get(resizeObserver);
+ detail.observationTargets.slice().forEach(function (ot) {
+ return _this.unobserve(resizeObserver, ot.target);
+ });
+ detail.activeTargets.splice(0, detail.activeTargets.length);
+ };
+
+ return ResizeObserverController;
+ }();
+
+ var ResizeObserver = function () {
+ function ResizeObserver(callback) {
+ if (arguments.length === 0) {
+ throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");
+ }
+
+ if (typeof callback !== 'function') {
+ throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");
+ }
+
+ ResizeObserverController.connect(this, callback);
+ }
+
+ ResizeObserver.prototype.observe = function (target, options) {
+ if (arguments.length === 0) {
+ throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");
+ }
+
+ if (!isElement(target)) {
+ throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");
+ }
+
+ ResizeObserverController.observe(this, target, options);
+ };
+
+ ResizeObserver.prototype.unobserve = function (target) {
+ if (arguments.length === 0) {
+ throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");
+ }
+
+ if (!isElement(target)) {
+ throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");
+ }
+
+ ResizeObserverController.unobserve(this, target);
+ };
+
+ ResizeObserver.prototype.disconnect = function () {
+ ResizeObserverController.disconnect(this);
+ };
+
+ ResizeObserver.toString = function () {
+ return 'function ResizeObserver () { [polyfill code] }';
+ };
+
+ return ResizeObserver;
+ }();
+
+ class ResizeObserverDelegate {
+ constructor() {
+ this.handleResize = this.handleResize.bind(this);
+ this.observer = new ResizeObserver(this.handleResize);
+ this.elHandlersMap = new Map();
+ }
+
+ handleResize(entries) {
+ for (const entry of entries) {
+ const handler = this.elHandlersMap.get(entry.target);
+
+ if (handler !== undefined) {
+ handler(entry);
+ }
+ }
+ }
+
+ registerHandler(el, handler) {
+ this.elHandlersMap.set(el, handler);
+ this.observer.observe(el);
+ }
+
+ unregisterHandler(el) {
+ if (!this.elHandlersMap.has(el)) {
+ return;
+ }
+
+ this.elHandlersMap.delete(el);
+ this.observer.unobserve(el);
+ }
+
+ }
+
+ var resizeObserverManager = new ResizeObserverDelegate();
+
+ var VResizeObserver = vue.defineComponent({
+ name: 'ResizeObserver',
+ props: {
+ onResize: Function
+ },
+
+ setup(props) {
+ let registered = false; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+
+ const proxy = vue.getCurrentInstance().proxy;
+
+ function handleResize(entry) {
+ const {
+ onResize
+ } = props;
+ if (onResize !== undefined) onResize(entry);
+ }
+
+ vue.onMounted(() => {
+ const el = proxy.$el;
+
+ if (el === undefined) {
+ warn('resize-observer', '$el does not exist.');
+ return;
+ }
+
+ if (el.nextElementSibling !== el.nextSibling) {
+ if (el.nodeType === 3 && el.nodeValue !== '') {
+ warn('resize-observer', '$el can not be observed (it may be a text node).');
+ return;
+ }
+ }
+
+ if (el.nextElementSibling !== null) {
+ resizeObserverManager.registerHandler(el.nextElementSibling, handleResize);
+ registered = true;
+ }
+ });
+ vue.onBeforeUnmount(() => {
+ if (registered) {
+ resizeObserverManager.unregisterHandler(proxy.$el.nextElementSibling);
+ }
+ });
+ },
+
+ render() {
+ return vue.renderSlot(this.$slots, 'default');
+ }
+
+ });
+
+ let maybeTouch;
+ function ensureMaybeTouch() {
+ if (maybeTouch === undefined) {
+ if ('matchMedia' in window) {
+ maybeTouch = window.matchMedia('(pointer:coarse)').matches;
+ } else {
+ maybeTouch = false;
+ }
+ }
+
+ return maybeTouch;
+ }
+ let wheelScale;
+ function ensureWheelScale() {
+ if (wheelScale === undefined) {
+ wheelScale = 'chrome' in window ? window.devicePixelRatio : 1;
+ }
+
+ return wheelScale;
+ }
+
+ /* eslint-disable no-void */
+ const styles$1 = c('.v-vl', {
+ maxHeight: 'inherit',
+ height: '100%',
+ overflow: 'auto',
+ minWidth: '1px' // a zero width container won't be scrollable
+
+ }, [c('&:not(.v-vl--show-scrollbar)', {
+ scrollbarWidth: 'none'
+ }, [c('&::-webkit-scrollbar, &::-webkit-scrollbar-track-piece, &::-webkit-scrollbar-thumb', {
+ width: 0,
+ height: 0,
+ display: 'none'
+ })])]);
+ var VVirtualList = vue.defineComponent({
+ name: 'VirtualList',
+ inheritAttrs: false,
+ props: {
+ showScrollbar: {
+ type: Boolean,
+ default: true
+ },
+ items: {
+ type: Array,
+ default: () => []
+ },
+ // it is suppose to be the min height
+ itemSize: {
+ type: Number,
+ required: true
+ },
+ itemResizable: Boolean,
+ itemsStyle: [String, Object],
+ visibleItemsTag: {
+ type: [String, Object],
+ default: 'div'
+ },
+ visibleItemsProps: Object,
+ ignoreItemResize: Boolean,
+ onScroll: Function,
+ onWheel: Function,
+ onResize: Function,
+ defaultScrollKey: [Number, String],
+ defaultScrollIndex: Number,
+ keyField: {
+ type: String,
+ default: 'key'
+ },
+ // Whether it is a good API?
+ // ResizeObserver + footer & header is not enough.
+ // Too complex for simple case
+ paddingTop: {
+ type: [Number, String],
+ default: 0
+ },
+ paddingBottom: {
+ type: [Number, String],
+ default: 0
+ }
+ },
+
+ setup(props) {
+ const ssrAdapter = useSsrAdapter();
+ styles$1.mount({
+ id: 'vueuc/virtual-list',
+ head: true,
+ anchorMetaName: cssrAnchorMetaName$1,
+ ssr: ssrAdapter
+ });
+ vue.onMounted(() => {
+ const {
+ defaultScrollIndex,
+ defaultScrollKey
+ } = props;
+
+ if (defaultScrollIndex !== undefined && defaultScrollIndex !== null) {
+ scrollTo({
+ index: defaultScrollIndex
+ });
+ } else if (defaultScrollKey !== undefined && defaultScrollKey !== null) {
+ scrollTo({
+ key: defaultScrollKey
+ });
+ }
+ });
+ let isDeactivated = false;
+ let activateStateInitialized = false;
+ vue.onActivated(() => {
+ isDeactivated = false;
+
+ if (!activateStateInitialized) {
+ activateStateInitialized = true;
+ return;
+ } // remount
+
+
+ scrollTo({
+ top: scrollTopRef.value,
+ left: scrollLeft
+ });
+ });
+ vue.onDeactivated(() => {
+ isDeactivated = true;
+
+ if (!activateStateInitialized) {
+ activateStateInitialized = true;
+ }
+ });
+ const keyIndexMapRef = vue.computed(() => {
+ const map = new Map();
+ const {
+ keyField
+ } = props;
+ props.items.forEach((item, index) => {
+ map.set(item[keyField], index);
+ });
+ return map;
+ });
+ const listElRef = vue.ref(null);
+ const listHeightRef = vue.ref(undefined);
+ const keyToHeightOffset = new Map();
+ const finweckTreeRef = vue.computed(() => {
+ const {
+ items,
+ itemSize,
+ keyField
+ } = props;
+ const ft = new FinweckTree(items.length, itemSize);
+ items.forEach((item, index) => {
+ const key = item[keyField];
+ const heightOffset = keyToHeightOffset.get(key);
+
+ if (heightOffset !== undefined) {
+ ft.add(index, heightOffset);
+ }
+ });
+ return ft;
+ });
+ const finweckTreeUpdateTrigger = vue.ref(0);
+ let scrollLeft = 0;
+ const scrollTopRef = vue.ref(0);
+ const startIndexRef = useMemo(() => {
+ return Math.max(finweckTreeRef.value.getBound(scrollTopRef.value - depx(props.paddingTop)) - 1, 0);
+ });
+ const viewportItemsRef = vue.computed(() => {
+ const {
+ value: listHeight
+ } = listHeightRef;
+ if (listHeight === undefined) return [];
+ const {
+ items,
+ itemSize
+ } = props;
+ const startIndex = startIndexRef.value;
+ const endIndex = Math.min(startIndex + Math.ceil(listHeight / itemSize + 1), items.length - 1);
+ const viewportItems = [];
+
+ for (let i = startIndex; i <= endIndex; ++i) {
+ viewportItems.push(items[i]);
+ }
+
+ return viewportItems;
+ });
+
+ const scrollTo = (options, y) => {
+ if (typeof options === 'number') {
+ scrollToPosition(options, y, 'auto');
+ return;
+ }
+
+ const {
+ left,
+ top,
+ index,
+ key,
+ position,
+ behavior,
+ debounce = true
+ } = options;
+
+ if (left !== undefined || top !== undefined) {
+ scrollToPosition(left, top, behavior);
+ } else if (index !== undefined) {
+ scrollToIndex(index, behavior, debounce);
+ } else if (key !== undefined) {
+ const toIndex = keyIndexMapRef.value.get(key);
+ if (toIndex !== undefined) scrollToIndex(toIndex, behavior, debounce);
+ } else if (position === 'bottom') {
+ scrollToPosition(0, Number.MAX_SAFE_INTEGER, behavior);
+ } else if (position === 'top') {
+ scrollToPosition(0, 0, behavior);
+ }
+ };
+
+ let anchorIndex;
+ let anchorTimerId = null;
+
+ function scrollToIndex(index, behavior, debounce) {
+ const {
+ value: ft
+ } = finweckTreeRef;
+ const targetTop = ft.sum(index) + depx(props.paddingTop);
+
+ if (!debounce) {
+ listElRef.value.scrollTo({
+ left: 0,
+ top: targetTop,
+ behavior
+ });
+ } else {
+ anchorIndex = index;
+
+ if (anchorTimerId !== null) {
+ window.clearTimeout(anchorTimerId);
+ }
+
+ anchorTimerId = window.setTimeout(() => {
+ anchorIndex = undefined;
+ anchorTimerId = null;
+ }, 16); // use 0 ms may be ealier than resize callback...
+
+ const {
+ scrollTop,
+ offsetHeight
+ } = listElRef.value;
+
+ if (targetTop > scrollTop) {
+ const itemSize = ft.get(index);
+
+ if (targetTop + itemSize <= scrollTop + offsetHeight) ; else {
+ listElRef.value.scrollTo({
+ left: 0,
+ top: targetTop + itemSize - offsetHeight,
+ behavior
+ });
+ }
+ } else {
+ listElRef.value.scrollTo({
+ left: 0,
+ top: targetTop,
+ behavior
+ });
+ }
+ }
+ }
+
+ function scrollToPosition(left, top, behavior) {
+ listElRef.value.scrollTo({
+ left,
+ top,
+ behavior
+ });
+ }
+
+ function handleItemResize(key, entry) {
+ var _a, _b, _c;
+
+ if (isDeactivated) return;
+ if (props.ignoreItemResize) return;
+ if (isHideByVShow(entry.target)) return;
+ const {
+ value: ft
+ } = finweckTreeRef;
+ const index = keyIndexMapRef.value.get(key);
+ const previousHeight = ft.get(index);
+ const height = (_c = (_b = (_a = entry.borderBoxSize) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.blockSize) !== null && _c !== void 0 ? _c : entry.contentRect.height;
+ if (height === previousHeight) return; // height offset based on itemSize
+ // used when rebuild the finweck tree
+
+ const offset = height - props.itemSize;
+
+ if (offset === 0) {
+ keyToHeightOffset.delete(key);
+ } else {
+ keyToHeightOffset.set(key, height - props.itemSize);
+ } // delta height based on finweck tree data
+
+
+ const delta = height - previousHeight;
+ if (delta === 0) return;
+ ft.add(index, delta);
+ const listEl = listElRef.value;
+
+ if (listEl != null) {
+ if (anchorIndex === undefined) {
+ const previousHeightSum = ft.sum(index);
+
+ if (listEl.scrollTop > previousHeightSum) {
+ listEl.scrollBy(0, delta);
+ }
+ } else {
+ if (index < anchorIndex) {
+ listEl.scrollBy(0, delta);
+ } else if (index === anchorIndex) {
+ const previousHeightSum = ft.sum(index);
+
+ if (height + previousHeightSum > // Note, listEl shouldn't have border, nor offsetHeight won't be
+ // correct
+ listEl.scrollTop + listEl.offsetHeight) {
+ listEl.scrollBy(0, delta);
+ }
+ }
+ }
+
+ syncViewport();
+ }
+
+ finweckTreeUpdateTrigger.value++;
+ }
+
+ const mayUseWheel = !ensureMaybeTouch();
+ let wheelCatched = false;
+
+ function handleListScroll(e) {
+ var _a;
+
+ (_a = props.onScroll) === null || _a === void 0 ? void 0 : _a.call(props, e);
+
+ if (!mayUseWheel || !wheelCatched) {
+ syncViewport();
+ }
+ }
+
+ function handleListWheel(e) {
+ var _a;
+
+ (_a = props.onWheel) === null || _a === void 0 ? void 0 : _a.call(props, e);
+
+ if (mayUseWheel) {
+ const listEl = listElRef.value;
+
+ if (listEl != null) {
+ if (e.deltaX === 0) {
+ if (listEl.scrollTop === 0 && e.deltaY <= 0) {
+ return;
+ }
+
+ if (listEl.scrollTop + listEl.offsetHeight >= listEl.scrollHeight && e.deltaY >= 0) {
+ return;
+ }
+ }
+
+ e.preventDefault();
+ listEl.scrollTop += e.deltaY / ensureWheelScale();
+ listEl.scrollLeft += e.deltaX / ensureWheelScale();
+ syncViewport();
+ wheelCatched = true;
+ beforeNextFrameOnce(() => {
+ wheelCatched = false;
+ });
+ }
+ }
+ }
+
+ function handleListResize(entry) {
+ if (isDeactivated) return; // List is HTMLElement
+
+ if (isHideByVShow(entry.target)) return; // If height is same, return
+
+ if (entry.contentRect.height === listHeightRef.value) return;
+ listHeightRef.value = entry.contentRect.height;
+ const {
+ onResize
+ } = props;
+ if (onResize !== undefined) onResize(entry);
+ }
+
+ function syncViewport() {
+ const {
+ value: listEl
+ } = listElRef; // sometime ref el can be null
+ // https://github.com/TuSimple/naive-ui/issues/811
+
+ if (listEl == null) return;
+ scrollTopRef.value = listEl.scrollTop;
+ scrollLeft = listEl.scrollLeft;
+ }
+
+ function isHideByVShow(el) {
+ let cursor = el;
+
+ while (cursor !== null) {
+ if (cursor.style.display === 'none') return true;
+ cursor = cursor.parentElement;
+ }
+
+ return false;
+ }
+
+ return {
+ listHeight: listHeightRef,
+ listStyle: {
+ overflow: 'auto'
+ },
+ keyToIndex: keyIndexMapRef,
+ itemsStyle: vue.computed(() => {
+ const {
+ itemResizable
+ } = props;
+ const height = pxfy(finweckTreeRef.value.sum()); // eslint-disable-next-line @typescript-eslint/no-unused-expressions
+
+ finweckTreeUpdateTrigger.value;
+ return [props.itemsStyle, {
+ boxSizing: 'content-box',
+ height: itemResizable ? '' : height,
+ minHeight: itemResizable ? height : '',
+ paddingTop: pxfy(props.paddingTop),
+ paddingBottom: pxfy(props.paddingBottom)
+ }];
+ }),
+ visibleItemsStyle: vue.computed(() => {
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
+ finweckTreeUpdateTrigger.value;
+ return {
+ transform: `translateY(${pxfy(finweckTreeRef.value.sum(startIndexRef.value))})`
+ };
+ }),
+ viewportItems: viewportItemsRef,
+ listElRef,
+ itemsElRef: vue.ref(null),
+ scrollTo,
+ handleListResize,
+ handleListScroll,
+ handleListWheel,
+ handleItemResize
+ };
+ },
+
+ render() {
+ const {
+ itemResizable,
+ keyField,
+ keyToIndex,
+ visibleItemsTag
+ } = this;
+ return vue.h(VResizeObserver, {
+ onResize: this.handleListResize
+ }, {
+ default: () => {
+ var _a, _b;
+
+ return vue.h('div', vue.mergeProps(this.$attrs, {
+ class: ['v-vl', this.showScrollbar && 'v-vl--show-scrollbar'],
+ onScroll: this.handleListScroll,
+ onWheel: this.handleListWheel,
+ ref: 'listElRef'
+ }), [this.items.length !== 0 ? vue.h('div', {
+ ref: 'itemsElRef',
+ class: 'v-vl-items',
+ style: this.itemsStyle
+ }, [vue.h(visibleItemsTag, Object.assign({
+ class: 'v-vl-visible-items',
+ style: this.visibleItemsStyle
+ }, this.visibleItemsProps), {
+ default: () => this.viewportItems.map(item => {
+ const key = item[keyField];
+ const index = keyToIndex.get(key);
+ const itemVNode = this.$slots.default({
+ item,
+ index
+ })[0];
+
+ if (itemResizable) {
+ return vue.h(VResizeObserver, {
+ key,
+ onResize: entry => this.handleItemResize(key, entry)
+ }, {
+ default: () => itemVNode
+ });
+ }
+
+ itemVNode.key = key;
+ return itemVNode;
+ })
+ })]) : (_b = (_a = this.$slots).empty) === null || _b === void 0 ? void 0 : _b.call(_a)]);
+ }
+ });
+ }
+
+ });
+
+ const styles = c('.v-x-scroll', {
+ overflow: 'auto',
+ scrollbarWidth: 'none'
+ }, [c('&::-webkit-scrollbar', {
+ width: 0,
+ height: 0
+ })]);
+ var VXScroll = vue.defineComponent({
+ name: 'XScroll',
+ props: {
+ disabled: Boolean,
+ onScroll: Function
+ },
+
+ setup() {
+ const selfRef = vue.ref(null);
+
+ function handleWheel(e) {
+ const preventYWheel = e.currentTarget.offsetWidth < e.currentTarget.scrollWidth;
+ if (!preventYWheel || e.deltaY === 0) return;
+ e.currentTarget.scrollLeft += e.deltaY + e.deltaX;
+ e.preventDefault();
+ }
+
+ const ssrAdapter = useSsrAdapter();
+ styles.mount({
+ id: 'vueuc/x-scroll',
+ head: true,
+ anchorMetaName: cssrAnchorMetaName$1,
+ ssr: ssrAdapter
+ });
+ const exposedMethods = {
+ scrollTo() {
+ var _a;
+
+ (_a = selfRef.value) === null || _a === void 0 ? void 0 : _a.scrollTo(...arguments);
+ }
+
+ };
+ return Object.assign({
+ selfRef,
+ handleWheel
+ }, exposedMethods);
+ },
+
+ render() {
+ return vue.h('div', {
+ ref: 'selfRef',
+ onScroll: this.onScroll,
+ onWheel: this.disabled ? undefined : this.handleWheel,
+ class: 'v-x-scroll'
+ }, this.$slots);
+ }
+
+ });
+
+ /* eslint-disable @typescript-eslint/strict-boolean-expressions */
+ const hiddenAttr = 'v-hidden';
+ const style$1A = c('[v-hidden]', {
+ display: 'none!important'
+ });
+ var VOverflow = vue.defineComponent({
+ name: 'Overflow',
+ props: {
+ getCounter: Function,
+ getTail: Function,
+ updateCounter: Function,
+ onUpdateOverflow: Function
+ },
+
+ setup(props, _ref) {
+ let {
+ slots
+ } = _ref;
+ const selfRef = vue.ref(null);
+ const counterRef = vue.ref(null);
+
+ function deriveCounter() {
+ const {
+ value: self
+ } = selfRef;
+ const {
+ getCounter,
+ getTail
+ } = props;
+ let counter;
+ if (getCounter !== undefined) counter = getCounter();else {
+ counter = counterRef.value;
+ }
+ if (!self || !counter) return;
+
+ if (counter.hasAttribute(hiddenAttr)) {
+ counter.removeAttribute(hiddenAttr);
+ }
+
+ const {
+ children
+ } = self;
+ const containerWidth = self.offsetWidth;
+ const childWidths = [];
+ const tail = slots.tail ? getTail === null || getTail === void 0 ? void 0 : getTail() : null;
+ let childWidthSum = tail ? tail.offsetWidth : 0;
+ let overflow = false;
+ const len = self.children.length - (slots.tail ? 1 : 0);
+
+ for (let i = 0; i < len - 1; ++i) {
+ if (i < 0) continue;
+ const child = children[i];
+
+ if (overflow) {
+ if (!child.hasAttribute(hiddenAttr)) {
+ child.setAttribute(hiddenAttr, '');
+ }
+
+ continue;
+ } else if (child.hasAttribute(hiddenAttr)) {
+ child.removeAttribute(hiddenAttr);
+ }
+
+ const childWidth = child.offsetWidth;
+ childWidthSum += childWidth;
+ childWidths[i] = childWidth;
+
+ if (childWidthSum > containerWidth) {
+ const {
+ updateCounter
+ } = props;
+
+ for (let j = i; j >= 0; --j) {
+ const restCount = len - 1 - j;
+
+ if (updateCounter !== undefined) {
+ updateCounter(restCount);
+ } else {
+ counter.textContent = `${restCount}`;
+ }
+
+ const counterWidth = counter.offsetWidth;
+ childWidthSum -= childWidths[j];
+
+ if (childWidthSum + counterWidth <= containerWidth || j === 0) {
+ overflow = true;
+ i = j - 1;
+
+ if (tail) {
+ // tail too long or 1st element too long
+ // we only consider tail now
+ if (i === -1) {
+ tail.style.maxWidth = `${containerWidth - counterWidth}px`;
+ tail.style.boxSizing = 'border-box';
+ } else {
+ tail.style.maxWidth = '';
+ }
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ const {
+ onUpdateOverflow
+ } = props;
+
+ if (!overflow) {
+ if (onUpdateOverflow !== undefined) {
+ onUpdateOverflow(false);
+ }
+
+ counter.setAttribute(hiddenAttr, '');
+ } else {
+ if (onUpdateOverflow !== undefined) {
+ onUpdateOverflow(true);
+ }
+ }
+ }
+
+ const ssrAdapter = useSsrAdapter();
+ style$1A.mount({
+ id: 'vueuc/overflow',
+ head: true,
+ anchorMetaName: cssrAnchorMetaName$1,
+ ssr: ssrAdapter
+ });
+ vue.onMounted(deriveCounter); // besides onMounted, other case should be manually triggered, or we shoud watch items
+
+ return {
+ selfRef,
+ counterRef,
+ sync: deriveCounter
+ };
+ },
+
+ render() {
+ const {
+ $slots
+ } = this; // eslint-disable-next-line @typescript-eslint/no-floating-promises
+
+ vue.nextTick(this.sync); // It shouldn't have border
+
+ return vue.h('div', {
+ class: 'v-overflow',
+ ref: 'selfRef'
+ }, [vue.renderSlot($slots, 'default'), // $slots.counter should only has 1 element
+ $slots.counter ? $slots.counter() : vue.h('span', {
+ style: {
+ display: 'inline-block'
+ },
+ ref: 'counterRef'
+ }), // $slots.tail should only has 1 element
+ $slots.tail ? $slots.tail() : null]);
+ }
+
+ });
+
+ /* eslint-disable @typescript-eslint/strict-boolean-expressions */
+ // ref https://www.w3.org/TR/wai-aria-practices-1.1/examples/dialog-modal/js/dialog.js
+ function isHTMLElement(node) {
+ return node instanceof HTMLElement;
+ }
+
+ function focusFirstDescendant(node) {
+ for (let i = 0; i < node.childNodes.length; i++) {
+ const child = node.childNodes[i];
+
+ if (isHTMLElement(child)) {
+ if (attemptFocus(child) || focusFirstDescendant(child)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ function focusLastDescendant(element) {
+ for (let i = element.childNodes.length - 1; i >= 0; i--) {
+ const child = element.childNodes[i];
+
+ if (isHTMLElement(child)) {
+ if (attemptFocus(child) || focusLastDescendant(child)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ function attemptFocus(element) {
+ if (!isFocusable(element)) {
+ return false;
+ }
+
+ try {
+ element.focus({
+ preventScroll: true
+ });
+ } catch (e) {}
+
+ return document.activeElement === element;
+ }
+
+ function isFocusable(element) {
+ if (element.tabIndex > 0 || element.tabIndex === 0 && element.getAttribute('tabIndex') !== null) {
+ return true;
+ }
+
+ if (element.getAttribute('disabled')) {
+ return false;
+ }
+
+ switch (element.nodeName) {
+ case 'A':
+ return !!element.href && element.rel !== 'ignore';
+
+ case 'INPUT':
+ return element.type !== 'hidden' && element.type !== 'file';
+
+ case 'BUTTON':
+ case 'SELECT':
+ case 'TEXTAREA':
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ let stack = [];
+ const FocusTrap = vue.defineComponent({
+ name: 'FocusTrap',
+ props: {
+ disabled: Boolean,
+ active: Boolean,
+ autoFocus: {
+ type: Boolean,
+ default: true
+ },
+ onEsc: Function,
+ initialFocusTo: String,
+ finalFocusTo: String,
+ returnFocusOnDeactivated: {
+ type: Boolean,
+ default: true
+ }
+ },
+
+ setup(props) {
+ const id = createId();
+ const focusableStartRef = vue.ref(null);
+ const focusableEndRef = vue.ref(null);
+ let activated = false;
+ let ignoreInternalFocusChange = false;
+ const lastFocusedElement = document.activeElement;
+
+ function isCurrentActive() {
+ const currentActiveId = stack[stack.length - 1];
+ return currentActiveId === id;
+ }
+
+ function handleDocumentKeydown(e) {
+ var _a;
+
+ if (e.code === 'Escape') {
+ if (isCurrentActive()) {
+ (_a = props.onEsc) === null || _a === void 0 ? void 0 : _a.call(props, e);
+ }
+ }
+ }
+
+ vue.onMounted(() => {
+ vue.watch(() => props.active, value => {
+ if (value) {
+ activate();
+ on('keydown', document, handleDocumentKeydown);
+ } else {
+ off('keydown', document, handleDocumentKeydown);
+
+ if (activated) {
+ deactivate();
+ }
+ }
+ }, {
+ immediate: true
+ });
+ });
+ vue.onBeforeUnmount(() => {
+ off('keydown', document, handleDocumentKeydown);
+ if (activated) deactivate();
+ });
+
+ function handleDocumentFocus(e) {
+ if (ignoreInternalFocusChange) return;
+
+ if (isCurrentActive()) {
+ const mainEl = getMainEl();
+ if (mainEl === null) return;
+ if (mainEl.contains(getPreciseEventTarget(e))) return; // I don't handle shift + tab status since it's too tricky to handle
+ // Not impossible but I need to sleep
+
+ resetFocusTo('first');
+ }
+ }
+
+ function getMainEl() {
+ const focusableStartEl = focusableStartRef.value;
+ if (focusableStartEl === null) return null;
+ let mainEl = focusableStartEl;
+
+ while (true) {
+ mainEl = mainEl.nextSibling;
+ if (mainEl === null) break;
+
+ if (mainEl instanceof Element && mainEl.tagName === 'DIV') {
+ break;
+ }
+ }
+
+ return mainEl;
+ }
+
+ function activate() {
+ var _a;
+
+ if (props.disabled) return;
+ stack.push(id);
+
+ if (props.autoFocus) {
+ const {
+ initialFocusTo
+ } = props;
+
+ if (initialFocusTo === undefined) {
+ resetFocusTo('first');
+ } else {
+ (_a = resolveTo(initialFocusTo)) === null || _a === void 0 ? void 0 : _a.focus({
+ preventScroll: true
+ });
+ }
+ }
+
+ activated = true;
+ document.addEventListener('focus', handleDocumentFocus, true);
+ }
+
+ function deactivate() {
+ var _a;
+
+ if (props.disabled) return;
+ document.removeEventListener('focus', handleDocumentFocus, true);
+ stack = stack.filter(idInStack => idInStack !== id);
+ if (isCurrentActive()) return;
+ const {
+ finalFocusTo
+ } = props;
+
+ if (finalFocusTo !== undefined) {
+ (_a = resolveTo(finalFocusTo)) === null || _a === void 0 ? void 0 : _a.focus({
+ preventScroll: true
+ });
+ } else if (props.returnFocusOnDeactivated) {
+ if (lastFocusedElement instanceof HTMLElement) {
+ ignoreInternalFocusChange = true;
+ lastFocusedElement.focus({
+ preventScroll: true
+ });
+ ignoreInternalFocusChange = false;
+ }
+ }
+ }
+
+ function resetFocusTo(target) {
+ if (!isCurrentActive()) return;
+
+ if (props.active) {
+ const focusableStartEl = focusableStartRef.value;
+ const focusableEndEl = focusableEndRef.value;
+
+ if (focusableStartEl !== null && focusableEndEl !== null) {
+ const mainEl = getMainEl();
+
+ if (mainEl == null || mainEl === focusableEndEl) {
+ ignoreInternalFocusChange = true;
+ focusableStartEl.focus({
+ preventScroll: true
+ });
+ ignoreInternalFocusChange = false;
+ return;
+ }
+
+ ignoreInternalFocusChange = true;
+ const focused = target === 'first' ? focusFirstDescendant(mainEl) : focusLastDescendant(mainEl);
+ ignoreInternalFocusChange = false;
+
+ if (!focused) {
+ ignoreInternalFocusChange = true;
+ focusableStartEl.focus({
+ preventScroll: true
+ });
+ ignoreInternalFocusChange = false;
+ }
+ }
+ }
+ }
+
+ function handleStartFocus(e) {
+ if (ignoreInternalFocusChange) return;
+ const mainEl = getMainEl();
+ if (mainEl === null) return;
+
+ if (e.relatedTarget !== null && mainEl.contains(e.relatedTarget)) {
+ // if it comes from inner, focus last
+ resetFocusTo('last');
+ } else {
+ // otherwise focus first
+ resetFocusTo('first');
+ }
+ }
+
+ function handleEndFocus(e) {
+ if (ignoreInternalFocusChange) return;
+
+ if (e.relatedTarget !== null && e.relatedTarget === focusableStartRef.value) {
+ // if it comes from first, focus last
+ resetFocusTo('last');
+ } else {
+ // otherwise focus first
+ resetFocusTo('first');
+ }
+ }
+
+ return {
+ focusableStartRef,
+ focusableEndRef,
+ focusableStyle: 'position: absolute; height: 0; width: 0;',
+ handleStartFocus,
+ handleEndFocus
+ };
+ },
+
+ render() {
+ const {
+ default: defaultSlot
+ } = this.$slots;
+ if (defaultSlot === undefined) return null;
+ if (this.disabled) return defaultSlot();
+ const {
+ active,
+ focusableStyle
+ } = this;
+ return vue.h(vue.Fragment, null, [vue.h('div', {
+ 'aria-hidden': 'true',
+ tabindex: active ? '0' : '-1',
+ ref: 'focusableStartRef',
+ style: focusableStyle,
+ onFocus: this.handleStartFocus
+ }), defaultSlot(), vue.h('div', {
+ 'aria-hidden': 'true',
+ style: focusableStyle,
+ ref: 'focusableEndRef',
+ tabindex: active ? '0' : '-1',
+ onFocus: this.handleEndFocus
+ })]);
+ }
+
+ });
+
+ function useOnResize(elRef, onResize) {
+ if (onResize) {
+ vue.onMounted(() => {
+ const {
+ value: el
+ } = elRef;
+
+ if (el) {
+ resizeObserverManager.registerHandler(el, onResize);
+ }
+ });
+ vue.onBeforeUnmount(() => {
+ const {
+ value: el
+ } = elRef;
+
+ if (el) {
+ resizeObserverManager.unregisterHandler(el);
+ }
+ });
+ }
+ }
+
+ let lockCount = 0;
+ let originalMarginRight = "";
+ let originalOverflow = "";
+ let originalOverflowX = "";
+ let originalOverflowY = "";
+ const lockHtmlScrollRightCompensationRef = vue.ref("0px");
+ function useLockHtmlScroll(lockRef) {
+ if (typeof document === "undefined") return;
+ const el = document.documentElement;
+ let watchStopHandle;
+ let activated = false;
+
+ const unlock = () => {
+ el.style.marginRight = originalMarginRight;
+ el.style.overflow = originalOverflow;
+ el.style.overflowX = originalOverflowX;
+ el.style.overflowY = originalOverflowY;
+ lockHtmlScrollRightCompensationRef.value = "0px";
+ };
+
+ vue.onMounted(() => {
+ watchStopHandle = vue.watch(lockRef, value => {
+ if (value) {
+ if (!lockCount) {
+ const scrollbarWidth = window.innerWidth - el.offsetWidth;
+
+ if (scrollbarWidth > 0) {
+ originalMarginRight = el.style.marginRight;
+ el.style.marginRight = `${scrollbarWidth}px`;
+ lockHtmlScrollRightCompensationRef.value = `${scrollbarWidth}px`;
+ }
+
+ originalOverflow = el.style.overflow;
+ originalOverflowX = el.style.overflowX;
+ originalOverflowY = el.style.overflowY;
+ el.style.overflow = "hidden";
+ el.style.overflowX = "hidden";
+ el.style.overflowY = "hidden";
+ }
+
+ activated = true;
+ lockCount++;
+ } else {
+ lockCount--;
+
+ if (!lockCount) {
+ unlock();
+ }
+
+ activated = false;
+ }
+ }, {
+ immediate: true
+ });
+ });
+ vue.onBeforeUnmount(() => {
+ watchStopHandle?.();
+
+ if (activated) {
+ lockCount--;
+
+ if (!lockCount) {
+ unlock();
+ }
+
+ activated = false;
+ }
+ });
+ }
+
+ const isComposingRef = vue.ref(false);
+
+ const compositionStartHandler = () => {
+ isComposingRef.value = true;
+ };
+
+ const compositionEndHandler = () => {
+ isComposingRef.value = false;
+ };
+
+ let mountedCount = 0;
+ const useIsComposing = () => {
+ if (isBrowser$2) {
+ vue.onBeforeMount(() => {
+ if (!mountedCount) {
+ window.addEventListener("compositionstart", compositionStartHandler);
+ window.addEventListener("compositionend", compositionEndHandler);
+ }
+
+ mountedCount++;
+ });
+ vue.onBeforeUnmount(() => {
+ if (mountedCount <= 1) {
+ window.removeEventListener("compositionstart", compositionStartHandler);
+ window.removeEventListener("compositionend", compositionEndHandler);
+ mountedCount = 0;
+ } else {
+ mountedCount--;
+ }
+ });
+ }
+
+ return isComposingRef;
+ };
+
+ function useReactivated(callback) {
+ const isDeactivatedRef = {
+ isDeactivated: false
+ };
+ let activateStateInitialized = false;
+ vue.onActivated(() => {
+ isDeactivatedRef.isDeactivated = false;
+
+ if (!activateStateInitialized) {
+ activateStateInitialized = true;
+ return;
+ }
+
+ callback();
+ });
+ vue.onDeactivated(() => {
+ isDeactivatedRef.isDeactivated = true;
+
+ if (!activateStateInitialized) {
+ activateStateInitialized = true;
+ }
+ });
+ return isDeactivatedRef;
+ }
+
+ function isDocument(node) {
+ return node.nodeName === "#document";
+ }
+
+ const formItemInjectionKey = createInjectionKey("n-form-item");
+ function useFormItem(props) {
+ let {
+ defaultSize = "medium",
+ mergedSize,
+ mergedDisabled
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ const NFormItem = vue.inject(formItemInjectionKey, null);
+ vue.provide(formItemInjectionKey, null);
+ const mergedSizeRef = vue.computed(mergedSize ? () => mergedSize(NFormItem) : () => {
+ const {
+ size
+ } = props;
+ if (size) return size;
+
+ if (NFormItem) {
+ const {
+ mergedSize: mergedSize2
+ } = NFormItem;
+
+ if (mergedSize2.value !== void 0) {
+ return mergedSize2.value;
+ }
+ }
+
+ return defaultSize;
+ });
+ const mergedDisabledRef = vue.computed(mergedDisabled ? () => mergedDisabled(NFormItem) : () => {
+ const {
+ disabled
+ } = props;
+
+ if (disabled !== void 0) {
+ return disabled;
+ }
+
+ if (NFormItem) {
+ return NFormItem.disabled.value;
+ }
+
+ return false;
+ });
+ const mergedStatusRef = vue.computed(() => {
+ const {
+ status
+ } = props;
+ if (status) return status;
+ return NFormItem?.mergedValidationStatus.value;
+ });
+ vue.onBeforeUnmount(() => {
+ if (NFormItem) {
+ NFormItem.restoreValidation();
+ }
+ });
+ return {
+ mergedSizeRef,
+ mergedDisabledRef,
+ mergedStatusRef,
+
+ nTriggerFormBlur() {
+ if (NFormItem) {
+ NFormItem.handleContentBlur();
+ }
+ },
+
+ nTriggerFormChange() {
+ if (NFormItem) {
+ NFormItem.handleContentChange();
+ }
+ },
+
+ nTriggerFormFocus() {
+ if (NFormItem) {
+ NFormItem.handleContentFocus();
+ }
+ },
+
+ nTriggerFormInput() {
+ if (NFormItem) {
+ NFormItem.handleContentInput();
+ }
+ }
+
+ };
+ }
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ var lodash = {exports: {}};
+
+ /**
+ * @license
+ * Lodash
+ * Copyright OpenJS Foundation and other contributors
+ * Released under MIT license
+ * Based on Underscore.js 1.8.3
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+ (function (module, exports) {
+ (function(){/** Used as a safe reference for `undefined` in pre-ES5 environments. */var undefined$1;/** Used as the semantic version number. */var VERSION='4.17.21';/** Used as the size to enable large array optimizations. */var LARGE_ARRAY_SIZE=200;/** Error message constants. */var CORE_ERROR_TEXT='Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',FUNC_ERROR_TEXT='Expected a function',INVALID_TEMPL_VAR_ERROR_TEXT='Invalid `variable` option passed into `_.template`';/** Used to stand-in for `undefined` hash values. */var HASH_UNDEFINED='__lodash_hash_undefined__';/** Used as the maximum memoize cache size. */var MAX_MEMOIZE_SIZE=500;/** Used as the internal argument placeholder. */var PLACEHOLDER='__lodash_placeholder__';/** Used to compose bitmasks for cloning. */var CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4;/** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;/** Used to compose bitmasks for function metadata. */var WRAP_BIND_FLAG=1,WRAP_BIND_KEY_FLAG=2,WRAP_CURRY_BOUND_FLAG=4,WRAP_CURRY_FLAG=8,WRAP_CURRY_RIGHT_FLAG=16,WRAP_PARTIAL_FLAG=32,WRAP_PARTIAL_RIGHT_FLAG=64,WRAP_ARY_FLAG=128,WRAP_REARG_FLAG=256,WRAP_FLIP_FLAG=512;/** Used as default options for `_.truncate`. */var DEFAULT_TRUNC_LENGTH=30,DEFAULT_TRUNC_OMISSION='...';/** Used to detect hot functions by number of calls within a span of milliseconds. */var HOT_COUNT=800,HOT_SPAN=16;/** Used to indicate the type of lazy iteratees. */var LAZY_FILTER_FLAG=1,LAZY_MAP_FLAG=2,LAZY_WHILE_FLAG=3;/** Used as references for various `Number` constants. */var INFINITY=1/0,MAX_SAFE_INTEGER=9007199254740991,MAX_INTEGER=1.7976931348623157e+308,NAN=0/0;/** Used as references for the maximum length and index of an array. */var MAX_ARRAY_LENGTH=4294967295,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1;/** Used to associate wrap methods with their bit flags. */var wrapFlags=[['ary',WRAP_ARY_FLAG],['bind',WRAP_BIND_FLAG],['bindKey',WRAP_BIND_KEY_FLAG],['curry',WRAP_CURRY_FLAG],['curryRight',WRAP_CURRY_RIGHT_FLAG],['flip',WRAP_FLIP_FLAG],['partial',WRAP_PARTIAL_FLAG],['partialRight',WRAP_PARTIAL_RIGHT_FLAG],['rearg',WRAP_REARG_FLAG]];/** `Object#toString` result references. */var argsTag='[object Arguments]',arrayTag='[object Array]',asyncTag='[object AsyncFunction]',boolTag='[object Boolean]',dateTag='[object Date]',domExcTag='[object DOMException]',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]',weakSetTag='[object WeakSet]';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 empty string literals in compiled template source. */var reEmptyStringLeading=/\b__p \+= '';/g,reEmptyStringMiddle=/\b(__p \+=) '' \+/g,reEmptyStringTrailing=/(__e\(.*?\)|\b__t\)) \+\n'';/g;/** Used to match HTML entities and HTML characters. */var reEscapedHtml=/&(?:amp|lt|gt|quot|#39);/g,reUnescapedHtml=/[&<>"']/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source);/** Used to match template delimiters. */var reEscape=/<%-([\s\S]+?)%>/g,reEvaluate=/<%([\s\S]+?)%>/g,reInterpolate=/<%=([\s\S]+?)%>/g;/** Used to match property names within property paths. */var reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/,rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;/**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */var reRegExpChar=/[\\^$.*+?()[\]{}|]/g,reHasRegExpChar=RegExp(reRegExpChar.source);/** Used to match leading whitespace. */var reTrimStart=/^\s+/;/** Used to match a single whitespace character. */var reWhitespace=/\s/;/** Used to match wrap detail comments. */var reWrapComment=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,reWrapDetails=/\{\n\/\* \[wrapped with (.+)\] \*/,reSplitDetails=/,? & /;/** Used to match words composed of alphanumeric characters. */var reAsciiWord=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;/**
+ * Used to validate the `validate` option in `_.template` variable.
+ *
+ * Forbids characters which could potentially change the meaning of the function argument definition:
+ * - "()," (modification of function parameters)
+ * - "=" (default value)
+ * - "[]{}" (destructuring of function parameters)
+ * - "/" (beginning of a comment)
+ * - whitespace
+ */var reForbiddenIdentifierChars=/[()=,{}\[\]\/\s]/;/** Used to match backslashes in property paths. */var reEscapeChar=/\\(\\)?/g;/**
+ * Used to match
+ * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
+ */var reEsTemplate=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;/** Used to match `RegExp` flags from their coerced string values. */var reFlags=/\w*$/;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex=/^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary=/^0b[01]+$/i;/** Used to detect host constructors (Safari). */var reIsHostCtor=/^\[object .+?Constructor\]$/;/** Used to detect octal string values. */var reIsOctal=/^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint=/^(?:0|[1-9]\d*)$/;/** Used to match Latin Unicode letters (excluding mathematical operators). */var reLatin=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;/** Used to ensure capturing order of template delimiters. */var reNoMatch=/($^)/;/** Used to match unescaped characters in compiled string literals. */var reUnescapedString=/['\n\r\u2028\u2029\\]/g;/** Used to compose unicode character classes. */var rsAstralRange='\\ud800-\\udfff',rsComboMarksRange='\\u0300-\\u036f',reComboHalfMarksRange='\\ufe20-\\ufe2f',rsComboSymbolsRange='\\u20d0-\\u20ff',rsComboRange=rsComboMarksRange+reComboHalfMarksRange+rsComboSymbolsRange,rsDingbatRange='\\u2700-\\u27bf',rsLowerRange='a-z\\xdf-\\xf6\\xf8-\\xff',rsMathOpRange='\\xac\\xb1\\xd7\\xf7',rsNonCharRange='\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',rsPunctuationRange='\\u2000-\\u206f',rsSpaceRange=' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',rsUpperRange='A-Z\\xc0-\\xd6\\xd8-\\xde',rsVarRange='\\ufe0e\\ufe0f',rsBreakRange=rsMathOpRange+rsNonCharRange+rsPunctuationRange+rsSpaceRange;/** Used to compose unicode capture groups. */var rsApos="['\u2019]",rsAstral='['+rsAstralRange+']',rsBreak='['+rsBreakRange+']',rsCombo='['+rsComboRange+']',rsDigits='\\d+',rsDingbat='['+rsDingbatRange+']',rsLower='['+rsLowerRange+']',rsMisc='[^'+rsAstralRange+rsBreakRange+rsDigits+rsDingbatRange+rsLowerRange+rsUpperRange+']',rsFitz='\\ud83c[\\udffb-\\udfff]',rsModifier='(?:'+rsCombo+'|'+rsFitz+')',rsNonAstral='[^'+rsAstralRange+']',rsRegional='(?:\\ud83c[\\udde6-\\uddff]){2}',rsSurrPair='[\\ud800-\\udbff][\\udc00-\\udfff]',rsUpper='['+rsUpperRange+']',rsZWJ='\\u200d';/** Used to compose unicode regexes. */var rsMiscLower='(?:'+rsLower+'|'+rsMisc+')',rsMiscUpper='(?:'+rsUpper+'|'+rsMisc+')',rsOptContrLower='(?:'+rsApos+'(?:d|ll|m|re|s|t|ve))?',rsOptContrUpper='(?:'+rsApos+'(?:D|LL|M|RE|S|T|VE))?',reOptMod=rsModifier+'?',rsOptVar='['+rsVarRange+']?',rsOptJoin='(?:'+rsZWJ+'(?:'+[rsNonAstral,rsRegional,rsSurrPair].join('|')+')'+rsOptVar+reOptMod+')*',rsOrdLower='\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',rsOrdUpper='\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',rsSeq=rsOptVar+reOptMod+rsOptJoin,rsEmoji='(?:'+[rsDingbat,rsRegional,rsSurrPair].join('|')+')'+rsSeq,rsSymbol='(?:'+[rsNonAstral+rsCombo+'?',rsCombo,rsRegional,rsSurrPair,rsAstral].join('|')+')';/** Used to match apostrophes. */var reApos=RegExp(rsApos,'g');/**
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+ */var reComboMark=RegExp(rsCombo,'g');/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */var reUnicode=RegExp(rsFitz+'(?='+rsFitz+')|'+rsSymbol+rsSeq,'g');/** Used to match complex or compound words. */var reUnicodeWord=RegExp([rsUpper+'?'+rsLower+'+'+rsOptContrLower+'(?='+[rsBreak,rsUpper,'$'].join('|')+')',rsMiscUpper+'+'+rsOptContrUpper+'(?='+[rsBreak,rsUpper+rsMiscLower,'$'].join('|')+')',rsUpper+'?'+rsMiscLower+'+'+rsOptContrLower,rsUpper+'+'+rsOptContrUpper,rsOrdUpper,rsOrdLower,rsDigits,rsEmoji].join('|'),'g');/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */var reHasUnicode=RegExp('['+rsZWJ+rsAstralRange+rsComboRange+rsVarRange+']');/** Used to detect strings that need a more robust regexp to match words. */var reHasUnicodeWord=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;/** Used to assign default `context` object properties. */var contextProps=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'];/** Used to make template sourceURLs easier to identify. */var templateCounter=-1;/** 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;/** Used to identify `toStringTag` values supported by `_.clone`. */var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=true;cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=false;/** Used to map Latin Unicode letters to basic Latin letters. */var deburredLetters={// Latin-1 Supplement block.
+ '\xc0':'A','\xc1':'A','\xc2':'A','\xc3':'A','\xc4':'A','\xc5':'A','\xe0':'a','\xe1':'a','\xe2':'a','\xe3':'a','\xe4':'a','\xe5':'a','\xc7':'C','\xe7':'c','\xd0':'D','\xf0':'d','\xc8':'E','\xc9':'E','\xca':'E','\xcb':'E','\xe8':'e','\xe9':'e','\xea':'e','\xeb':'e','\xcc':'I','\xcd':'I','\xce':'I','\xcf':'I','\xec':'i','\xed':'i','\xee':'i','\xef':'i','\xd1':'N','\xf1':'n','\xd2':'O','\xd3':'O','\xd4':'O','\xd5':'O','\xd6':'O','\xd8':'O','\xf2':'o','\xf3':'o','\xf4':'o','\xf5':'o','\xf6':'o','\xf8':'o','\xd9':'U','\xda':'U','\xdb':'U','\xdc':'U','\xf9':'u','\xfa':'u','\xfb':'u','\xfc':'u','\xdd':'Y','\xfd':'y','\xff':'y','\xc6':'Ae','\xe6':'ae','\xde':'Th','\xfe':'th','\xdf':'ss',// Latin Extended-A block.
+ '\u0100':'A','\u0102':'A','\u0104':'A','\u0101':'a','\u0103':'a','\u0105':'a','\u0106':'C','\u0108':'C','\u010a':'C','\u010c':'C','\u0107':'c','\u0109':'c','\u010b':'c','\u010d':'c','\u010e':'D','\u0110':'D','\u010f':'d','\u0111':'d','\u0112':'E','\u0114':'E','\u0116':'E','\u0118':'E','\u011a':'E','\u0113':'e','\u0115':'e','\u0117':'e','\u0119':'e','\u011b':'e','\u011c':'G','\u011e':'G','\u0120':'G','\u0122':'G','\u011d':'g','\u011f':'g','\u0121':'g','\u0123':'g','\u0124':'H','\u0126':'H','\u0125':'h','\u0127':'h','\u0128':'I','\u012a':'I','\u012c':'I','\u012e':'I','\u0130':'I','\u0129':'i','\u012b':'i','\u012d':'i','\u012f':'i','\u0131':'i','\u0134':'J','\u0135':'j','\u0136':'K','\u0137':'k','\u0138':'k','\u0139':'L','\u013b':'L','\u013d':'L','\u013f':'L','\u0141':'L','\u013a':'l','\u013c':'l','\u013e':'l','\u0140':'l','\u0142':'l','\u0143':'N','\u0145':'N','\u0147':'N','\u014a':'N','\u0144':'n','\u0146':'n','\u0148':'n','\u014b':'n','\u014c':'O','\u014e':'O','\u0150':'O','\u014d':'o','\u014f':'o','\u0151':'o','\u0154':'R','\u0156':'R','\u0158':'R','\u0155':'r','\u0157':'r','\u0159':'r','\u015a':'S','\u015c':'S','\u015e':'S','\u0160':'S','\u015b':'s','\u015d':'s','\u015f':'s','\u0161':'s','\u0162':'T','\u0164':'T','\u0166':'T','\u0163':'t','\u0165':'t','\u0167':'t','\u0168':'U','\u016a':'U','\u016c':'U','\u016e':'U','\u0170':'U','\u0172':'U','\u0169':'u','\u016b':'u','\u016d':'u','\u016f':'u','\u0171':'u','\u0173':'u','\u0174':'W','\u0175':'w','\u0176':'Y','\u0177':'y','\u0178':'Y','\u0179':'Z','\u017b':'Z','\u017d':'Z','\u017a':'z','\u017c':'z','\u017e':'z','\u0132':'IJ','\u0133':'ij','\u0152':'Oe','\u0153':'oe','\u0149':"'n",'\u017f':'s'};/** Used to map characters to HTML entities. */var htmlEscapes={'&':'&','<':'<','>':'>','"':'"',"'":'''};/** Used to map HTML entities to characters. */var htmlUnescapes={'&':'&','<':'<','>':'>','"':'"',''':"'"};/** Used to escape characters for inclusion in compiled string literals. */var stringEscapes={'\\':'\\',"'":"'",'\n':'n','\r':'r','\u2028':'u2028','\u2029':'u2029'};/** Built-in method references without a dependency on `root`. */var freeParseFloat=parseFloat,freeParseInt=parseInt;/** 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{// Use `util.types` for Node.js 10+.
+ var types=freeModule&&freeModule.require&&freeModule.require('util').types;if(types){return types;}// Legacy `process.binding('util')` for Node.js < 10.
+ return freeProcess&&freeProcess.binding&&freeProcess.binding('util');}catch(e){}}();/* Node.js helper references. */var nodeIsArrayBuffer=nodeUtil&&nodeUtil.isArrayBuffer,nodeIsDate=nodeUtil&&nodeUtil.isDate,nodeIsMap=nodeUtil&&nodeUtil.isMap,nodeIsRegExp=nodeUtil&&nodeUtil.isRegExp,nodeIsSet=nodeUtil&&nodeUtil.isSet,nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;/*--------------------------------------------------------------------------*/ /**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2]);}return func.apply(thisArg,args);}/**
+ * A specialized version of `baseAggregator` for arrays.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform keys.
+ * @param {Object} accumulator The initial aggregated object.
+ * @returns {Function} Returns `accumulator`.
+ */function arrayAggregator(array,setter,iteratee,accumulator){var index=-1,length=array==null?0:array.length;while(++index-1;}/**
+ * This function is like `arrayIncludes` except that it accepts a comparator.
+ *
+ * @private
+ * @param {Array} [array] The array to inspect.
+ * @param {*} target The value to search for.
+ * @param {Function} comparator The comparator invoked per element.
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
+ */function arrayIncludesWith(array,value,comparator){var index=-1,length=array==null?0:array.length;while(++index-1){}return index;}/**
+ * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
+ * that is not found in the character symbols.
+ *
+ * @private
+ * @param {Array} strSymbols The string symbols to inspect.
+ * @param {Array} chrSymbols The character symbols to find.
+ * @returns {number} Returns the index of the last unmatched string symbol.
+ */function charsEndIndex(strSymbols,chrSymbols){var index=strSymbols.length;while(index--&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1){}return index;}/**
+ * Gets the number of `placeholder` occurrences in `array`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} placeholder The placeholder to search for.
+ * @returns {number} Returns the placeholder count.
+ */function countHolders(array,placeholder){var length=array.length,result=0;while(length--){if(array[length]===placeholder){++result;}}return result;}/**
+ * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+ * letters to basic Latin letters.
+ *
+ * @private
+ * @param {string} letter The matched letter to deburr.
+ * @returns {string} Returns the deburred letter.
+ */var deburrLetter=basePropertyOf(deburredLetters);/**
+ * Used by `_.escape` to convert characters to HTML entities.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */var escapeHtmlChar=basePropertyOf(htmlEscapes);/**
+ * Used by `_.template` to escape characters for inclusion in compiled string literals.
+ *
+ * @private
+ * @param {string} chr The matched character to escape.
+ * @returns {string} Returns the escaped character.
+ */function escapeStringChar(chr){return '\\'+stringEscapes[chr];}/**
+ * 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$1:object[key];}/**
+ * Checks if `string` contains Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+ */function hasUnicode(string){return reHasUnicode.test(string);}/**
+ * Checks if `string` contains a word composed of Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a word is found, else `false`.
+ */function hasUnicodeWord(string){return reHasUnicodeWord.test(string);}/**
+ * Converts `iterator` to an array.
+ *
+ * @private
+ * @param {Object} iterator The iterator to convert.
+ * @returns {Array} Returns the converted array.
+ */function iteratorToArray(iterator){var data,result=[];while(!(data=iterator.next()).done){result.push(data.value);}return result;}/**
+ * 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));};}/**
+ * Replaces all `placeholder` elements in `array` with an internal placeholder
+ * and returns an array of their indexes.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {*} placeholder The placeholder to replace.
+ * @returns {Array} Returns the new array of placeholder indexes.
+ */function replaceHolders(array,placeholder){var index=-1,length=array.length,resIndex=0,result=[];while(++index true
+ * _.isFunction(_.bar);
+ * // => false
+ *
+ * lodash.isFunction(lodash.foo);
+ * // => false
+ * lodash.isFunction(lodash.bar);
+ * // => true
+ *
+ * // Create a suped-up `defer` in Node.js.
+ * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+ */var runInContext=function runInContext(context){context=context==null?root:_.defaults(root.Object(),context,_.pick(root,contextProps));/** Built-in constructor references. */var Array=context.Array,Date=context.Date,Error=context.Error,Function=context.Function,Math=context.Math,Object=context.Object,RegExp=context.RegExp,String=context.String,TypeError=context.TypeError;/** 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=context['__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 generate unique IDs. */var idCounter=0;/** 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 infer the `Object` constructor. */var objectCtorString=funcToString.call(Object);/** Used to restore the original `_` reference in `_.noConflict`. */var oldDash=root._;/** 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?context.Buffer:undefined$1,Symbol=context.Symbol,Uint8Array=context.Uint8Array,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined$1,getPrototype=overArg(Object.getPrototypeOf,Object),objectCreate=Object.create,propertyIsEnumerable=objectProto.propertyIsEnumerable,splice=arrayProto.splice,spreadableSymbol=Symbol?Symbol.isConcatSpreadable:undefined$1,symIterator=Symbol?Symbol.iterator:undefined$1,symToStringTag=Symbol?Symbol.toStringTag:undefined$1;var defineProperty=function(){try{var func=getNative(Object,'defineProperty');func({},'',{});return func;}catch(e){}}();/** Mocked built-ins. */var ctxClearTimeout=context.clearTimeout!==root.clearTimeout&&context.clearTimeout,ctxNow=Date&&Date.now!==root.Date.now&&Date.now,ctxSetTimeout=context.setTimeout!==root.setTimeout&&context.setTimeout;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeCeil=Math.ceil,nativeFloor=Math.floor,nativeGetSymbols=Object.getOwnPropertySymbols,nativeIsBuffer=Buffer?Buffer.isBuffer:undefined$1,nativeIsFinite=context.isFinite,nativeJoin=arrayProto.join,nativeKeys=overArg(Object.keys,Object),nativeMax=Math.max,nativeMin=Math.min,nativeNow=Date.now,nativeParseInt=context.parseInt,nativeRandom=Math.random,nativeReverse=arrayProto.reverse;/* Built-in method references that are verified to be native. */var DataView=getNative(context,'DataView'),Map=getNative(context,'Map'),Promise=getNative(context,'Promise'),Set=getNative(context,'Set'),WeakMap=getNative(context,'WeakMap'),nativeCreate=getNative(Object,'create');/** Used to store function metadata. */var metaMap=WeakMap&&new WeakMap();/** Used to lookup unminified function names. */var realNames={};/** 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$1,symbolValueOf=symbolProto?symbolProto.valueOf:undefined$1,symbolToString=symbolProto?symbolProto.toString:undefined$1;/*------------------------------------------------------------------------*/ /**
+ * Creates a `lodash` object which wraps `value` to enable implicit method
+ * chain sequences. Methods that operate on and return arrays, collections,
+ * and functions can be chained together. Methods that retrieve a single value
+ * or may return a primitive value will automatically end the chain sequence
+ * and return the unwrapped value. Otherwise, the value must be unwrapped
+ * with `_#value`.
+ *
+ * Explicit chain sequences, which must be unwrapped with `_#value`, may be
+ * enabled using `_.chain`.
+ *
+ * The execution of chained methods is lazy, that is, it's deferred until
+ * `_#value` is implicitly or explicitly called.
+ *
+ * Lazy evaluation allows several methods to support shortcut fusion.
+ * Shortcut fusion is an optimization to merge iteratee calls; this avoids
+ * the creation of intermediate arrays and can greatly reduce the number of
+ * iteratee executions. Sections of a chain sequence qualify for shortcut
+ * fusion if the section is applied to an array and iteratees accept only
+ * one argument. The heuristic for whether a section qualifies for shortcut
+ * fusion is subject to change.
+ *
+ * Chaining is supported in custom builds as long as the `_#value` method is
+ * directly or indirectly included in the build.
+ *
+ * In addition to lodash methods, wrappers have `Array` and `String` methods.
+ *
+ * The wrapper `Array` methods are:
+ * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
+ *
+ * The wrapper `String` methods are:
+ * `replace` and `split`
+ *
+ * The wrapper methods that support shortcut fusion are:
+ * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
+ * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
+ * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
+ *
+ * The chainable wrapper methods are:
+ * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
+ * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
+ * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
+ * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
+ * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
+ * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
+ * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
+ * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
+ * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
+ * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
+ * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
+ * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
+ * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
+ * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
+ * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
+ * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
+ * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
+ * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
+ * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
+ * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
+ * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
+ * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
+ * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
+ * `zipObject`, `zipObjectDeep`, and `zipWith`
+ *
+ * The wrapper methods that are **not** chainable by default are:
+ * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+ * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+ * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+ * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+ * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+ * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+ * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+ * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+ * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
+ * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
+ * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
+ * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
+ * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
+ * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
+ * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
+ * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
+ * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
+ * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
+ * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
+ * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
+ * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
+ * `upperFirst`, `value`, and `words`
+ *
+ * @name _
+ * @constructor
+ * @category Seq
+ * @param {*} value The value to wrap in a `lodash` instance.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var wrapped = _([1, 2, 3]);
+ *
+ * // Returns an unwrapped value.
+ * wrapped.reduce(_.add);
+ * // => 6
+ *
+ * // Returns a wrapped value.
+ * var squares = wrapped.map(square);
+ *
+ * _.isArray(squares);
+ * // => false
+ *
+ * _.isArray(squares.value());
+ * // => true
+ */function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper){return value;}if(hasOwnProperty.call(value,'__wrapped__')){return wrapperClone(value);}}return new LodashWrapper(value);}/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} proto The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */var baseCreate=function(){function object(){}return function(proto){if(!isObject(proto)){return {};}if(objectCreate){return objectCreate(proto);}object.prototype=proto;var result=new object();object.prototype=undefined$1;return result;};}();/**
+ * The function whose prototype chain sequence wrappers inherit from.
+ *
+ * @private
+ */function baseLodash(){// No operation performed.
+ }/**
+ * The base constructor for creating `lodash` wrapper objects.
+ *
+ * @private
+ * @param {*} value The value to wrap.
+ * @param {boolean} [chainAll] Enable explicit method chain sequences.
+ */function LodashWrapper(value,chainAll){this.__wrapped__=value;this.__actions__=[];this.__chain__=!!chainAll;this.__index__=0;this.__values__=undefined$1;}/**
+ * By default, the template delimiters used by lodash are like those in
+ * embedded Ruby (ERB) as well as ES2015 template strings. Change the
+ * following template settings to use alternative delimiters.
+ *
+ * @static
+ * @memberOf _
+ * @type {Object}
+ */lodash.templateSettings={/**
+ * Used to detect `data` property values to be HTML-escaped.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */'escape':reEscape,/**
+ * Used to detect code to be evaluated.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */'evaluate':reEvaluate,/**
+ * Used to detect `data` property values to inject.
+ *
+ * @memberOf _.templateSettings
+ * @type {RegExp}
+ */'interpolate':reInterpolate,/**
+ * Used to reference the data object in the template text.
+ *
+ * @memberOf _.templateSettings
+ * @type {string}
+ */'variable':'',/**
+ * Used to import variables into the compiled template.
+ *
+ * @memberOf _.templateSettings
+ * @type {Object}
+ */'imports':{/**
+ * A reference to the `lodash` function.
+ *
+ * @memberOf _.templateSettings.imports
+ * @type {Function}
+ */'_':lodash}};// Ensure wrappers are instances of `baseLodash`.
+ lodash.prototype=baseLodash.prototype;lodash.prototype.constructor=lodash;LodashWrapper.prototype=baseCreate(baseLodash.prototype);LodashWrapper.prototype.constructor=LodashWrapper;/*------------------------------------------------------------------------*/ /**
+ * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+ *
+ * @private
+ * @constructor
+ * @param {*} value The value to wrap.
+ */function LazyWrapper(value){this.__wrapped__=value;this.__actions__=[];this.__dir__=1;this.__filtered__=false;this.__iteratees__=[];this.__takeCount__=MAX_ARRAY_LENGTH;this.__views__=[];}/**
+ * Creates a clone of the lazy wrapper object.
+ *
+ * @private
+ * @name clone
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the cloned `LazyWrapper` object.
+ */function lazyClone(){var result=new LazyWrapper(this.__wrapped__);result.__actions__=copyArray(this.__actions__);result.__dir__=this.__dir__;result.__filtered__=this.__filtered__;result.__iteratees__=copyArray(this.__iteratees__);result.__takeCount__=this.__takeCount__;result.__views__=copyArray(this.__views__);return result;}/**
+ * Reverses the direction of lazy iteration.
+ *
+ * @private
+ * @name reverse
+ * @memberOf LazyWrapper
+ * @returns {Object} Returns the new reversed `LazyWrapper` object.
+ */function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1;result.__filtered__=true;}else {result=this.clone();result.__dir__*=-1;}return result;}/**
+ * Extracts the unwrapped value from its lazy wrapper.
+ *
+ * @private
+ * @name value
+ * @memberOf LazyWrapper
+ * @returns {*} Returns the unwrapped value.
+ */function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=getView(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||!isRight&&arrLength==length&&takeCount==length){return baseWrapperValue(array,this.__actions__);}var result=[];outer:while(length--&&resIndex-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=lower?number:lower;}}return number;}/**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} bitmask The bitmask flags.
+ * 1 - Deep clone
+ * 2 - Flatten inherited properties
+ * 4 - Clone symbols
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer){result=object?customizer(value,key,object,stack):customizer(value);}if(result!==undefined$1){return result;}if(!isObject(value)){return value;}var isArr=isArray(value);if(isArr){result=initCloneArray(value);if(!isDeep){return copyArray(value,result);}}else {var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value)){return cloneBuffer(value,isDeep);}if(tag==objectTag||tag==argsTag||isFunc&&!object){result=isFlat||isFunc?{}:initCloneObject(value);if(!isDeep){return isFlat?copySymbolsIn(value,baseAssignIn(result,value)):copySymbols(value,baseAssign(result,value));}}else {if(!cloneableTags[tag]){return object?value:{};}result=initCloneByTag(value,tag,isDeep);}}// Check for circular references and return its corresponding clone.
+ stack||(stack=new Stack());var stacked=stack.get(value);if(stacked){return stacked;}stack.set(value,result);if(isSet(value)){value.forEach(function(subValue){result.add(baseClone(subValue,bitmask,customizer,subValue,value,stack));});}else if(isMap(value)){value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack));});}var keysFunc=isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys;var props=isArr?undefined$1:keysFunc(value);arrayEach(props||value,function(subValue,key){if(props){key=subValue;subValue=value[key];}// Recursively populate clone (susceptible to call stack limits).
+ assignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack));});return result;}/**
+ * The base implementation of `_.conforms` which doesn't clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {Function} Returns the new spec function.
+ */function baseConforms(source){var props=keys(source);return function(object){return baseConformsTo(object,source,props);};}/**
+ * The base implementation of `_.conformsTo` which accepts `props` to check.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ */function baseConformsTo(object,source,props){var length=props.length;if(object==null){return !length;}object=Object(object);while(length--){var key=props[length],predicate=source[key],value=object[key];if(value===undefined$1&&!(key in object)||!predicate(value)){return false;}}return true;}/**
+ * The base implementation of `_.delay` and `_.defer` which accepts `args`
+ * to provide to `func`.
+ *
+ * @private
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {Array} args The arguments to provide to `func`.
+ * @returns {number|Object} Returns the timer id or timeout object.
+ */function baseDelay(func,wait,args){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}return setTimeout(function(){func.apply(undefined$1,args);},wait);}/**
+ * The base implementation of methods like `_.difference` without support
+ * for excluding multiple arrays or iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Array} values The values to exclude.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ */function baseDifference(array,values,iteratee,comparator){var index=-1,includes=arrayIncludes,isCommon=true,length=array.length,result=[],valuesLength=values.length;if(!length){return result;}if(iteratee){values=arrayMap(values,baseUnary(iteratee));}if(comparator){includes=arrayIncludesWith;isCommon=false;}else if(values.length>=LARGE_ARRAY_SIZE){includes=cacheHas;isCommon=false;values=new SetCache(values);}outer:while(++indexlength?0:length+start;}end=end===undefined$1||end>length?length:toInteger(end);if(end<0){end+=length;}end=start>end?0:toLength(end);while(start0&&predicate(value)){if(depth>1){// Recursively flatten arrays (susceptible to call stack limits).
+ baseFlatten(value,depth-1,predicate,isStrict,result);}else {arrayPush(result,value);}}else if(!isStrict){result[result.length]=value;}}return result;}/**
+ * The base implementation of `baseForOwn` which iterates over `object`
+ * properties returned by `keysFunc` and invokes `iteratee` for each property.
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */var baseFor=createBaseFor();/**
+ * This function is like `baseFor` except that it iterates over properties
+ * in the opposite order.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */var baseForRight=createBaseFor(true);/**
+ * The base implementation of `_.forOwn` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys);}/**
+ * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys);}/**
+ * The base implementation of `_.functions` which creates an array of
+ * `object` function property names filtered from `props`.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Array} props The property names to filter.
+ * @returns {Array} Returns the function names.
+ */function baseFunctions(object,props){return arrayFilter(props,function(key){return isFunction(object[key]);});}/**
+ * The base implementation of `_.get` without support for default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @returns {*} Returns the resolved value.
+ */function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&indexother;}/**
+ * The base implementation of `_.has` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */function baseHas(object,key){return object!=null&&hasOwnProperty.call(object,key);}/**
+ * The base implementation of `_.hasIn` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */function baseHasIn(object,key){return object!=null&&key in Object(object);}/**
+ * The base implementation of `_.inRange` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {number} number The number to check.
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+ */function baseInRange(number,start,end){return number>=nativeMin(start,end)&&number=120&&array.length>=120)?new SetCache(othIndex&&array):undefined$1;}array=arrays[0];var index=-1,seen=caches[0];outer:while(++index-1){if(seen!==array){splice.call(seen,fromIndex,1);}splice.call(array,fromIndex,1);}}return array;}/**
+ * The base implementation of `_.pullAt` without support for individual
+ * indexes or capturing the removed elements.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {number[]} indexes The indexes of elements to remove.
+ * @returns {Array} Returns `array`.
+ */function basePullAt(array,indexes){var length=array?indexes.length:0,lastIndex=length-1;while(length--){var index=indexes[length];if(length==lastIndex||index!==previous){var previous=index;if(isIndex(index)){splice.call(array,index,1);}else {baseUnset(array,index);}}}return array;}/**
+ * The base implementation of `_.random` without support for returning
+ * floating-point numbers.
+ *
+ * @private
+ * @param {number} lower The lower bound.
+ * @param {number} upper The upper bound.
+ * @returns {number} Returns the random number.
+ */function baseRandom(lower,upper){return lower+nativeFloor(nativeRandom()*(upper-lower+1));}/**
+ * The base implementation of `_.range` and `_.rangeRight` which doesn't
+ * coerce arguments.
+ *
+ * @private
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} step The value to increment or decrement by.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the range of numbers.
+ */function baseRange(start,end,step,fromRight){var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);while(length--){result[fromRight?length:++index]=start;start+=step;}return result;}/**
+ * The base implementation of `_.repeat` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {string} string The string to repeat.
+ * @param {number} n The number of times to repeat the string.
+ * @returns {string} Returns the repeated string.
+ */function baseRepeat(string,n){var result='';if(!string||n<1||n>MAX_SAFE_INTEGER){return result;}// Leverage the exponentiation by squaring algorithm for a faster repeat.
+ // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+ do{if(n%2){result+=string;}n=nativeFloor(n/2);if(n){string+=string;}}while(n);return result;}/**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */function baseRest(func,start){return setToString(overRest(func,start,identity),func+'');}/**
+ * The base implementation of `_.sample`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to sample.
+ * @returns {*} Returns the random element.
+ */function baseSample(collection){return arraySample(values(collection));}/**
+ * The base implementation of `_.sampleSize` without param guards.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to sample.
+ * @param {number} n The number of elements to sample.
+ * @returns {Array} Returns the random elements.
+ */function baseSampleSize(collection,n){var array=values(collection);return shuffleSelf(array,baseClamp(n,0,array.length));}/**
+ * The base implementation of `_.set`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize path creation.
+ * @returns {Object} Returns `object`.
+ */function baseSet(object,path,value,customizer){if(!isObject(object)){return object;}path=castPath(path,object);var index=-1,length=path.length,lastIndex=length-1,nested=object;while(nested!=null&&++indexlength?0:length+start;}end=end>length?length:end;if(end<0){end+=length;}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++index>>1,computed=array[mid];if(computed!==null&&!isSymbol(computed)&&(retHighest?computed<=value:computed=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set){return setToArray(set);}isCommon=false;includes=cacheHas;seen=new SetCache();}else {seen=iteratee?[]:result;}outer:while(++index=length?array:baseSlice(array,start,end);}/**
+ * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
+ *
+ * @private
+ * @param {number|Object} id The timer id or timeout object of the timer to clear.
+ */var clearTimeout=ctxClearTimeout||function(id){return root.clearTimeout(id);};/**
+ * Creates a clone of `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */function cloneBuffer(buffer,isDeep){if(isDeep){return buffer.slice();}var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);buffer.copy(result);return result;}/**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);new Uint8Array(result).set(new Uint8Array(arrayBuffer));return result;}/**
+ * Creates a clone of `dataView`.
+ *
+ * @private
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
+ */function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength);}/**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));result.lastIndex=regexp.lastIndex;return result;}/**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{};}/**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length);}/**
+ * Compares values to sort them in ascending order.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {number} Returns the sort order indicator for `value`.
+ */function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined$1,valIsNull=value===null,valIsReflexive=value===value,valIsSymbol=isSymbol(value);var othIsDefined=other!==undefined$1,othIsNull=other===null,othIsReflexive=other===other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1;}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value=ordersLength){return result;}var order=orders[index];return result*(order=='desc'?-1:1);}}// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+ // that causes it, under certain circumstances, to provide the same value for
+ // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+ // for more details.
+ //
+ // This also ensures a stable sort in V8 and other engines.
+ // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
+ return object.index-other.index;}/**
+ * Creates an array that is the composition of partially applied arguments,
+ * placeholders, and provided arguments into a single array of arguments.
+ *
+ * @private
+ * @param {Array} args The provided arguments.
+ * @param {Array} partials The arguments to prepend to those provided.
+ * @param {Array} holders The `partials` placeholder indexes.
+ * @params {boolean} [isCurried] Specify composing for a curried function.
+ * @returns {Array} Returns the new array of composed arguments.
+ */function composeArgs(args,partials,holders,isCurried){var argsIndex=-1,argsLength=args.length,holdersLength=holders.length,leftIndex=-1,leftLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(leftLength+rangeLength),isUncurried=!isCurried;while(++leftIndex1?sources[length-1]:undefined$1,guard=length>2?sources[2]:undefined$1;customizer=assigner.length>3&&typeof customizer=='function'?(length--,customizer):undefined$1;if(guard&&isIterateeCall(sources[0],sources[1],guard)){customizer=length<3?undefined$1:customizer;length=1;}object=Object(object);while(++index-1?iterable[iteratee?collection[index]:index]:undefined$1;};}/**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */function createFlow(fromRight){return flatRest(function(funcs){var length=funcs.length,index=length,prereq=LodashWrapper.prototype.thru;if(fromRight){funcs.reverse();}while(index--){var func=funcs[index];if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(prereq&&!wrapper&&getFuncName(func)=='wrapper'){var wrapper=new LodashWrapper([],true);}}index=wrapper?index:length;while(++index1){args.reverse();}if(isAry&&aryarrLength)){return false;}// Check that cyclic values are equal.
+ var arrStacked=stack.get(array);var othStacked=stack.get(other);if(arrStacked&&othStacked){return arrStacked==other&&othStacked==array;}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined$1;stack.set(array,other);stack.set(other,array);// Ignore non-index properties.
+ while(++index1?'& ':'')+details[lastIndex];details=details.join(length>2?', ':' ');return source.replace(reWrapComment,'{\n/* [wrapped with '+details+'] */\n');}/**
+ * Checks if `value` is a flattenable `arguments` object or array.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+ */function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol]);}/**
+ * 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){var type=typeof value;length=length==null?MAX_SAFE_INTEGER:length;return !!length&&(type=='number'||type!='symbol'&&reIsUint.test(value))&&value>-1&&value%1==0&&value0){if(++count>=HOT_COUNT){return arguments[0];}}else {count=0;}return func.apply(undefined$1,arguments);};}/**
+ * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
+ *
+ * @private
+ * @param {Array} array The array to shuffle.
+ * @param {number} [size=array.length] The size of `array`.
+ * @returns {Array} Returns `array`.
+ */function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;size=size===undefined$1?length:size;while(++index [['a', 'b'], ['c', 'd']]
+ *
+ * _.chunk(['a', 'b', 'c', 'd'], 3);
+ * // => [['a', 'b', 'c'], ['d']]
+ */function chunk(array,size,guard){if(guard?isIterateeCall(array,size,guard):size===undefined$1){size=1;}else {size=nativeMax(toInteger(size),0);}var length=array==null?0:array.length;if(!length||size<1){return [];}var index=0,resIndex=0,result=Array(nativeCeil(length/size));while(index [1, 2, 3]
+ */function compact(array){var index=-1,length=array==null?0:array.length,resIndex=0,result=[];while(++index [1, 2, 3, [4]]
+ *
+ * console.log(array);
+ * // => [1]
+ */function concat(){var length=arguments.length;if(!length){return [];}var args=Array(length-1),array=arguments[0],index=length;while(index--){args[index-1]=arguments[index];}return arrayPush(isArray(array)?copyArray(array):[array],baseFlatten(args,1));}/**
+ * Creates an array of `array` values not included in the other given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. The order and references of result values are
+ * determined by the first array.
+ *
+ * **Note:** Unlike `_.pullAll`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.without, _.xor
+ * @example
+ *
+ * _.difference([2, 1], [2, 3]);
+ * // => [1]
+ */var difference=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true)):[];});/**
+ * This method is like `_.difference` except that it accepts `iteratee` which
+ * is invoked for each element of `array` and `values` to generate the criterion
+ * by which they're compared. The order and references of result values are
+ * determined by the first array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
+ * // => [{ 'x': 2 }]
+ */var differenceBy=baseRest(function(array,values){var iteratee=last(values);if(isArrayLikeObject(iteratee)){iteratee=undefined$1;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),getIteratee(iteratee,2)):[];});/**
+ * This method is like `_.difference` except that it accepts `comparator`
+ * which is invoked to compare elements of `array` to `values`. The order and
+ * references of result values are determined by the first array. The comparator
+ * is invoked with two arguments: (arrVal, othVal).
+ *
+ * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...Array} [values] The values to exclude.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ *
+ * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+ * // => [{ 'x': 2, 'y': 1 }]
+ */var differenceWith=baseRest(function(array,values){var comparator=last(values);if(isArrayLikeObject(comparator)){comparator=undefined$1;}return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,true),undefined$1,comparator):[];});/**
+ * Creates a slice of `array` with `n` elements dropped from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.drop([1, 2, 3]);
+ * // => [2, 3]
+ *
+ * _.drop([1, 2, 3], 2);
+ * // => [3]
+ *
+ * _.drop([1, 2, 3], 5);
+ * // => []
+ *
+ * _.drop([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */function drop(array,n,guard){var length=array==null?0:array.length;if(!length){return [];}n=guard||n===undefined$1?1:toInteger(n);return baseSlice(array,n<0?0:n,length);}/**
+ * Creates a slice of `array` with `n` elements dropped from the end.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to drop.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.dropRight([1, 2, 3]);
+ * // => [1, 2]
+ *
+ * _.dropRight([1, 2, 3], 2);
+ * // => [1]
+ *
+ * _.dropRight([1, 2, 3], 5);
+ * // => []
+ *
+ * _.dropRight([1, 2, 3], 0);
+ * // => [1, 2, 3]
+ */function dropRight(array,n,guard){var length=array==null?0:array.length;if(!length){return [];}n=guard||n===undefined$1?1:toInteger(n);n=length-n;return baseSlice(array,0,n<0?0:n);}/**
+ * Creates a slice of `array` excluding elements dropped from the end.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.dropRightWhile(users, function(o) { return !o.active; });
+ * // => objects for ['barney']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.dropRightWhile(users, ['active', false]);
+ * // => objects for ['barney']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.dropRightWhile(users, 'active');
+ * // => objects for ['barney', 'fred', 'pebbles']
+ */function dropRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true,true):[];}/**
+ * Creates a slice of `array` excluding elements dropped from the beginning.
+ * Elements are dropped until `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.dropWhile(users, function(o) { return !o.active; });
+ * // => objects for ['pebbles']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.dropWhile(users, { 'user': 'barney', 'active': false });
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.dropWhile(users, ['active', false]);
+ * // => objects for ['pebbles']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.dropWhile(users, 'active');
+ * // => objects for ['barney', 'fred', 'pebbles']
+ */function dropWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),true):[];}/**
+ * Fills elements of `array` with `value` from `start` up to, but not
+ * including, `end`.
+ *
+ * **Note:** This method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.2.0
+ * @category Array
+ * @param {Array} array The array to fill.
+ * @param {*} value The value to fill `array` with.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8, 10], '*', 1, 3);
+ * // => [4, '*', '*', 10]
+ */function fill(array,value,start,end){var length=array==null?0:array.length;if(!length){return [];}if(start&&typeof start!='number'&&isIterateeCall(array,value,start)){start=0;end=length;}return baseFill(array,value,start,end);}/**
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(o) { return o.user == 'barney'; });
+ * // => 0
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findIndex(users, ['active', false]);
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findIndex(users, 'active');
+ * // => 2
+ */function findIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return -1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseFindIndex(array,getIteratee(predicate,3),index);}/**
+ * This method is like `_.findIndex` except that it iterates over elements
+ * of `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=array.length-1] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
+ * // => 2
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+ * // => 0
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findLastIndex(users, ['active', false]);
+ * // => 2
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findLastIndex(users, 'active');
+ * // => 0
+ */function findLastIndex(array,predicate,fromIndex){var length=array==null?0:array.length;if(!length){return -1;}var index=length-1;if(fromIndex!==undefined$1){index=toInteger(fromIndex);index=fromIndex<0?nativeMax(length+index,0):nativeMin(index,length-1);}return baseFindIndex(array,getIteratee(predicate,3),index,true);}/**
+ * Flattens `array` a single level deep.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flatten([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, [3, [4]], 5]
+ */function flatten(array){var length=array==null?0:array.length;return length?baseFlatten(array,1):[];}/**
+ * Recursively flattens `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flattenDeep([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, 3, 4, 5]
+ */function flattenDeep(array){var length=array==null?0:array.length;return length?baseFlatten(array,INFINITY):[];}/**
+ * Recursively flatten `array` up to `depth` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.4.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @param {number} [depth=1] The maximum recursion depth.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * var array = [1, [2, [3, [4]], 5]];
+ *
+ * _.flattenDepth(array, 1);
+ * // => [1, 2, [3, [4]], 5]
+ *
+ * _.flattenDepth(array, 2);
+ * // => [1, 2, 3, [4], 5]
+ */function flattenDepth(array,depth){var length=array==null?0:array.length;if(!length){return [];}depth=depth===undefined$1?1:toInteger(depth);return baseFlatten(array,depth);}/**
+ * The inverse of `_.toPairs`; this method returns an object composed
+ * from key-value `pairs`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} pairs The key-value pairs.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.fromPairs([['a', 1], ['b', 2]]);
+ * // => { 'a': 1, 'b': 2 }
+ */function fromPairs(pairs){var index=-1,length=pairs==null?0:pairs.length,result={};while(++index 1
+ *
+ * _.head([]);
+ * // => undefined
+ */function head(array){return array&&array.length?array[0]:undefined$1;}/**
+ * Gets the index at which the first occurrence of `value` is found in `array`
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the
+ * offset from the end of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.indexOf([1, 2, 1, 2], 2);
+ * // => 1
+ *
+ * // Search from the `fromIndex`.
+ * _.indexOf([1, 2, 1, 2], 2, 2);
+ * // => 3
+ */function indexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return -1;}var index=fromIndex==null?0:toInteger(fromIndex);if(index<0){index=nativeMax(length+index,0);}return baseIndexOf(array,value,index);}/**
+ * Gets all but the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.initial([1, 2, 3]);
+ * // => [1, 2]
+ */function initial(array){var length=array==null?0:array.length;return length?baseSlice(array,0,-1):[];}/**
+ * Creates an array of unique values that are included in all given arrays
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons. The order and references of result values are
+ * determined by the first array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * _.intersection([2, 1], [2, 3]);
+ * // => [2]
+ */var intersection=baseRest(function(arrays){var mapped=arrayMap(arrays,castArrayLikeObject);return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped):[];});/**
+ * This method is like `_.intersection` except that it accepts `iteratee`
+ * which is invoked for each element of each `arrays` to generate the criterion
+ * by which they're compared. The order and references of result values are
+ * determined by the first array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [2.1]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }]
+ */var intersectionBy=baseRest(function(arrays){var iteratee=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);if(iteratee===last(mapped)){iteratee=undefined$1;}else {mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,getIteratee(iteratee,2)):[];});/**
+ * This method is like `_.intersection` except that it accepts `comparator`
+ * which is invoked to compare elements of `arrays`. The order and references
+ * of result values are determined by the first array. The comparator is
+ * invoked with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of intersecting values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.intersectionWith(objects, others, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }]
+ */var intersectionWith=baseRest(function(arrays){var comparator=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);comparator=typeof comparator=='function'?comparator:undefined$1;if(comparator){mapped.pop();}return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,undefined$1,comparator):[];});/**
+ * Converts all elements in `array` into a string separated by `separator`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to convert.
+ * @param {string} [separator=','] The element separator.
+ * @returns {string} Returns the joined string.
+ * @example
+ *
+ * _.join(['a', 'b', 'c'], '~');
+ * // => 'a~b~c'
+ */function join(array,separator){return array==null?'':nativeJoin.call(array,separator);}/**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined$1;}/**
+ * This method is like `_.indexOf` except that it iterates over elements of
+ * `array` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=array.length-1] The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.lastIndexOf([1, 2, 1, 2], 2);
+ * // => 3
+ *
+ * // Search from the `fromIndex`.
+ * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+ * // => 1
+ */function lastIndexOf(array,value,fromIndex){var length=array==null?0:array.length;if(!length){return -1;}var index=length;if(fromIndex!==undefined$1){index=toInteger(fromIndex);index=index<0?nativeMax(length+index,0):nativeMin(index,length-1);}return value===value?strictLastIndexOf(array,value,index):baseFindIndex(array,baseIsNaN,index,true);}/**
+ * Gets the element at index `n` of `array`. If `n` is negative, the nth
+ * element from the end is returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.11.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=0] The index of the element to return.
+ * @returns {*} Returns the nth element of `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'd'];
+ *
+ * _.nth(array, 1);
+ * // => 'b'
+ *
+ * _.nth(array, -2);
+ * // => 'c';
+ */function nth(array,n){return array&&array.length?baseNth(array,toInteger(n)):undefined$1;}/**
+ * Removes all given values from `array` using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+ * to remove elements from an array by predicate.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...*} [values] The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+ *
+ * _.pull(array, 'a', 'c');
+ * console.log(array);
+ * // => ['b', 'b']
+ */var pull=baseRest(pullAll);/**
+ * This method is like `_.pull` except that it accepts an array of values to remove.
+ *
+ * **Note:** Unlike `_.difference`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+ *
+ * _.pullAll(array, ['a', 'c']);
+ * console.log(array);
+ * // => ['b', 'b']
+ */function pullAll(array,values){return array&&array.length&&values&&values.length?basePullAll(array,values):array;}/**
+ * This method is like `_.pullAll` except that it accepts `iteratee` which is
+ * invoked for each element of `array` and `values` to generate the criterion
+ * by which they're compared. The iteratee is invoked with one argument: (value).
+ *
+ * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+ *
+ * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+ * console.log(array);
+ * // => [{ 'x': 2 }]
+ */function pullAllBy(array,values,iteratee){return array&&array.length&&values&&values.length?basePullAll(array,values,getIteratee(iteratee,2)):array;}/**
+ * This method is like `_.pullAll` except that it accepts `comparator` which
+ * is invoked to compare elements of `array` to `values`. The comparator is
+ * invoked with two arguments: (arrVal, othVal).
+ *
+ * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to remove.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+ *
+ * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+ * console.log(array);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+ */function pullAllWith(array,values,comparator){return array&&array.length&&values&&values.length?basePullAll(array,values,undefined$1,comparator):array;}/**
+ * Removes elements from `array` corresponding to `indexes` and returns an
+ * array of removed elements.
+ *
+ * **Note:** Unlike `_.at`, this method mutates `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {...(number|number[])} [indexes] The indexes of elements to remove.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = ['a', 'b', 'c', 'd'];
+ * var pulled = _.pullAt(array, [1, 3]);
+ *
+ * console.log(array);
+ * // => ['a', 'c']
+ *
+ * console.log(pulled);
+ * // => ['b', 'd']
+ */var pullAt=flatRest(function(array,indexes){var length=array==null?0:array.length,result=baseAt(array,indexes);basePullAt(array,arrayMap(indexes,function(index){return isIndex(index,length)?+index:index;}).sort(compareAscending));return result;});/**
+ * Removes all elements from `array` that `predicate` returns truthy for
+ * and returns an array of the removed elements. The predicate is invoked
+ * with three arguments: (value, index, array).
+ *
+ * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+ * to pull elements from an array by value.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Array
+ * @param {Array} array The array to modify.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new array of removed elements.
+ * @example
+ *
+ * var array = [1, 2, 3, 4];
+ * var evens = _.remove(array, function(n) {
+ * return n % 2 == 0;
+ * });
+ *
+ * console.log(array);
+ * // => [1, 3]
+ *
+ * console.log(evens);
+ * // => [2, 4]
+ */function remove(array,predicate){var result=[];if(!(array&&array.length)){return result;}var index=-1,indexes=[],length=array.length;predicate=getIteratee(predicate,3);while(++index [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */function reverse(array){return array==null?array:nativeReverse.call(array);}/**
+ * Creates a slice of `array` from `start` up to, but not including, `end`.
+ *
+ * **Note:** This method is used instead of
+ * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
+ * returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */function slice(array,start,end){var length=array==null?0:array.length;if(!length){return [];}if(end&&typeof end!='number'&&isIterateeCall(array,start,end)){start=0;end=length;}else {start=start==null?0:toInteger(start);end=end===undefined$1?length:toInteger(end);}return baseSlice(array,start,end);}/**
+ * Uses a binary search to determine the lowest index at which `value`
+ * should be inserted into `array` in order to maintain its sort order.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * _.sortedIndex([30, 50], 40);
+ * // => 1
+ */function sortedIndex(array,value){return baseSortedIndex(array,value);}/**
+ * This method is like `_.sortedIndex` except that it accepts `iteratee`
+ * which is invoked for `value` and each element of `array` to compute their
+ * sort ranking. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * var objects = [{ 'x': 4 }, { 'x': 5 }];
+ *
+ * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
+ * // => 0
+ */function sortedIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2));}/**
+ * This method is like `_.indexOf` except that it performs a binary
+ * search on a sorted `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
+ * // => 1
+ */function sortedIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value);if(index 4
+ */function sortedLastIndex(array,value){return baseSortedIndex(array,value,true);}/**
+ * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+ * which is invoked for `value` and each element of `array` to compute their
+ * sort ranking. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The sorted array to inspect.
+ * @param {*} value The value to evaluate.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {number} Returns the index at which `value` should be inserted
+ * into `array`.
+ * @example
+ *
+ * var objects = [{ 'x': 4 }, { 'x': 5 }];
+ *
+ * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+ * // => 1
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
+ * // => 1
+ */function sortedLastIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2),true);}/**
+ * This method is like `_.lastIndexOf` except that it performs a binary
+ * search on a sorted `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
+ * // => 3
+ */function sortedLastIndexOf(array,value){var length=array==null?0:array.length;if(length){var index=baseSortedIndex(array,value,true)-1;if(eq(array[index],value)){return index;}}return -1;}/**
+ * This method is like `_.uniq` except that it's designed and optimized
+ * for sorted arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.sortedUniq([1, 1, 2]);
+ * // => [1, 2]
+ */function sortedUniq(array){return array&&array.length?baseSortedUniq(array):[];}/**
+ * This method is like `_.uniqBy` except that it's designed and optimized
+ * for sorted arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+ * // => [1.1, 2.3]
+ */function sortedUniqBy(array,iteratee){return array&&array.length?baseSortedUniq(array,getIteratee(iteratee,2)):[];}/**
+ * Gets all but the first element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.tail([1, 2, 3]);
+ * // => [2, 3]
+ */function tail(array){var length=array==null?0:array.length;return length?baseSlice(array,1,length):[];}/**
+ * Creates a slice of `array` with `n` elements taken from the beginning.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.take([1, 2, 3]);
+ * // => [1]
+ *
+ * _.take([1, 2, 3], 2);
+ * // => [1, 2]
+ *
+ * _.take([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.take([1, 2, 3], 0);
+ * // => []
+ */function take(array,n,guard){if(!(array&&array.length)){return [];}n=guard||n===undefined$1?1:toInteger(n);return baseSlice(array,0,n<0?0:n);}/**
+ * Creates a slice of `array` with `n` elements taken from the end.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {number} [n=1] The number of elements to take.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * _.takeRight([1, 2, 3]);
+ * // => [3]
+ *
+ * _.takeRight([1, 2, 3], 2);
+ * // => [2, 3]
+ *
+ * _.takeRight([1, 2, 3], 5);
+ * // => [1, 2, 3]
+ *
+ * _.takeRight([1, 2, 3], 0);
+ * // => []
+ */function takeRight(array,n,guard){var length=array==null?0:array.length;if(!length){return [];}n=guard||n===undefined$1?1:toInteger(n);n=length-n;return baseSlice(array,n<0?0:n,length);}/**
+ * Creates a slice of `array` with elements taken from the end. Elements are
+ * taken until `predicate` returns falsey. The predicate is invoked with
+ * three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': false }
+ * ];
+ *
+ * _.takeRightWhile(users, function(o) { return !o.active; });
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
+ * // => objects for ['pebbles']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.takeRightWhile(users, ['active', false]);
+ * // => objects for ['fred', 'pebbles']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.takeRightWhile(users, 'active');
+ * // => []
+ */function takeRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),false,true):[];}/**
+ * Creates a slice of `array` with elements taken from the beginning. Elements
+ * are taken until `predicate` returns falsey. The predicate is invoked with
+ * three arguments: (value, index, array).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the slice of `array`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': false },
+ * { 'user': 'fred', 'active': false },
+ * { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.takeWhile(users, function(o) { return !o.active; });
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.takeWhile(users, { 'user': 'barney', 'active': false });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.takeWhile(users, ['active', false]);
+ * // => objects for ['barney', 'fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.takeWhile(users, 'active');
+ * // => []
+ */function takeWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3)):[];}/**
+ * Creates an array of unique values, in order, from all given arrays using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.union([2], [1, 2]);
+ * // => [2, 1]
+ */var union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true));});/**
+ * This method is like `_.union` except that it accepts `iteratee` which is
+ * invoked for each element of each `arrays` to generate the criterion by
+ * which uniqueness is computed. Result values are chosen from the first
+ * array in which the value occurs. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.unionBy([2.1], [1.2, 2.3], Math.floor);
+ * // => [2.1, 1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */var unionBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined$1;}return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),getIteratee(iteratee,2));});/**
+ * This method is like `_.union` except that it accepts `comparator` which
+ * is invoked to compare elements of `arrays`. Result values are chosen from
+ * the first array in which the value occurs. The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.unionWith(objects, others, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+ */var unionWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator=='function'?comparator:undefined$1;return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,true),undefined$1,comparator);});/**
+ * Creates a duplicate-free version of an array, using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons, in which only the first occurrence of each element
+ * is kept. The order of result values is determined by the order they occur
+ * in the array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniq([2, 1, 2]);
+ * // => [2, 1]
+ */function uniq(array){return array&&array.length?baseUniq(array):[];}/**
+ * This method is like `_.uniq` except that it accepts `iteratee` which is
+ * invoked for each element in `array` to generate the criterion by which
+ * uniqueness is computed. The order of result values is determined by the
+ * order they occur in the array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+ * // => [2.1, 1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */function uniqBy(array,iteratee){return array&&array.length?baseUniq(array,getIteratee(iteratee,2)):[];}/**
+ * This method is like `_.uniq` except that it accepts `comparator` which
+ * is invoked to compare elements of `array`. The order of result values is
+ * determined by the order they occur in the array.The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.uniqWith(objects, _.isEqual);
+ * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+ */function uniqWith(array,comparator){comparator=typeof comparator=='function'?comparator:undefined$1;return array&&array.length?baseUniq(array,undefined$1,comparator):[];}/**
+ * This method is like `_.zip` except that it accepts an array of grouped
+ * elements and creates an array regrouping the elements to their pre-zip
+ * configuration.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.2.0
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
+ *
+ * _.unzip(zipped);
+ * // => [['a', 'b'], [1, 2], [true, false]]
+ */function unzip(array){if(!(array&&array.length)){return [];}var length=0;array=arrayFilter(array,function(group){if(isArrayLikeObject(group)){length=nativeMax(group.length,length);return true;}});return baseTimes(length,function(index){return arrayMap(array,baseProperty(index));});}/**
+ * This method is like `_.unzip` except that it accepts `iteratee` to specify
+ * how regrouped values should be combined. The iteratee is invoked with the
+ * elements of each group: (...group).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Array
+ * @param {Array} array The array of grouped elements to process.
+ * @param {Function} [iteratee=_.identity] The function to combine
+ * regrouped values.
+ * @returns {Array} Returns the new array of regrouped elements.
+ * @example
+ *
+ * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+ * // => [[1, 10, 100], [2, 20, 200]]
+ *
+ * _.unzipWith(zipped, _.add);
+ * // => [3, 30, 300]
+ */function unzipWith(array,iteratee){if(!(array&&array.length)){return [];}var result=unzip(array);if(iteratee==null){return result;}return arrayMap(result,function(group){return apply(iteratee,undefined$1,group);});}/**
+ * Creates an array excluding all given values using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * **Note:** Unlike `_.pull`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {...*} [values] The values to exclude.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.difference, _.xor
+ * @example
+ *
+ * _.without([2, 1, 2, 3], 1, 2);
+ * // => [3]
+ */var without=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,values):[];});/**
+ * Creates an array of unique values that is the
+ * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the given arrays. The order of result values is determined by the order
+ * they occur in the arrays.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of filtered values.
+ * @see _.difference, _.without
+ * @example
+ *
+ * _.xor([2, 1], [2, 3]);
+ * // => [1, 3]
+ */var xor=baseRest(function(arrays){return baseXor(arrayFilter(arrays,isArrayLikeObject));});/**
+ * This method is like `_.xor` except that it accepts `iteratee` which is
+ * invoked for each element of each `arrays` to generate the criterion by
+ * which by which they're compared. The order of result values is determined
+ * by the order they occur in the arrays. The iteratee is invoked with one
+ * argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+ * // => [1.2, 3.4]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 2 }]
+ */var xorBy=baseRest(function(arrays){var iteratee=last(arrays);if(isArrayLikeObject(iteratee)){iteratee=undefined$1;}return baseXor(arrayFilter(arrays,isArrayLikeObject),getIteratee(iteratee,2));});/**
+ * This method is like `_.xor` except that it accepts `comparator` which is
+ * invoked to compare elements of `arrays`. The order of result values is
+ * determined by the order they occur in the arrays. The comparator is invoked
+ * with two arguments: (arrVal, othVal).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+ * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+ *
+ * _.xorWith(objects, others, _.isEqual);
+ * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+ */var xorWith=baseRest(function(arrays){var comparator=last(arrays);comparator=typeof comparator=='function'?comparator:undefined$1;return baseXor(arrayFilter(arrays,isArrayLikeObject),undefined$1,comparator);});/**
+ * Creates an array of grouped elements, the first of which contains the
+ * first elements of the given arrays, the second of which contains the
+ * second elements of the given arrays, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zip(['a', 'b'], [1, 2], [true, false]);
+ * // => [['a', 1, true], ['b', 2, false]]
+ */var zip=baseRest(unzip);/**
+ * This method is like `_.fromPairs` except that it accepts two arrays,
+ * one of property identifiers and one of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.4.0
+ * @category Array
+ * @param {Array} [props=[]] The property identifiers.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObject(['a', 'b'], [1, 2]);
+ * // => { 'a': 1, 'b': 2 }
+ */function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue);}/**
+ * This method is like `_.zipObject` except that it supports property paths.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.1.0
+ * @category Array
+ * @param {Array} [props=[]] The property identifiers.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
+ * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
+ */function zipObjectDeep(props,values){return baseZipObject(props||[],values||[],baseSet);}/**
+ * This method is like `_.zip` except that it accepts `iteratee` to specify
+ * how grouped values should be combined. The iteratee is invoked with the
+ * elements of each group: (...group).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to process.
+ * @param {Function} [iteratee=_.identity] The function to combine
+ * grouped values.
+ * @returns {Array} Returns the new array of grouped elements.
+ * @example
+ *
+ * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
+ * return a + b + c;
+ * });
+ * // => [111, 222]
+ */var zipWith=baseRest(function(arrays){var length=arrays.length,iteratee=length>1?arrays[length-1]:undefined$1;iteratee=typeof iteratee=='function'?(arrays.pop(),iteratee):undefined$1;return unzipWith(arrays,iteratee);});/*------------------------------------------------------------------------*/ /**
+ * Creates a `lodash` wrapper instance that wraps `value` with explicit method
+ * chain sequences enabled. The result of such sequences must be unwrapped
+ * with `_#value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.3.0
+ * @category Seq
+ * @param {*} value The value to wrap.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'pebbles', 'age': 1 }
+ * ];
+ *
+ * var youngest = _
+ * .chain(users)
+ * .sortBy('age')
+ * .map(function(o) {
+ * return o.user + ' is ' + o.age;
+ * })
+ * .head()
+ * .value();
+ * // => 'pebbles is 1'
+ */function chain(value){var result=lodash(value);result.__chain__=true;return result;}/**
+ * This method invokes `interceptor` and returns `value`. The interceptor
+ * is invoked with one argument; (value). The purpose of this method is to
+ * "tap into" a method chain sequence in order to modify intermediate results.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * _([1, 2, 3])
+ * .tap(function(array) {
+ * // Mutate input array.
+ * array.pop();
+ * })
+ * .reverse()
+ * .value();
+ * // => [2, 1]
+ */function tap(value,interceptor){interceptor(value);return value;}/**
+ * This method is like `_.tap` except that it returns the result of `interceptor`.
+ * The purpose of this method is to "pass thru" values replacing intermediate
+ * results in a method chain sequence.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Seq
+ * @param {*} value The value to provide to `interceptor`.
+ * @param {Function} interceptor The function to invoke.
+ * @returns {*} Returns the result of `interceptor`.
+ * @example
+ *
+ * _(' abc ')
+ * .chain()
+ * .trim()
+ * .thru(function(value) {
+ * return [value];
+ * })
+ * .value();
+ * // => ['abc']
+ */function thru(value,interceptor){return interceptor(value);}/**
+ * This method is the wrapper version of `_.at`.
+ *
+ * @name at
+ * @memberOf _
+ * @since 1.0.0
+ * @category Seq
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+ *
+ * _(object).at(['a[0].b.c', 'a[1]']).value();
+ * // => [3, 4]
+ */var wrapperAt=flatRest(function(paths){var length=paths.length,start=length?paths[0]:0,value=this.__wrapped__,interceptor=function(object){return baseAt(object,paths);};if(length>1||this.__actions__.length||!(value instanceof LazyWrapper)||!isIndex(start)){return this.thru(interceptor);}value=value.slice(start,+start+(length?1:0));value.__actions__.push({'func':thru,'args':[interceptor],'thisArg':undefined$1});return new LodashWrapper(value,this.__chain__).thru(function(array){if(length&&!array.length){array.push(undefined$1);}return array;});});/**
+ * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
+ *
+ * @name chain
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 40 }
+ * ];
+ *
+ * // A sequence without explicit chaining.
+ * _(users).head();
+ * // => { 'user': 'barney', 'age': 36 }
+ *
+ * // A sequence with explicit chaining.
+ * _(users)
+ * .chain()
+ * .head()
+ * .pick('user')
+ * .value();
+ * // => { 'user': 'barney' }
+ */function wrapperChain(){return chain(this);}/**
+ * Executes the chain sequence and returns the wrapped result.
+ *
+ * @name commit
+ * @memberOf _
+ * @since 3.2.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2];
+ * var wrapped = _(array).push(3);
+ *
+ * console.log(array);
+ * // => [1, 2]
+ *
+ * wrapped = wrapped.commit();
+ * console.log(array);
+ * // => [1, 2, 3]
+ *
+ * wrapped.last();
+ * // => 3
+ *
+ * console.log(array);
+ * // => [1, 2, 3]
+ */function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__);}/**
+ * Gets the next value on a wrapped object following the
+ * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
+ *
+ * @name next
+ * @memberOf _
+ * @since 4.0.0
+ * @category Seq
+ * @returns {Object} Returns the next iterator value.
+ * @example
+ *
+ * var wrapped = _([1, 2]);
+ *
+ * wrapped.next();
+ * // => { 'done': false, 'value': 1 }
+ *
+ * wrapped.next();
+ * // => { 'done': false, 'value': 2 }
+ *
+ * wrapped.next();
+ * // => { 'done': true, 'value': undefined }
+ */function wrapperNext(){if(this.__values__===undefined$1){this.__values__=toArray(this.value());}var done=this.__index__>=this.__values__.length,value=done?undefined$1:this.__values__[this.__index__++];return {'done':done,'value':value};}/**
+ * Enables the wrapper to be iterable.
+ *
+ * @name Symbol.iterator
+ * @memberOf _
+ * @since 4.0.0
+ * @category Seq
+ * @returns {Object} Returns the wrapper object.
+ * @example
+ *
+ * var wrapped = _([1, 2]);
+ *
+ * wrapped[Symbol.iterator]() === wrapped;
+ * // => true
+ *
+ * Array.from(wrapped);
+ * // => [1, 2]
+ */function wrapperToIterator(){return this;}/**
+ * Creates a clone of the chain sequence planting `value` as the wrapped value.
+ *
+ * @name plant
+ * @memberOf _
+ * @since 3.2.0
+ * @category Seq
+ * @param {*} value The value to plant.
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var wrapped = _([1, 2]).map(square);
+ * var other = wrapped.plant([3, 4]);
+ *
+ * other.value();
+ * // => [9, 16]
+ *
+ * wrapped.value();
+ * // => [1, 4]
+ */function wrapperPlant(value){var result,parent=this;while(parent instanceof baseLodash){var clone=wrapperClone(parent);clone.__index__=0;clone.__values__=undefined$1;if(result){previous.__wrapped__=clone;}else {result=clone;}var previous=clone;parent=parent.__wrapped__;}previous.__wrapped__=value;return result;}/**
+ * This method is the wrapper version of `_.reverse`.
+ *
+ * **Note:** This method mutates the wrapped array.
+ *
+ * @name reverse
+ * @memberOf _
+ * @since 0.1.0
+ * @category Seq
+ * @returns {Object} Returns the new `lodash` wrapper instance.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _(array).reverse().value()
+ * // => [3, 2, 1]
+ *
+ * console.log(array);
+ * // => [3, 2, 1]
+ */function wrapperReverse(){var value=this.__wrapped__;if(value instanceof LazyWrapper){var wrapped=value;if(this.__actions__.length){wrapped=new LazyWrapper(this);}wrapped=wrapped.reverse();wrapped.__actions__.push({'func':thru,'args':[reverse],'thisArg':undefined$1});return new LodashWrapper(wrapped,this.__chain__);}return this.thru(reverse);}/**
+ * Executes the chain sequence to resolve the unwrapped value.
+ *
+ * @name value
+ * @memberOf _
+ * @since 0.1.0
+ * @alias toJSON, valueOf
+ * @category Seq
+ * @returns {*} Returns the resolved unwrapped value.
+ * @example
+ *
+ * _([1, 2, 3]).value();
+ * // => [1, 2, 3]
+ */function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__);}/*------------------------------------------------------------------------*/ /**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The corresponding value of
+ * each key is the number of times the key was returned by `iteratee`. The
+ * iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.countBy([6.1, 4.2, 6.3], Math.floor);
+ * // => { '4': 1, '6': 2 }
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.countBy(['one', 'two', 'three'], 'length');
+ * // => { '3': 2, '5': 1 }
+ */var countBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){++result[key];}else {baseAssignValue(result,key,1);}});/**
+ * Checks if `predicate` returns truthy for **all** elements of `collection`.
+ * Iteration is stopped once `predicate` returns falsey. The predicate is
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * **Note:** This method returns `true` for
+ * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
+ * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
+ * elements of empty collections.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {boolean} Returns `true` if all elements pass the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.every([true, 1, null, 'yes'], Boolean);
+ * // => false
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.every(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.every(users, ['active', false]);
+ * // => true
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.every(users, 'active');
+ * // => false
+ */function every(collection,predicate,guard){var func=isArray(collection)?arrayEvery:baseEvery;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined$1;}return func(collection,getIteratee(predicate,3));}/**
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.reject
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false }
+ * ];
+ *
+ * _.filter(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.filter(users, { 'age': 36, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.filter(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.filter(users, 'active');
+ * // => objects for ['barney']
+ *
+ * // Combining several predicates using `_.overEvery` or `_.overSome`.
+ * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
+ * // => objects for ['fred', 'barney']
+ */function filter(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,getIteratee(predicate,3));}/**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': true },
+ * { 'user': 'fred', 'age': 40, 'active': false },
+ * { 'user': 'pebbles', 'age': 1, 'active': true }
+ * ];
+ *
+ * _.find(users, function(o) { return o.age < 40; });
+ * // => object for 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.find(users, { 'age': 1, 'active': true });
+ * // => object for 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.find(users, ['active', false]);
+ * // => object for 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.find(users, 'active');
+ * // => object for 'barney'
+ */var find=createFind(findIndex);/**
+ * This method is like `_.find` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=collection.length-1] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * _.findLast([1, 2, 3, 4], function(n) {
+ * return n % 2 == 1;
+ * });
+ * // => 3
+ */var findLast=createFind(findLastIndex);/**
+ * Creates a flattened array of values by running each element in `collection`
+ * thru `iteratee` and flattening the mapped results. The iteratee is invoked
+ * with three arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [n, n];
+ * }
+ *
+ * _.flatMap([1, 2], duplicate);
+ * // => [1, 1, 2, 2]
+ */function flatMap(collection,iteratee){return baseFlatten(map(collection,iteratee),1);}/**
+ * This method is like `_.flatMap` except that it recursively flattens the
+ * mapped results.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.7.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [[[n, n]]];
+ * }
+ *
+ * _.flatMapDeep([1, 2], duplicate);
+ * // => [1, 1, 2, 2]
+ */function flatMapDeep(collection,iteratee){return baseFlatten(map(collection,iteratee),INFINITY);}/**
+ * This method is like `_.flatMap` except that it recursively flattens the
+ * mapped results up to `depth` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.7.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {number} [depth=1] The maximum recursion depth.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * function duplicate(n) {
+ * return [[[n, n]]];
+ * }
+ *
+ * _.flatMapDepth([1, 2], duplicate, 2);
+ * // => [[1, 1], [2, 2]]
+ */function flatMapDepth(collection,iteratee,depth){depth=depth===undefined$1?1:toInteger(depth);return baseFlatten(map(collection,iteratee),depth);}/**
+ * Iterates over elements of `collection` and invokes `iteratee` for each element.
+ * The iteratee is invoked with three arguments: (value, index|key, collection).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length"
+ * property are iterated like arrays. To avoid this behavior use `_.forIn`
+ * or `_.forOwn` for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @alias each
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @see _.forEachRight
+ * @example
+ *
+ * _.forEach([1, 2], function(value) {
+ * console.log(value);
+ * });
+ * // => Logs `1` then `2`.
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+ */function forEach(collection,iteratee){var func=isArray(collection)?arrayEach:baseEach;return func(collection,getIteratee(iteratee,3));}/**
+ * This method is like `_.forEach` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @alias eachRight
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @see _.forEach
+ * @example
+ *
+ * _.forEachRight([1, 2], function(value) {
+ * console.log(value);
+ * });
+ * // => Logs `2` then `1`.
+ */function forEachRight(collection,iteratee){var func=isArray(collection)?arrayEachRight:baseEachRight;return func(collection,getIteratee(iteratee,3));}/**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The order of grouped values
+ * is determined by the order they occur in `collection`. The corresponding
+ * value of each key is an array of elements responsible for generating the
+ * key. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+ * // => { '4': [4.2], '6': [6.1, 6.3] }
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.groupBy(['one', 'two', 'three'], 'length');
+ * // => { '3': ['one', 'two'], '5': ['three'] }
+ */var groupBy=createAggregator(function(result,value,key){if(hasOwnProperty.call(result,key)){result[key].push(value);}else {baseAssignValue(result,key,[value]);}});/**
+ * Checks if `value` is in `collection`. If `collection` is a string, it's
+ * checked for a substring of `value`, otherwise
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * is used for equality comparisons. If `fromIndex` is negative, it's used as
+ * the offset from the end of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+ * @returns {boolean} Returns `true` if `value` is found, else `false`.
+ * @example
+ *
+ * _.includes([1, 2, 3], 1);
+ * // => true
+ *
+ * _.includes([1, 2, 3], 1, 2);
+ * // => false
+ *
+ * _.includes({ 'a': 1, 'b': 2 }, 1);
+ * // => true
+ *
+ * _.includes('abcd', 'bc');
+ * // => true
+ */function includes(collection,value,fromIndex,guard){collection=isArrayLike(collection)?collection:values(collection);fromIndex=fromIndex&&!guard?toInteger(fromIndex):0;var length=collection.length;if(fromIndex<0){fromIndex=nativeMax(length+fromIndex,0);}return isString(collection)?fromIndex<=length&&collection.indexOf(value,fromIndex)>-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1;}/**
+ * Invokes the method at `path` of each element in `collection`, returning
+ * an array of the results of each invoked method. Any additional arguments
+ * are provided to each invoked method. If `path` is a function, it's invoked
+ * for, and `this` bound to, each element in `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Array|Function|string} path The path of the method to invoke or
+ * the function invoked per iteration.
+ * @param {...*} [args] The arguments to invoke each method with.
+ * @returns {Array} Returns the array of results.
+ * @example
+ *
+ * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
+ * // => [[1, 5, 7], [1, 2, 3]]
+ *
+ * _.invokeMap([123, 456], String.prototype.split, '');
+ * // => [['1', '2', '3'], ['4', '5', '6']]
+ */var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc=typeof path=='function',result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args);});return result;});/**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The corresponding value of
+ * each key is the last element responsible for generating the key. The
+ * iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
+ * @example
+ *
+ * var array = [
+ * { 'dir': 'left', 'code': 97 },
+ * { 'dir': 'right', 'code': 100 }
+ * ];
+ *
+ * _.keyBy(array, function(o) {
+ * return String.fromCharCode(o.code);
+ * });
+ * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+ *
+ * _.keyBy(array, 'dir');
+ * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+ */var keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value);});/**
+ * Creates an array of values by running each element in `collection` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+ * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+ * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+ * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * _.map([4, 8], square);
+ * // => [16, 64]
+ *
+ * _.map({ 'a': 4, 'b': 8 }, square);
+ * // => [16, 64] (iteration order is not guaranteed)
+ *
+ * var users = [
+ * { 'user': 'barney' },
+ * { 'user': 'fred' }
+ * ];
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
+ */function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,getIteratee(iteratee,3));}/**
+ * This method is like `_.sortBy` except that it allows specifying the sort
+ * orders of the iteratees to sort by. If `orders` is unspecified, all values
+ * are sorted in ascending order. Otherwise, specify an order of "desc" for
+ * descending or "asc" for ascending sort order of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
+ * The iteratees to sort by.
+ * @param {string[]} [orders] The sort orders of `iteratees`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 34 },
+ * { 'user': 'fred', 'age': 40 },
+ * { 'user': 'barney', 'age': 36 }
+ * ];
+ *
+ * // Sort by `user` in ascending order and by `age` in descending order.
+ * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+ * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+ */function orderBy(collection,iteratees,orders,guard){if(collection==null){return [];}if(!isArray(iteratees)){iteratees=iteratees==null?[]:[iteratees];}orders=guard?undefined$1:orders;if(!isArray(orders)){orders=orders==null?[]:[orders];}return baseOrderBy(collection,iteratees,orders);}/**
+ * Creates an array of elements split into two groups, the first of which
+ * contains elements `predicate` returns truthy for, the second of which
+ * contains elements `predicate` returns falsey for. The predicate is
+ * invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the array of grouped elements.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true },
+ * { 'user': 'pebbles', 'age': 1, 'active': false }
+ * ];
+ *
+ * _.partition(users, function(o) { return o.active; });
+ * // => objects for [['fred'], ['barney', 'pebbles']]
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.partition(users, { 'age': 1, 'active': false });
+ * // => objects for [['pebbles'], ['barney', 'fred']]
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.partition(users, ['active', false]);
+ * // => objects for [['barney', 'pebbles'], ['fred']]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.partition(users, 'active');
+ * // => objects for [['fred'], ['barney', 'pebbles']]
+ */var partition=createAggregator(function(result,value,key){result[key?0:1].push(value);},function(){return [[],[]];});/**
+ * Reduces `collection` to a value which is the accumulated result of running
+ * each element in `collection` thru `iteratee`, where each successive
+ * invocation is supplied the return value of the previous. If `accumulator`
+ * is not given, the first element of `collection` is used as the initial
+ * value. The iteratee is invoked with four arguments:
+ * (accumulator, value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.reduce`, `_.reduceRight`, and `_.transform`.
+ *
+ * The guarded methods are:
+ * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+ * and `sortBy`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @returns {*} Returns the accumulated value.
+ * @see _.reduceRight
+ * @example
+ *
+ * _.reduce([1, 2], function(sum, n) {
+ * return sum + n;
+ * }, 0);
+ * // => 3
+ *
+ * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ * (result[value] || (result[value] = [])).push(key);
+ * return result;
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+ */function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEach);}/**
+ * This method is like `_.reduce` except that it iterates over elements of
+ * `collection` from right to left.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @returns {*} Returns the accumulated value.
+ * @see _.reduce
+ * @example
+ *
+ * var array = [[0, 1], [2, 3], [4, 5]];
+ *
+ * _.reduceRight(array, function(flattened, other) {
+ * return flattened.concat(other);
+ * }, []);
+ * // => [4, 5, 2, 3, 0, 1]
+ */function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEachRight);}/**
+ * The opposite of `_.filter`; this method returns the elements of `collection`
+ * that `predicate` does **not** return truthy for.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.filter
+ * @example
+ *
+ * var users = [
+ * { 'user': 'barney', 'age': 36, 'active': false },
+ * { 'user': 'fred', 'age': 40, 'active': true }
+ * ];
+ *
+ * _.reject(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.reject(users, { 'age': 40, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.reject(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.reject(users, 'active');
+ * // => objects for ['barney']
+ */function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(getIteratee(predicate,3)));}/**
+ * Gets a random element from `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to sample.
+ * @returns {*} Returns the random element.
+ * @example
+ *
+ * _.sample([1, 2, 3, 4]);
+ * // => 2
+ */function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection);}/**
+ * Gets `n` random elements at unique keys from `collection` up to the
+ * size of `collection`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to sample.
+ * @param {number} [n=1] The number of elements to sample.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the random elements.
+ * @example
+ *
+ * _.sampleSize([1, 2, 3], 2);
+ * // => [3, 1]
+ *
+ * _.sampleSize([1, 2, 3], 4);
+ * // => [2, 3, 1]
+ */function sampleSize(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n===undefined$1){n=1;}else {n=toInteger(n);}var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n);}/**
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to shuffle.
+ * @returns {Array} Returns the new shuffled array.
+ * @example
+ *
+ * _.shuffle([1, 2, 3, 4]);
+ * // => [4, 1, 3, 2]
+ */function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection);}/**
+ * Gets the size of `collection` by returning its length for array-like
+ * values or the number of own enumerable string keyed properties for objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @returns {number} Returns the collection size.
+ * @example
+ *
+ * _.size([1, 2, 3]);
+ * // => 3
+ *
+ * _.size({ 'a': 1, 'b': 2 });
+ * // => 2
+ *
+ * _.size('pebbles');
+ * // => 7
+ */function size(collection){if(collection==null){return 0;}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length;}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size;}return baseKeys(collection).length;}/**
+ * Checks if `predicate` returns truthy for **any** element of `collection`.
+ * Iteration is stopped once `predicate` returns truthy. The predicate is
+ * invoked with three arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ * else `false`.
+ * @example
+ *
+ * _.some([null, 0, 'yes', false], Boolean);
+ * // => true
+ *
+ * var users = [
+ * { 'user': 'barney', 'active': true },
+ * { 'user': 'fred', 'active': false }
+ * ];
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.some(users, { 'user': 'barney', 'active': false });
+ * // => false
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.some(users, ['active', false]);
+ * // => true
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.some(users, 'active');
+ * // => true
+ */function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined$1;}return func(collection,getIteratee(predicate,3));}/**
+ * Creates an array of elements, sorted in ascending order by the results of
+ * running each element in a collection thru each iteratee. This method
+ * performs a stable sort, that is, it preserves the original sort order of
+ * equal elements. The iteratees are invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ * The iteratees to sort by.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ * { 'user': 'fred', 'age': 48 },
+ * { 'user': 'barney', 'age': 36 },
+ * { 'user': 'fred', 'age': 30 },
+ * { 'user': 'barney', 'age': 34 }
+ * ];
+ *
+ * _.sortBy(users, [function(o) { return o.user; }]);
+ * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
+ *
+ * _.sortBy(users, ['user', 'age']);
+ * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
+ */var sortBy=baseRest(function(collection,iteratees){if(collection==null){return [];}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[];}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]];}return baseOrderBy(collection,baseFlatten(iteratees,1),[]);});/*------------------------------------------------------------------------*/ /**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ * console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */var now=ctxNow||function(){return root.Date.now();};/*------------------------------------------------------------------------*/ /**
+ * The opposite of `_.before`; this method creates a function that invokes
+ * `func` once it's called `n` or more times.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {number} n The number of calls before `func` is invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var saves = ['profile', 'settings'];
+ *
+ * var done = _.after(saves.length, function() {
+ * console.log('done saving!');
+ * });
+ *
+ * _.forEach(saves, function(type) {
+ * asyncSave({ 'type': type, 'complete': done });
+ * });
+ * // => Logs 'done saving!' after the two async saves have completed.
+ */function after(n,func){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n<1){return func.apply(this,arguments);}};}/**
+ * Creates a function that invokes `func`, with up to `n` arguments,
+ * ignoring any additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @param {number} [n=func.length] The arity cap.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new capped function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+ * // => [6, 8, 10]
+ */function ary(func,n,guard){n=guard?undefined$1:n;n=func&&n==null?func.length:n;return createWrap(func,WRAP_ARY_FLAG,undefined$1,undefined$1,undefined$1,undefined$1,n);}/**
+ * Creates a function that invokes `func`, with the `this` binding and arguments
+ * of the created function, while it's called less than `n` times. Subsequent
+ * calls to the created function return the result of the last `func` invocation.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {number} n The number of calls at which `func` is no longer invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * jQuery(element).on('click', _.before(5, addContactToList));
+ * // => Allows adding up to 4 contacts to the list.
+ */function before(n,func){var result;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}n=toInteger(n);return function(){if(--n>0){result=func.apply(this,arguments);}if(n<=1){func=undefined$1;}return result;};}/**
+ * Creates a function that invokes `func` with the `this` binding of `thisArg`
+ * and `partials` prepended to the arguments it receives.
+ *
+ * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
+ * property of bound functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to bind.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * function greet(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * var bound = _.bind(greet, object, 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * // Bound with placeholders.
+ * var bound = _.bind(greet, object, _, '!');
+ * bound('hi');
+ * // => 'hi fred!'
+ */var bind=baseRest(function(func,thisArg,partials){var bitmask=WRAP_BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bind));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(func,bitmask,thisArg,partials,holders);});/**
+ * Creates a function that invokes the method at `object[key]` with `partials`
+ * prepended to the arguments it receives.
+ *
+ * This method differs from `_.bind` by allowing bound functions to reference
+ * methods that may be redefined or don't yet exist. See
+ * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+ * for more details.
+ *
+ * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.10.0
+ * @category Function
+ * @param {Object} object The object to invoke the method on.
+ * @param {string} key The key of the method.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new bound function.
+ * @example
+ *
+ * var object = {
+ * 'user': 'fred',
+ * 'greet': function(greeting, punctuation) {
+ * return greeting + ' ' + this.user + punctuation;
+ * }
+ * };
+ *
+ * var bound = _.bindKey(object, 'greet', 'hi');
+ * bound('!');
+ * // => 'hi fred!'
+ *
+ * object.greet = function(greeting, punctuation) {
+ * return greeting + 'ya ' + this.user + punctuation;
+ * };
+ *
+ * bound('!');
+ * // => 'hiya fred!'
+ *
+ * // Bound with placeholders.
+ * var bound = _.bindKey(object, 'greet', _, '!');
+ * bound('hi');
+ * // => 'hiya fred!'
+ */var bindKey=baseRest(function(object,key,partials){var bitmask=WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bindKey));bitmask|=WRAP_PARTIAL_FLAG;}return createWrap(key,bitmask,object,partials,holders);});/**
+ * Creates a function that accepts arguments of `func` and either invokes
+ * `func` returning its result, if at least `arity` number of arguments have
+ * been provided, or returns a function that accepts the remaining `func`
+ * arguments, and so on. The arity of `func` may be specified if `func.length`
+ * is not sufficient.
+ *
+ * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+ * may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curry(abc);
+ *
+ * curried(1)(2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2)(3);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // Curried with placeholders.
+ * curried(1)(_, 3)(2);
+ * // => [1, 2, 3]
+ */function curry(func,arity,guard){arity=guard?undefined$1:arity;var result=createWrap(func,WRAP_CURRY_FLAG,undefined$1,undefined$1,undefined$1,undefined$1,undefined$1,arity);result.placeholder=curry.placeholder;return result;}/**
+ * This method is like `_.curry` except that arguments are applied to `func`
+ * in the manner of `_.partialRight` instead of `_.partial`.
+ *
+ * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for provided arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of curried functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to curry.
+ * @param {number} [arity=func.length] The arity of `func`.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the new curried function.
+ * @example
+ *
+ * var abc = function(a, b, c) {
+ * return [a, b, c];
+ * };
+ *
+ * var curried = _.curryRight(abc);
+ *
+ * curried(3)(2)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(2, 3)(1);
+ * // => [1, 2, 3]
+ *
+ * curried(1, 2, 3);
+ * // => [1, 2, 3]
+ *
+ * // Curried with placeholders.
+ * curried(3)(1, _)(2);
+ * // => [1, 2, 3]
+ */function curryRight(func,arity,guard){arity=guard?undefined$1:arity;var result=createWrap(func,WRAP_CURRY_RIGHT_FLAG,undefined$1,undefined$1,undefined$1,undefined$1,undefined$1,arity);result.placeholder=curryRight.placeholder;return result;}/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ * The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ * 'leading': true,
+ * 'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */function debounce(func,wait,options){var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=false,maxing=false,trailing=true;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}wait=toNumber(wait)||0;if(isObject(options)){leading=!!options.leading;maxing='maxWait'in options;maxWait=maxing?nativeMax(toNumber(options.maxWait)||0,wait):maxWait;trailing='trailing'in options?!!options.trailing:trailing;}function invokeFunc(time){var args=lastArgs,thisArg=lastThis;lastArgs=lastThis=undefined$1;lastInvokeTime=time;result=func.apply(thisArg,args);return result;}function leadingEdge(time){// Reset any `maxWait` timer.
+ lastInvokeTime=time;// Start the timer for the trailing edge.
+ timerId=setTimeout(timerExpired,wait);// Invoke the leading edge.
+ return leading?invokeFunc(time):result;}function remainingWait(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime,timeWaiting=wait-timeSinceLastCall;return maxing?nativeMin(timeWaiting,maxWait-timeSinceLastInvoke):timeWaiting;}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime,timeSinceLastInvoke=time-lastInvokeTime;// Either this is the first call, activity has stopped and we're at the
+ // trailing edge, the system time has gone backwards and we're treating
+ // it as the trailing edge, or we've hit the `maxWait` limit.
+ return lastCallTime===undefined$1||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&timeSinceLastInvoke>=maxWait;}function timerExpired(){var time=now();if(shouldInvoke(time)){return trailingEdge(time);}// Restart the timer.
+ timerId=setTimeout(timerExpired,remainingWait(time));}function trailingEdge(time){timerId=undefined$1;// Only invoke if we have `lastArgs` which means `func` has been
+ // debounced at least once.
+ if(trailing&&lastArgs){return invokeFunc(time);}lastArgs=lastThis=undefined$1;return result;}function cancel(){if(timerId!==undefined$1){clearTimeout(timerId);}lastInvokeTime=0;lastArgs=lastCallTime=lastThis=timerId=undefined$1;}function flush(){return timerId===undefined$1?result:trailingEdge(now());}function debounced(){var time=now(),isInvoking=shouldInvoke(time);lastArgs=arguments;lastThis=this;lastCallTime=time;if(isInvoking){if(timerId===undefined$1){return leadingEdge(lastCallTime);}if(maxing){// Handle invocations in a tight loop.
+ clearTimeout(timerId);timerId=setTimeout(timerExpired,wait);return invokeFunc(lastCallTime);}}if(timerId===undefined$1){timerId=setTimeout(timerExpired,wait);}return result;}debounced.cancel=cancel;debounced.flush=flush;return debounced;}/**
+ * Defers invoking the `func` until the current call stack has cleared. Any
+ * additional arguments are provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to defer.
+ * @param {...*} [args] The arguments to invoke `func` with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.defer(function(text) {
+ * console.log(text);
+ * }, 'deferred');
+ * // => Logs 'deferred' after one millisecond.
+ */var defer=baseRest(function(func,args){return baseDelay(func,1,args);});/**
+ * Invokes `func` after `wait` milliseconds. Any additional arguments are
+ * provided to `func` when it's invoked.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to delay.
+ * @param {number} wait The number of milliseconds to delay invocation.
+ * @param {...*} [args] The arguments to invoke `func` with.
+ * @returns {number} Returns the timer id.
+ * @example
+ *
+ * _.delay(function(text) {
+ * console.log(text);
+ * }, 1000, 'later');
+ * // => Logs 'later' after one second.
+ */var delay=baseRest(function(func,wait,args){return baseDelay(func,toNumber(wait)||0,args);});/**
+ * Creates a function that invokes `func` with arguments reversed.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to flip arguments for.
+ * @returns {Function} Returns the new flipped function.
+ * @example
+ *
+ * var flipped = _.flip(function() {
+ * return _.toArray(arguments);
+ * });
+ *
+ * flipped('a', 'b', 'c', 'd');
+ * // => ['d', 'c', 'b', 'a']
+ */function flip(func){return createWrap(func,WRAP_FLIP_FLAG);}/**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided, it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is used as the map cache key. The `func`
+ * is invoked with the `this` binding of the memoized function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the
+ * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoized function.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ * var other = { 'c': 3, 'd': 4 };
+ *
+ * var values = _.memoize(_.values);
+ * values(object);
+ * // => [1, 2]
+ *
+ * values(other);
+ * // => [3, 4]
+ *
+ * object.a = 2;
+ * values(object);
+ * // => [1, 2]
+ *
+ * // Modify the result cache.
+ * values.cache.set(object, ['a', 'b']);
+ * values(object);
+ * // => ['a', 'b']
+ *
+ * // Replace `_.memoize.Cache`.
+ * _.memoize.Cache = WeakMap;
+ */function memoize(func,resolver){if(typeof func!='function'||resolver!=null&&typeof resolver!='function'){throw new TypeError(FUNC_ERROR_TEXT);}var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key);}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result;};memoized.cache=new(memoize.Cache||MapCache)();return memoized;}// Expose `MapCache`.
+ memoize.Cache=MapCache;/**
+ * Creates a function that negates the result of the predicate `func`. The
+ * `func` predicate is invoked with the `this` binding and arguments of the
+ * created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} predicate The predicate to negate.
+ * @returns {Function} Returns the new negated function.
+ * @example
+ *
+ * function isEven(n) {
+ * return n % 2 == 0;
+ * }
+ *
+ * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+ * // => [1, 3, 5]
+ */function negate(predicate){if(typeof predicate!='function'){throw new TypeError(FUNC_ERROR_TEXT);}return function(){var args=arguments;switch(args.length){case 0:return !predicate.call(this);case 1:return !predicate.call(this,args[0]);case 2:return !predicate.call(this,args[0],args[1]);case 3:return !predicate.call(this,args[0],args[1],args[2]);}return !predicate.apply(this,args);};}/**
+ * Creates a function that is restricted to invoking `func` once. Repeat calls
+ * to the function return the value of the first invocation. The `func` is
+ * invoked with the `this` binding and arguments of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var initialize = _.once(createApplication);
+ * initialize();
+ * initialize();
+ * // => `createApplication` is invoked once
+ */function once(func){return before(2,func);}/**
+ * Creates a function that invokes `func` with its arguments transformed.
+ *
+ * @static
+ * @since 4.0.0
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to wrap.
+ * @param {...(Function|Function[])} [transforms=[_.identity]]
+ * The argument transforms.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * function doubled(n) {
+ * return n * 2;
+ * }
+ *
+ * function square(n) {
+ * return n * n;
+ * }
+ *
+ * var func = _.overArgs(function(x, y) {
+ * return [x, y];
+ * }, [square, doubled]);
+ *
+ * func(9, 3);
+ * // => [81, 6]
+ *
+ * func(10, 5);
+ * // => [100, 10]
+ */var overArgs=castRest(function(func,transforms){transforms=transforms.length==1&&isArray(transforms[0])?arrayMap(transforms[0],baseUnary(getIteratee())):arrayMap(baseFlatten(transforms,1),baseUnary(getIteratee()));var funcsLength=transforms.length;return baseRest(function(args){var index=-1,length=nativeMin(args.length,funcsLength);while(++index 'hello fred'
+ *
+ * // Partially applied with placeholders.
+ * var greetFred = _.partial(greet, _, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ */var partial=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partial));return createWrap(func,WRAP_PARTIAL_FLAG,undefined$1,partials,holders);});/**
+ * This method is like `_.partial` except that partially applied arguments
+ * are appended to the arguments it receives.
+ *
+ * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+ * builds, may be used as a placeholder for partially applied arguments.
+ *
+ * **Note:** This method doesn't set the "length" property of partially
+ * applied functions.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Function
+ * @param {Function} func The function to partially apply arguments to.
+ * @param {...*} [partials] The arguments to be partially applied.
+ * @returns {Function} Returns the new partially applied function.
+ * @example
+ *
+ * function greet(greeting, name) {
+ * return greeting + ' ' + name;
+ * }
+ *
+ * var greetFred = _.partialRight(greet, 'fred');
+ * greetFred('hi');
+ * // => 'hi fred'
+ *
+ * // Partially applied with placeholders.
+ * var sayHelloTo = _.partialRight(greet, 'hello', _);
+ * sayHelloTo('fred');
+ * // => 'hello fred'
+ */var partialRight=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partialRight));return createWrap(func,WRAP_PARTIAL_RIGHT_FLAG,undefined$1,partials,holders);});/**
+ * Creates a function that invokes `func` with arguments arranged according
+ * to the specified `indexes` where the argument value at the first index is
+ * provided as the first argument, the argument value at the second index is
+ * provided as the second argument, and so on.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Function
+ * @param {Function} func The function to rearrange arguments for.
+ * @param {...(number|number[])} indexes The arranged argument indexes.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var rearged = _.rearg(function(a, b, c) {
+ * return [a, b, c];
+ * }, [2, 0, 1]);
+ *
+ * rearged('b', 'c', 'a')
+ * // => ['a', 'b', 'c']
+ */var rearg=flatRest(function(func,indexes){return createWrap(func,WRAP_REARG_FLAG,undefined$1,undefined$1,undefined$1,indexes);});/**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as
+ * an array.
+ *
+ * **Note:** This method is based on the
+ * [rest parameter](https://mdn.io/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.rest(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */function rest(func,start){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start===undefined$1?start:toInteger(start);return baseRest(func,start);}/**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * create function and an array of arguments much like
+ * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
+ *
+ * **Note:** This method is based on the
+ * [spread operator](https://mdn.io/spread_operator).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.2.0
+ * @category Function
+ * @param {Function} func The function to spread arguments over.
+ * @param {number} [start=0] The start position of the spread.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.spread(function(who, what) {
+ * return who + ' says ' + what;
+ * });
+ *
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
+ *
+ * var numbers = Promise.all([
+ * Promise.resolve(40),
+ * Promise.resolve(36)
+ * ]);
+ *
+ * numbers.then(_.spread(function(x, y) {
+ * return x + y;
+ * }));
+ * // => a Promise of 76
+ */function spread(func,start){if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}start=start==null?0:nativeMax(toInteger(start),0);return baseRest(function(args){var array=args[start],otherArgs=castSlice(args,0,start);if(array){arrayPush(otherArgs,array);}return apply(func,this,otherArgs);});}/**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed `func` invocations and a `flush` method to
+ * immediately invoke them. Provide `options` to indicate whether `func`
+ * should be invoked on the leading and/or trailing edge of the `wait`
+ * timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ * Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ * Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+ * jQuery(element).on('click', throttled);
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel);
+ */function throttle(func,wait,options){var leading=true,trailing=true;if(typeof func!='function'){throw new TypeError(FUNC_ERROR_TEXT);}if(isObject(options)){leading='leading'in options?!!options.leading:leading;trailing='trailing'in options?!!options.trailing:trailing;}return debounce(func,wait,{'leading':leading,'maxWait':wait,'trailing':trailing});}/**
+ * Creates a function that accepts up to one argument, ignoring any
+ * additional arguments.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Function
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ * @example
+ *
+ * _.map(['6', '8', '10'], _.unary(parseInt));
+ * // => [6, 8, 10]
+ */function unary(func){return ary(func,1);}/**
+ * Creates a function that provides `value` to `wrapper` as its first
+ * argument. Any additional arguments provided to the function are appended
+ * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+ * binding of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {*} value The value to wrap.
+ * @param {Function} [wrapper=identity] The wrapper function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var p = _.wrap(_.escape, function(func, text) {
+ * return '' + func(text) + '
';
+ * });
+ *
+ * p('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles
'
+ */function wrap(value,wrapper){return partial(castFunction(wrapper),value);}/*------------------------------------------------------------------------*/ /**
+ * Casts `value` as an array if it's not one.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.4.0
+ * @category Lang
+ * @param {*} value The value to inspect.
+ * @returns {Array} Returns the cast array.
+ * @example
+ *
+ * _.castArray(1);
+ * // => [1]
+ *
+ * _.castArray({ 'a': 1 });
+ * // => [{ 'a': 1 }]
+ *
+ * _.castArray('abc');
+ * // => ['abc']
+ *
+ * _.castArray(null);
+ * // => [null]
+ *
+ * _.castArray(undefined);
+ * // => [undefined]
+ *
+ * _.castArray();
+ * // => []
+ *
+ * var array = [1, 2, 3];
+ * console.log(_.castArray(array) === array);
+ * // => true
+ */function castArray(){if(!arguments.length){return [];}var value=arguments[0];return isArray(value)?value:[value];}/**
+ * Creates a shallow clone of `value`.
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+ * and supports cloning arrays, array buffers, booleans, date objects, maps,
+ * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+ * arrays. The own enumerable properties of `arguments` objects are cloned
+ * as plain objects. An empty object is returned for uncloneable values such
+ * as error objects, functions, DOM nodes, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeep
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var shallow = _.clone(objects);
+ * console.log(shallow[0] === objects[0]);
+ * // => true
+ */function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG);}/**
+ * This method is like `_.clone` except that it accepts `customizer` which
+ * is invoked to produce the cloned value. If `customizer` returns `undefined`,
+ * cloning is handled by the method instead. The `customizer` is invoked with
+ * up to four arguments; (value [, index|key, object, stack]).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeepWith
+ * @example
+ *
+ * function customizer(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(false);
+ * }
+ * }
+ *
+ * var el = _.cloneWith(document.body, customizer);
+ *
+ * console.log(el === document.body);
+ * // => false
+ * console.log(el.nodeName);
+ * // => 'BODY'
+ * console.log(el.childNodes.length);
+ * // => 0
+ */function cloneWith(value,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;return baseClone(value,CLONE_SYMBOLS_FLAG,customizer);}/**
+ * This method is like `_.clone` except that it recursively clones `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Lang
+ * @param {*} value The value to recursively clone.
+ * @returns {*} Returns the deep cloned value.
+ * @see _.clone
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var deep = _.cloneDeep(objects);
+ * console.log(deep[0] === objects[0]);
+ * // => false
+ */function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG);}/**
+ * This method is like `_.cloneWith` except that it recursively clones `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to recursively clone.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @returns {*} Returns the deep cloned value.
+ * @see _.cloneWith
+ * @example
+ *
+ * function customizer(value) {
+ * if (_.isElement(value)) {
+ * return value.cloneNode(true);
+ * }
+ * }
+ *
+ * var el = _.cloneDeepWith(document.body, customizer);
+ *
+ * console.log(el === document.body);
+ * // => false
+ * console.log(el.nodeName);
+ * // => 'BODY'
+ * console.log(el.childNodes.length);
+ * // => 20
+ */function cloneDeepWith(value,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG,customizer);}/**
+ * Checks if `object` conforms to `source` by invoking the predicate
+ * properties of `source` with the corresponding property values of `object`.
+ *
+ * **Note:** This method is equivalent to `_.conforms` when `source` is
+ * partially applied.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.14.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property predicates to conform to.
+ * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+ * // => true
+ *
+ * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+ * // => false
+ */function conformsTo(object,source){return source==null||baseConformsTo(object,source,keys(source));}/**
+ * 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 greater than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`,
+ * else `false`.
+ * @see _.lt
+ * @example
+ *
+ * _.gt(3, 1);
+ * // => true
+ *
+ * _.gt(3, 3);
+ * // => false
+ *
+ * _.gt(1, 3);
+ * // => false
+ */var gt=createRelationalOperation(baseGt);/**
+ * Checks if `value` is greater than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than or equal to
+ * `other`, else `false`.
+ * @see _.lte
+ * @example
+ *
+ * _.gte(3, 1);
+ * // => true
+ *
+ * _.gte(3, 3);
+ * // => true
+ *
+ * _.gte(1, 3);
+ * // => false
+ */var gte=createRelationalOperation(function(value,other){return value>=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 classified as an `ArrayBuffer` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+ * @example
+ *
+ * _.isArrayBuffer(new ArrayBuffer(2));
+ * // => true
+ *
+ * _.isArrayBuffer(new Array(2));
+ * // => false
+ */var isArrayBuffer=nodeIsArrayBuffer?baseUnary(nodeIsArrayBuffer):baseIsArrayBuffer;/**
+ * 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);}/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value);}/**
+ * Checks if `value` is classified as a boolean primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
+ * @example
+ *
+ * _.isBoolean(false);
+ * // => true
+ *
+ * _.isBoolean(null);
+ * // => false
+ */function isBoolean(value){return value===true||value===false||isObjectLike(value)&&baseGetTag(value)==boolTag;}/**
+ * 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;/**
+ * Checks if `value` is classified as a `Date` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+ * @example
+ *
+ * _.isDate(new Date);
+ * // => true
+ *
+ * _.isDate('Mon April 23 2012');
+ * // => false
+ */var isDate=nodeIsDate?baseUnary(nodeIsDate):baseIsDate;/**
+ * Checks if `value` is likely a DOM element.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+ * @example
+ *
+ * _.isElement(document.body);
+ * // => true
+ *
+ * _.isElement('');
+ * // => false
+ */function isElement(value){return isObjectLike(value)&&value.nodeType===1&&!isPlainObject(value);}/**
+ * Checks if `value` is an empty object, collection, map, or set.
+ *
+ * Objects are considered empty if they have no own enumerable string keyed
+ * properties.
+ *
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+ * @example
+ *
+ * _.isEmpty(null);
+ * // => true
+ *
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
+ */function isEmpty(value){if(value==null){return true;}if(isArrayLike(value)&&(isArray(value)||typeof value=='string'||typeof value.splice=='function'||isBuffer(value)||isTypedArray(value)||isArguments(value))){return !value.length;}var tag=getTag(value);if(tag==mapTag||tag==setTag){return !value.size;}if(isPrototype(value)){return !baseKeys(value).length;}for(var key in value){if(hasOwnProperty.call(value,key)){return false;}}return true;}/**
+ * 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);}/**
+ * This method is like `_.isEqual` except that it accepts `customizer` which
+ * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+ * are handled by the method instead. The `customizer` is invoked with up to
+ * six arguments: (objValue, othValue [, index|key, object, other, stack]).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * function isGreeting(value) {
+ * return /^h(?:i|ello)$/.test(value);
+ * }
+ *
+ * function customizer(objValue, othValue) {
+ * if (isGreeting(objValue) && isGreeting(othValue)) {
+ * return true;
+ * }
+ * }
+ *
+ * var array = ['hello', 'goodbye'];
+ * var other = ['hi', 'goodbye'];
+ *
+ * _.isEqualWith(array, other, customizer);
+ * // => true
+ */function isEqualWith(value,other,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;var result=customizer?customizer(value,other):undefined$1;return result===undefined$1?baseIsEqual(value,other,undefined$1,customizer):!!result;}/**
+ * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+ * `SyntaxError`, `TypeError`, or `URIError` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+ * @example
+ *
+ * _.isError(new Error);
+ * // => true
+ *
+ * _.isError(Error);
+ * // => false
+ */function isError(value){if(!isObjectLike(value)){return false;}var tag=baseGetTag(value);return tag==errorTag||tag==domExcTag||typeof value.message=='string'&&typeof value.name=='string'&&!isPlainObject(value);}/**
+ * Checks if `value` is a finite primitive number.
+ *
+ * **Note:** This method is based on
+ * [`Number.isFinite`](https://mdn.io/Number/isFinite).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+ * @example
+ *
+ * _.isFinite(3);
+ * // => true
+ *
+ * _.isFinite(Number.MIN_VALUE);
+ * // => true
+ *
+ * _.isFinite(Infinity);
+ * // => false
+ *
+ * _.isFinite('3');
+ * // => false
+ */function isFinite(value){return typeof value=='number'&&nativeIsFinite(value);}/**
+ * 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 an integer.
+ *
+ * **Note:** This method is based on
+ * [`Number.isInteger`](https://mdn.io/Number/isInteger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
+ * @example
+ *
+ * _.isInteger(3);
+ * // => true
+ *
+ * _.isInteger(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isInteger(Infinity);
+ * // => false
+ *
+ * _.isInteger('3');
+ * // => false
+ */function isInteger(value){return typeof value=='number'&&value==toInteger(value);}/**
+ * 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 `Map` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ * @example
+ *
+ * _.isMap(new Map);
+ * // => true
+ *
+ * _.isMap(new WeakMap);
+ * // => false
+ */var isMap=nodeIsMap?baseUnary(nodeIsMap):baseIsMap;/**
+ * Performs a partial deep comparison between `object` and `source` to
+ * determine if `object` contains equivalent property values.
+ *
+ * **Note:** This method is equivalent to `_.matches` when `source` is
+ * partially applied.
+ *
+ * Partial comparisons will match empty array and empty object `source`
+ * values against any array or object value, respectively. See `_.isEqual`
+ * for a list of supported value comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ *
+ * _.isMatch(object, { 'b': 2 });
+ * // => true
+ *
+ * _.isMatch(object, { 'b': 1 });
+ * // => false
+ */function isMatch(object,source){return object===source||baseIsMatch(object,source,getMatchData(source));}/**
+ * This method is like `_.isMatch` except that it accepts `customizer` which
+ * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+ * are handled by the method instead. The `customizer` is invoked with five
+ * arguments: (objValue, srcValue, index|key, object, source).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ * @example
+ *
+ * function isGreeting(value) {
+ * return /^h(?:i|ello)$/.test(value);
+ * }
+ *
+ * function customizer(objValue, srcValue) {
+ * if (isGreeting(objValue) && isGreeting(srcValue)) {
+ * return true;
+ * }
+ * }
+ *
+ * var object = { 'greeting': 'hello' };
+ * var source = { 'greeting': 'hi' };
+ *
+ * _.isMatchWith(object, source, customizer);
+ * // => true
+ */function isMatchWith(object,source,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;return baseIsMatch(object,source,getMatchData(source),customizer);}/**
+ * Checks if `value` is `NaN`.
+ *
+ * **Note:** This method is based on
+ * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
+ * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
+ * `undefined` and other non-number values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ * @example
+ *
+ * _.isNaN(NaN);
+ * // => true
+ *
+ * _.isNaN(new Number(NaN));
+ * // => true
+ *
+ * isNaN(undefined);
+ * // => true
+ *
+ * _.isNaN(undefined);
+ * // => false
+ */function isNaN(value){// An `NaN` primitive is the only value that is not equal to itself.
+ // Perform the `toStringTag` check first to avoid errors with some
+ // ActiveX objects in IE.
+ return isNumber(value)&&value!=+value;}/**
+ * Checks if `value` is a pristine native function.
+ *
+ * **Note:** This method can't reliably detect native functions in the presence
+ * of the core-js package because core-js circumvents this kind of detection.
+ * Despite multiple requests, the core-js maintainer has made it clear: any
+ * attempt to fix the detection will be obstructed. As a result, we're left
+ * with little choice but to throw an error. Unfortunately, this also affects
+ * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+ * which rely on core-js.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */function isNative(value){if(isMaskable(value)){throw new Error(CORE_ERROR_TEXT);}return baseIsNative(value);}/**
+ * Checks if `value` is `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+ * @example
+ *
+ * _.isNull(null);
+ * // => true
+ *
+ * _.isNull(void 0);
+ * // => false
+ */function isNull(value){return value===null;}/**
+ * Checks if `value` is `null` or `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
+ * @example
+ *
+ * _.isNil(null);
+ * // => true
+ *
+ * _.isNil(void 0);
+ * // => true
+ *
+ * _.isNil(NaN);
+ * // => false
+ */function isNil(value){return value==null;}/**
+ * Checks if `value` is classified as a `Number` primitive or object.
+ *
+ * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
+ * classified as numbers, use the `_.isFinite` method.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a number, else `false`.
+ * @example
+ *
+ * _.isNumber(3);
+ * // => true
+ *
+ * _.isNumber(Number.MIN_VALUE);
+ * // => true
+ *
+ * _.isNumber(Infinity);
+ * // => true
+ *
+ * _.isNumber('3');
+ * // => false
+ */function isNumber(value){return typeof value=='number'||isObjectLike(value)&&baseGetTag(value)==numberTag;}/**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag){return false;}var proto=getPrototype(value);if(proto===null){return true;}var Ctor=hasOwnProperty.call(proto,'constructor')&&proto.constructor;return typeof Ctor=='function'&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString;}/**
+ * Checks if `value` is classified as a `RegExp` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+ * @example
+ *
+ * _.isRegExp(/abc/);
+ * // => true
+ *
+ * _.isRegExp('/abc/');
+ * // => false
+ */var isRegExp=nodeIsRegExp?baseUnary(nodeIsRegExp):baseIsRegExp;/**
+ * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+ * double precision number which isn't the result of a rounded unsafe integer.
+ *
+ * **Note:** This method is based on
+ * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
+ * @example
+ *
+ * _.isSafeInteger(3);
+ * // => true
+ *
+ * _.isSafeInteger(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isSafeInteger(Infinity);
+ * // => false
+ *
+ * _.isSafeInteger('3');
+ * // => false
+ */function isSafeInteger(value){return isInteger(value)&&value>=-MAX_SAFE_INTEGER&&value<=MAX_SAFE_INTEGER;}/**
+ * Checks if `value` is classified as a `Set` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ * @example
+ *
+ * _.isSet(new Set);
+ * // => true
+ *
+ * _.isSet(new WeakSet);
+ * // => false
+ */var isSet=nodeIsSet?baseUnary(nodeIsSet):baseIsSet;/**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */function isString(value){return typeof value=='string'||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag;}/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */function isSymbol(value){return typeof value=='symbol'||isObjectLike(value)&&baseGetTag(value)==symbolTag;}/**
+ * 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;/**
+ * Checks if `value` is `undefined`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ * @example
+ *
+ * _.isUndefined(void 0);
+ * // => true
+ *
+ * _.isUndefined(null);
+ * // => false
+ */function isUndefined(value){return value===undefined$1;}/**
+ * Checks if `value` is classified as a `WeakMap` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
+ * @example
+ *
+ * _.isWeakMap(new WeakMap);
+ * // => true
+ *
+ * _.isWeakMap(new Map);
+ * // => false
+ */function isWeakMap(value){return isObjectLike(value)&&getTag(value)==weakMapTag;}/**
+ * Checks if `value` is classified as a `WeakSet` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
+ * @example
+ *
+ * _.isWeakSet(new WeakSet);
+ * // => true
+ *
+ * _.isWeakSet(new Set);
+ * // => false
+ */function isWeakSet(value){return isObjectLike(value)&&baseGetTag(value)==weakSetTag;}/**
+ * Checks if `value` is less than `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`,
+ * else `false`.
+ * @see _.gt
+ * @example
+ *
+ * _.lt(1, 3);
+ * // => true
+ *
+ * _.lt(3, 3);
+ * // => false
+ *
+ * _.lt(3, 1);
+ * // => false
+ */var lt=createRelationalOperation(baseLt);/**
+ * Checks if `value` is less than or equal to `other`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.9.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than or equal to
+ * `other`, else `false`.
+ * @see _.gte
+ * @example
+ *
+ * _.lte(1, 3);
+ * // => true
+ *
+ * _.lte(3, 3);
+ * // => true
+ *
+ * _.lte(3, 1);
+ * // => false
+ */var lte=createRelationalOperation(function(value,other){return value<=other;});/**
+ * Converts `value` to an array.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Array} Returns the converted array.
+ * @example
+ *
+ * _.toArray({ 'a': 1, 'b': 2 });
+ * // => [1, 2]
+ *
+ * _.toArray('abc');
+ * // => ['a', 'b', 'c']
+ *
+ * _.toArray(1);
+ * // => []
+ *
+ * _.toArray(null);
+ * // => []
+ */function toArray(value){if(!value){return [];}if(isArrayLike(value)){return isString(value)?stringToArray(value):copyArray(value);}if(symIterator&&value[symIterator]){return iteratorToArray(value[symIterator]());}var tag=getTag(value),func=tag==mapTag?mapToArray:tag==setTag?setToArray:values;return func(value);}/**
+ * Converts `value` to a finite number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.12.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted number.
+ * @example
+ *
+ * _.toFinite(3.2);
+ * // => 3.2
+ *
+ * _.toFinite(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toFinite(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toFinite('3.2');
+ * // => 3.2
+ */function toFinite(value){if(!value){return value===0?value:0;}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER;}return value===value?value:0;}/**
+ * Converts `value` to an integer.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toInteger(3.2);
+ * // => 3
+ *
+ * _.toInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toInteger(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toInteger('3.2');
+ * // => 3
+ */function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0;}/**
+ * Converts `value` to an integer suitable for use as the length of an
+ * array-like object.
+ *
+ * **Note:** This method is 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 convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toLength(3.2);
+ * // => 3
+ *
+ * _.toLength(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toLength(Infinity);
+ * // => 4294967295
+ *
+ * _.toLength('3.2');
+ * // => 3
+ */function toLength(value){return value?baseClamp(toInteger(value),0,MAX_ARRAY_LENGTH):0;}/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */function toNumber(value){if(typeof value=='number'){return value;}if(isSymbol(value)){return NAN;}if(isObject(value)){var other=typeof value.valueOf=='function'?value.valueOf():value;value=isObject(other)?other+'':other;}if(typeof value!='string'){return value===0?value:+value;}value=baseTrim(value);var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value;}/**
+ * Converts `value` to a plain object flattening inherited enumerable string
+ * keyed properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */function toPlainObject(value){return copyObject(value,keysIn(value));}/**
+ * Converts `value` to a safe integer. A safe integer can be compared and
+ * represented correctly.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toSafeInteger(3.2);
+ * // => 3
+ *
+ * _.toSafeInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toSafeInteger(Infinity);
+ * // => 9007199254740991
+ *
+ * _.toSafeInteger('3.2');
+ * // => 3
+ */function toSafeInteger(value){return value?baseClamp(toInteger(value),-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER):value===0?value:0;}/**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */function toString(value){return value==null?'':baseToString(value);}/*------------------------------------------------------------------------*/ /**
+ * Assigns own enumerable string keyed properties of source objects to the
+ * destination object. Source objects are applied from left to right.
+ * Subsequent sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object` and is loosely based on
+ * [`Object.assign`](https://mdn.io/Object/assign).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.10.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.assignIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * function Bar() {
+ * this.c = 3;
+ * }
+ *
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
+ *
+ * _.assign({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'c': 3 }
+ */var assign=createAssigner(function(object,source){if(isPrototype(source)||isArrayLike(source)){copyObject(source,keys(source),object);return;}for(var key in source){if(hasOwnProperty.call(source,key)){assignValue(object,key,source[key]);}}});/**
+ * This method is like `_.assign` except that it iterates over own and
+ * inherited source properties.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias extend
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.assign
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * function Bar() {
+ * this.c = 3;
+ * }
+ *
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
+ *
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
+ */var assignIn=createAssigner(function(object,source){copyObject(source,keysIn(source),object);});/**
+ * This method is like `_.assignIn` except that it accepts `customizer`
+ * which is invoked to produce the assigned values. If `customizer` returns
+ * `undefined`, assignment is handled by the method instead. The `customizer`
+ * is invoked with five arguments: (objValue, srcValue, key, object, source).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias extendWith
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @see _.assignWith
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * return _.isUndefined(objValue) ? srcValue : objValue;
+ * }
+ *
+ * var defaults = _.partialRight(_.assignInWith, customizer);
+ *
+ * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */var assignInWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keysIn(source),object,customizer);});/**
+ * This method is like `_.assign` except that it accepts `customizer`
+ * which is invoked to produce the assigned values. If `customizer` returns
+ * `undefined`, assignment is handled by the method instead. The `customizer`
+ * is invoked with five arguments: (objValue, srcValue, key, object, source).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @see _.assignInWith
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * return _.isUndefined(objValue) ? srcValue : objValue;
+ * }
+ *
+ * var defaults = _.partialRight(_.assignWith, customizer);
+ *
+ * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */var assignWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keys(source),object,customizer);});/**
+ * Creates an array of values corresponding to `paths` of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Array} Returns the picked values.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+ *
+ * _.at(object, ['a[0].b.c', 'a[1]']);
+ * // => [3, 4]
+ */var at=flatRest(baseAt);/**
+ * Creates an object that inherits from the `prototype` object. If a
+ * `properties` object is given, its own enumerable string keyed properties
+ * are assigned to the created object.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.3.0
+ * @category Object
+ * @param {Object} prototype The object to inherit from.
+ * @param {Object} [properties] The properties to assign to the object.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * function Shape() {
+ * this.x = 0;
+ * this.y = 0;
+ * }
+ *
+ * function Circle() {
+ * Shape.call(this);
+ * }
+ *
+ * Circle.prototype = _.create(Shape.prototype, {
+ * 'constructor': Circle
+ * });
+ *
+ * var circle = new Circle;
+ * circle instanceof Circle;
+ * // => true
+ *
+ * circle instanceof Shape;
+ * // => true
+ */function create(prototype,properties){var result=baseCreate(prototype);return properties==null?result:baseAssign(result,properties);}/**
+ * Assigns own and inherited enumerable string keyed properties of source
+ * objects to the destination object for all destination properties that
+ * resolve to `undefined`. Source objects are applied from left to right.
+ * Once a property is set, additional values of the same property are ignored.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.defaultsDeep
+ * @example
+ *
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */var defaults=baseRest(function(object,sources){object=Object(object);var index=-1;var length=sources.length;var guard=length>2?sources[2]:undefined$1;if(guard&&isIterateeCall(sources[0],sources[1],guard)){length=1;}while(++index { 'a': { 'b': 2, 'c': 3 } }
+ */var defaultsDeep=baseRest(function(args){args.push(undefined$1,customDefaultsMerge);return apply(mergeWith,undefined$1,args);});/**
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {string|undefined} Returns the key of the matched element,
+ * else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findKey(users, function(o) { return o.age < 40; });
+ * // => 'barney' (iteration order is not guaranteed)
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findKey(users, { 'age': 1, 'active': true });
+ * // => 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findKey(users, ['active', false]);
+ * // => 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findKey(users, 'active');
+ * // => 'barney'
+ */function findKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwn);}/**
+ * This method is like `_.findKey` except that it iterates over elements of
+ * a collection in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {string|undefined} Returns the key of the matched element,
+ * else `undefined`.
+ * @example
+ *
+ * var users = {
+ * 'barney': { 'age': 36, 'active': true },
+ * 'fred': { 'age': 40, 'active': false },
+ * 'pebbles': { 'age': 1, 'active': true }
+ * };
+ *
+ * _.findLastKey(users, function(o) { return o.age < 40; });
+ * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findLastKey(users, { 'age': 36, 'active': true });
+ * // => 'barney'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findLastKey(users, ['active', false]);
+ * // => 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findLastKey(users, 'active');
+ * // => 'pebbles'
+ */function findLastKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwnRight);}/**
+ * Iterates over own and inherited enumerable string keyed properties of an
+ * object and invokes `iteratee` for each property. The iteratee is invoked
+ * with three arguments: (value, key, object). Iteratee functions may exit
+ * iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forInRight
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forIn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+ */function forIn(object,iteratee){return object==null?object:baseFor(object,getIteratee(iteratee,3),keysIn);}/**
+ * This method is like `_.forIn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forInRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
+ */function forInRight(object,iteratee){return object==null?object:baseForRight(object,getIteratee(iteratee,3),keysIn);}/**
+ * Iterates over own enumerable string keyed properties of an object and
+ * invokes `iteratee` for each property. The iteratee is invoked with three
+ * arguments: (value, key, object). Iteratee functions may exit iteration
+ * early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forOwnRight
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+ */function forOwn(object,iteratee){return object&&baseForOwn(object,getIteratee(iteratee,3));}/**
+ * This method is like `_.forOwn` except that it iterates over properties of
+ * `object` in the opposite order.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.0.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forOwn
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwnRight(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
+ */function forOwnRight(object,iteratee){return object&&baseForOwnRight(object,getIteratee(iteratee,3));}/**
+ * Creates an array of function property names from own enumerable properties
+ * of `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the function names.
+ * @see _.functionsIn
+ * @example
+ *
+ * function Foo() {
+ * this.a = _.constant('a');
+ * this.b = _.constant('b');
+ * }
+ *
+ * Foo.prototype.c = _.constant('c');
+ *
+ * _.functions(new Foo);
+ * // => ['a', 'b']
+ */function functions(object){return object==null?[]:baseFunctions(object,keys(object));}/**
+ * Creates an array of function property names from own and inherited
+ * enumerable properties of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to inspect.
+ * @returns {Array} Returns the function names.
+ * @see _.functions
+ * @example
+ *
+ * function Foo() {
+ * this.a = _.constant('a');
+ * this.b = _.constant('b');
+ * }
+ *
+ * Foo.prototype.c = _.constant('c');
+ *
+ * _.functionsIn(new Foo);
+ * // => ['a', 'b', 'c']
+ */function functionsIn(object){return object==null?[]:baseFunctions(object,keysIn(object));}/**
+ * Gets the value at `path` of `object`. If the resolved value is
+ * `undefined`, the `defaultValue` is returned in its place.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.7.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */function get(object,path,defaultValue){var result=object==null?undefined$1:baseGet(object,path);return result===undefined$1?defaultValue:result;}/**
+ * Checks if `path` is a direct property of `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': 2 } };
+ * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b');
+ * // => true
+ *
+ * _.has(object, ['a', 'b']);
+ * // => true
+ *
+ * _.has(other, 'a');
+ * // => false
+ */function has(object,path){return object!=null&&hasPath(object,path,baseHas);}/**
+ * Checks if `path` is a direct or inherited property of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.hasIn(object, 'a');
+ * // => true
+ *
+ * _.hasIn(object, 'a.b');
+ * // => true
+ *
+ * _.hasIn(object, ['a', 'b']);
+ * // => true
+ *
+ * _.hasIn(object, 'b');
+ * // => false
+ */function hasIn(object,path){return object!=null&&hasPath(object,path,baseHasIn);}/**
+ * Creates an object composed of the inverted keys and values of `object`.
+ * If `object` contains duplicate values, subsequent values overwrite
+ * property assignments of previous values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.7.0
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invert(object);
+ * // => { '1': 'c', '2': 'b' }
+ */var invert=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!='function'){value=nativeObjectToString.call(value);}result[value]=key;},constant(identity));/**
+ * This method is like `_.invert` except that the inverted object is generated
+ * from the results of running each element of `object` thru `iteratee`. The
+ * corresponding inverted value of each inverted key is an array of keys
+ * responsible for generating the inverted value. The iteratee is invoked
+ * with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.1.0
+ * @category Object
+ * @param {Object} object The object to invert.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Object} Returns the new inverted object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
+ *
+ * _.invertBy(object);
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ *
+ * _.invertBy(object, function(value) {
+ * return 'group' + value;
+ * });
+ * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
+ */var invertBy=createInverter(function(result,value,key){if(value!=null&&typeof value.toString!='function'){value=nativeObjectToString.call(value);}if(hasOwnProperty.call(result,value)){result[value].push(key);}else {result[value]=[key];}},getIteratee);/**
+ * Invokes the method at `path` of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the method to invoke.
+ * @param {...*} [args] The arguments to invoke the method with.
+ * @returns {*} Returns the result of the invoked method.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
+ *
+ * _.invoke(object, 'a[0].b.c.slice', 1, 3);
+ * // => [2, 3]
+ */var invoke=baseRest(baseInvoke);/**
+ * 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);}/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @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;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,true):baseKeysIn(object);}/**
+ * The opposite of `_.mapValues`; this method creates an object with the
+ * same values as `object` and keys generated by running each own enumerable
+ * string keyed property of `object` thru `iteratee`. The iteratee is invoked
+ * with three arguments: (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.8.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns the new mapped object.
+ * @see _.mapValues
+ * @example
+ *
+ * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+ * return key + value;
+ * });
+ * // => { 'a1': 1, 'b2': 2 }
+ */function mapKeys(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,iteratee(value,key,object),value);});return result;}/**
+ * Creates an object with the same keys as `object` and values generated
+ * by running each own enumerable string keyed property of `object` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns the new mapped object.
+ * @see _.mapKeys
+ * @example
+ *
+ * var users = {
+ * 'fred': { 'user': 'fred', 'age': 40 },
+ * 'pebbles': { 'user': 'pebbles', 'age': 1 }
+ * };
+ *
+ * _.mapValues(users, function(o) { return o.age; });
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.mapValues(users, 'age');
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ */function mapValues(object,iteratee){var result={};iteratee=getIteratee(iteratee,3);baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object));});return result;}/**
+ * This method is like `_.assign` except that it recursively merges own and
+ * inherited enumerable string keyed properties of source objects into the
+ * destination object. Source properties that resolve to `undefined` are
+ * skipped if a destination value exists. Array and plain object properties
+ * are merged recursively. Other objects and value types are overridden by
+ * assignment. Source objects are applied from left to right. Subsequent
+ * sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
+ * };
+ *
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
+ * };
+ *
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+ */var merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex);});/**
+ * This method is like `_.merge` except that it accepts `customizer` which
+ * is invoked to produce the merged values of the destination and source
+ * properties. If `customizer` returns `undefined`, merging is handled by the
+ * method instead. The `customizer` is invoked with six arguments:
+ * (objValue, srcValue, key, object, source, stack).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * if (_.isArray(objValue)) {
+ * return objValue.concat(srcValue);
+ * }
+ * }
+ *
+ * var object = { 'a': [1], 'b': [2] };
+ * var other = { 'a': [3], 'b': [4] };
+ *
+ * _.mergeWith(object, other, customizer);
+ * // => { 'a': [1, 3], 'b': [2, 4] }
+ */var mergeWith=createAssigner(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer);});/**
+ * The opposite of `_.pick`; this method creates an object composed of the
+ * own and inherited enumerable property paths of `object` that are not omitted.
+ *
+ * **Note:** This method is considerably slower than `_.pick`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to omit.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.omit(object, ['a', 'c']);
+ * // => { 'b': '2' }
+ */var omit=flatRest(function(object,paths){var result={};if(object==null){return result;}var isDeep=false;paths=arrayMap(paths,function(path){path=castPath(path,object);isDeep||(isDeep=path.length>1);return path;});copyObject(object,getAllKeysIn(object),result);if(isDeep){result=baseClone(result,CLONE_DEEP_FLAG|CLONE_FLAT_FLAG|CLONE_SYMBOLS_FLAG,customOmitClone);}var length=paths.length;while(length--){baseUnset(result,paths[length]);}return result;});/**
+ * The opposite of `_.pickBy`; this method creates an object composed of
+ * the own and inherited enumerable string keyed properties of `object` that
+ * `predicate` doesn't return truthy for. The predicate is invoked with two
+ * arguments: (value, key).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.omitBy(object, _.isNumber);
+ * // => { 'b': '2' }
+ */function omitBy(object,predicate){return pickBy(object,negate(getIteratee(predicate)));}/**
+ * Creates an object composed of the picked `object` properties.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.pick(object, ['a', 'c']);
+ * // => { 'a': 1, 'c': 3 }
+ */var pick=flatRest(function(object,paths){return object==null?{}:basePick(object,paths);});/**
+ * Creates an object composed of the `object` properties `predicate` returns
+ * truthy for. The predicate is invoked with two arguments: (value, key).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {Function} [predicate=_.identity] The function invoked per property.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.pickBy(object, _.isNumber);
+ * // => { 'a': 1, 'c': 3 }
+ */function pickBy(object,predicate){if(object==null){return {};}var props=arrayMap(getAllKeysIn(object),function(prop){return [prop];});predicate=getIteratee(predicate);return basePickBy(object,props,function(value,path){return predicate(value,path[0]);});}/**
+ * This method is like `_.get` except that if the resolved value is a
+ * function it's invoked with the `this` binding of its parent object and
+ * its result is returned.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to resolve.
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+ *
+ * _.result(object, 'a[0].b.c1');
+ * // => 3
+ *
+ * _.result(object, 'a[0].b.c2');
+ * // => 4
+ *
+ * _.result(object, 'a[0].b.c3', 'default');
+ * // => 'default'
+ *
+ * _.result(object, 'a[0].b.c3', _.constant('default'));
+ * // => 'default'
+ */function result(object,path,defaultValue){path=castPath(path,object);var index=-1,length=path.length;// Ensure the loop is entered when path is empty.
+ if(!length){length=1;object=undefined$1;}while(++index 4
+ *
+ * _.set(object, ['x', '0', 'y', 'z'], 5);
+ * console.log(object.x[0].y.z);
+ * // => 5
+ */function set(object,path,value){return object==null?object:baseSet(object,path,value);}/**
+ * This method is like `_.set` except that it accepts `customizer` which is
+ * invoked to produce the objects of `path`. If `customizer` returns `undefined`
+ * path creation is handled by the method instead. The `customizer` is invoked
+ * with three arguments: (nsValue, key, nsObject).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {};
+ *
+ * _.setWith(object, '[0][1]', 'a', Object);
+ * // => { '0': { '1': 'a' } }
+ */function setWith(object,path,value,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;return object==null?object:baseSet(object,path,value,customizer);}/**
+ * Creates an array of own enumerable string keyed-value pairs for `object`
+ * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+ * entries are returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias entries
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the key-value pairs.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.toPairs(new Foo);
+ * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+ */var toPairs=createToPairs(keys);/**
+ * Creates an array of own and inherited enumerable string keyed-value pairs
+ * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
+ * or set, its entries are returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias entriesIn
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the key-value pairs.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.toPairsIn(new Foo);
+ * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
+ */var toPairsIn=createToPairs(keysIn);/**
+ * An alternative to `_.reduce`; this method transforms `object` to a new
+ * `accumulator` object which is the result of running each of its own
+ * enumerable string keyed properties thru `iteratee`, with each invocation
+ * potentially mutating the `accumulator` object. If `accumulator` is not
+ * provided, a new object with the same `[[Prototype]]` will be used. The
+ * iteratee is invoked with four arguments: (accumulator, value, key, object).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The custom accumulator value.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.transform([2, 3, 4], function(result, n) {
+ * result.push(n *= n);
+ * return n % 2 == 0;
+ * }, []);
+ * // => [4, 9]
+ *
+ * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ * (result[value] || (result[value] = [])).push(key);
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ */function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);iteratee=getIteratee(iteratee,4);if(accumulator==null){var Ctor=object&&object.constructor;if(isArrLike){accumulator=isArr?new Ctor():[];}else if(isObject(object)){accumulator=isFunction(Ctor)?baseCreate(getPrototype(object)):{};}else {accumulator={};}}(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object);});return accumulator;}/**
+ * Removes the property at `path` of `object`.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to unset.
+ * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 7 } }] };
+ * _.unset(object, 'a[0].b.c');
+ * // => true
+ *
+ * console.log(object);
+ * // => { 'a': [{ 'b': {} }] };
+ *
+ * _.unset(object, ['a', '0', 'b', 'c']);
+ * // => true
+ *
+ * console.log(object);
+ * // => { 'a': [{ 'b': {} }] };
+ */function unset(object,path){return object==null?true:baseUnset(object,path);}/**
+ * This method is like `_.set` except that accepts `updater` to produce the
+ * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
+ * is invoked with one argument: (value).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {Function} updater The function to produce the updated value.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.update(object, 'a[0].b.c', function(n) { return n * n; });
+ * console.log(object.a[0].b.c);
+ * // => 9
+ *
+ * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
+ * console.log(object.x[0].y.z);
+ * // => 0
+ */function update(object,path,updater){return object==null?object:baseUpdate(object,path,castFunction(updater));}/**
+ * This method is like `_.update` except that it accepts `customizer` which is
+ * invoked to produce the objects of `path`. If `customizer` returns `undefined`
+ * path creation is handled by the method instead. The `customizer` is invoked
+ * with three arguments: (nsValue, key, nsObject).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.6.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {Function} updater The function to produce the updated value.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {};
+ *
+ * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+ * // => { '0': { '1': 'a' } }
+ */function updateWith(object,path,updater,customizer){customizer=typeof customizer=='function'?customizer:undefined$1;return object==null?object:baseUpdate(object,path,castFunction(updater),customizer);}/**
+ * Creates an array of the own enumerable string keyed property values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
+ */function values(object){return object==null?[]:baseValues(object,keys(object));}/**
+ * Creates an array of the own and inherited enumerable string keyed property
+ * values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.valuesIn(new Foo);
+ * // => [1, 2, 3] (iteration order is not guaranteed)
+ */function valuesIn(object){return object==null?[]:baseValues(object,keysIn(object));}/*------------------------------------------------------------------------*/ /**
+ * Clamps `number` within the inclusive `lower` and `upper` bounds.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Number
+ * @param {number} number The number to clamp.
+ * @param {number} [lower] The lower bound.
+ * @param {number} upper The upper bound.
+ * @returns {number} Returns the clamped number.
+ * @example
+ *
+ * _.clamp(-10, -5, 5);
+ * // => -5
+ *
+ * _.clamp(10, -5, 5);
+ * // => 5
+ */function clamp(number,lower,upper){if(upper===undefined$1){upper=lower;lower=undefined$1;}if(upper!==undefined$1){upper=toNumber(upper);upper=upper===upper?upper:0;}if(lower!==undefined$1){lower=toNumber(lower);lower=lower===lower?lower:0;}return baseClamp(toNumber(number),lower,upper);}/**
+ * Checks if `n` is between `start` and up to, but not including, `end`. If
+ * `end` is not specified, it's set to `start` with `start` then set to `0`.
+ * If `start` is greater than `end` the params are swapped to support
+ * negative ranges.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.3.0
+ * @category Number
+ * @param {number} number The number to check.
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+ * @see _.range, _.rangeRight
+ * @example
+ *
+ * _.inRange(3, 2, 4);
+ * // => true
+ *
+ * _.inRange(4, 8);
+ * // => true
+ *
+ * _.inRange(4, 2);
+ * // => false
+ *
+ * _.inRange(2, 2);
+ * // => false
+ *
+ * _.inRange(1.2, 2);
+ * // => true
+ *
+ * _.inRange(5.2, 4);
+ * // => false
+ *
+ * _.inRange(-3, -2, -6);
+ * // => true
+ */function inRange(number,start,end){start=toFinite(start);if(end===undefined$1){end=start;start=0;}else {end=toFinite(end);}number=toNumber(number);return baseInRange(number,start,end);}/**
+ * Produces a random number between the inclusive `lower` and `upper` bounds.
+ * If only one argument is provided a number between `0` and the given number
+ * is returned. If `floating` is `true`, or either `lower` or `upper` are
+ * floats, a floating-point number is returned instead of an integer.
+ *
+ * **Note:** JavaScript follows the IEEE-754 standard for resolving
+ * floating-point values which can produce unexpected results.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.7.0
+ * @category Number
+ * @param {number} [lower=0] The lower bound.
+ * @param {number} [upper=1] The upper bound.
+ * @param {boolean} [floating] Specify returning a floating-point number.
+ * @returns {number} Returns the random number.
+ * @example
+ *
+ * _.random(0, 5);
+ * // => an integer between 0 and 5
+ *
+ * _.random(5);
+ * // => also an integer between 0 and 5
+ *
+ * _.random(5, true);
+ * // => a floating-point number between 0 and 5
+ *
+ * _.random(1.2, 5.2);
+ * // => a floating-point number between 1.2 and 5.2
+ */function random(lower,upper,floating){if(floating&&typeof floating!='boolean'&&isIterateeCall(lower,upper,floating)){upper=floating=undefined$1;}if(floating===undefined$1){if(typeof upper=='boolean'){floating=upper;upper=undefined$1;}else if(typeof lower=='boolean'){floating=lower;lower=undefined$1;}}if(lower===undefined$1&&upper===undefined$1){lower=0;upper=1;}else {lower=toFinite(lower);if(upper===undefined$1){upper=lower;lower=0;}else {upper=toFinite(upper);}}if(lower>upper){var temp=lower;lower=upper;upper=temp;}if(floating||lower%1||upper%1){var rand=nativeRandom();return nativeMin(lower+rand*(upper-lower+freeParseFloat('1e-'+((rand+'').length-1))),upper);}return baseRandom(lower,upper);}/*------------------------------------------------------------------------*/ /**
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the camel cased string.
+ * @example
+ *
+ * _.camelCase('Foo Bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('--foo-bar--');
+ * // => 'fooBar'
+ *
+ * _.camelCase('__FOO_BAR__');
+ * // => 'fooBar'
+ */var camelCase=createCompounder(function(result,word,index){word=word.toLowerCase();return result+(index?capitalize(word):word);});/**
+ * Converts the first character of `string` to upper case and the remaining
+ * to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to capitalize.
+ * @returns {string} Returns the capitalized string.
+ * @example
+ *
+ * _.capitalize('FRED');
+ * // => 'Fred'
+ */function capitalize(string){return upperFirst(toString(string).toLowerCase());}/**
+ * Deburrs `string` by converting
+ * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+ * letters to basic Latin letters and removing
+ * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to deburr.
+ * @returns {string} Returns the deburred string.
+ * @example
+ *
+ * _.deburr('déjà vu');
+ * // => 'deja vu'
+ */function deburr(string){string=toString(string);return string&&string.replace(reLatin,deburrLetter).replace(reComboMark,'');}/**
+ * Checks if `string` ends with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=string.length] The position to search up to.
+ * @returns {boolean} Returns `true` if `string` ends with `target`,
+ * else `false`.
+ * @example
+ *
+ * _.endsWith('abc', 'c');
+ * // => true
+ *
+ * _.endsWith('abc', 'b');
+ * // => false
+ *
+ * _.endsWith('abc', 'b', 2);
+ * // => true
+ */function endsWith(string,target,position){string=toString(string);target=baseToString(target);var length=string.length;position=position===undefined$1?length:baseClamp(toInteger(position),0,length);var end=position;position-=target.length;return position>=0&&string.slice(position,end)==target;}/**
+ * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+ * corresponding HTML entities.
+ *
+ * **Note:** No other characters are escaped. To escape additional
+ * characters use a third-party library like [_he_](https://mths.be/he).
+ *
+ * Though the ">" character is escaped for symmetry, characters like
+ * ">" and "/" don't need escaping in HTML and have no special meaning
+ * unless they're part of a tag or unquoted attribute value. See
+ * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+ * (under "semi-related fun fact") for more details.
+ *
+ * When working with HTML you should always
+ * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+ * XSS vectors.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escape('fred, barney, & pebbles');
+ * // => 'fred, barney, & pebbles'
+ */function escape(string){string=toString(string);return string&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string;}/**
+ * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
+ * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to escape.
+ * @returns {string} Returns the escaped string.
+ * @example
+ *
+ * _.escapeRegExp('[lodash](https://lodash.com/)');
+ * // => '\[lodash\]\(https://lodash\.com/\)'
+ */function escapeRegExp(string){string=toString(string);return string&&reHasRegExpChar.test(string)?string.replace(reRegExpChar,'\\$&'):string;}/**
+ * Converts `string` to
+ * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the kebab cased string.
+ * @example
+ *
+ * _.kebabCase('Foo Bar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('fooBar');
+ * // => 'foo-bar'
+ *
+ * _.kebabCase('__FOO_BAR__');
+ * // => 'foo-bar'
+ */var kebabCase=createCompounder(function(result,word,index){return result+(index?'-':'')+word.toLowerCase();});/**
+ * Converts `string`, as space separated words, to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the lower cased string.
+ * @example
+ *
+ * _.lowerCase('--Foo-Bar--');
+ * // => 'foo bar'
+ *
+ * _.lowerCase('fooBar');
+ * // => 'foo bar'
+ *
+ * _.lowerCase('__FOO_BAR__');
+ * // => 'foo bar'
+ */var lowerCase=createCompounder(function(result,word,index){return result+(index?' ':'')+word.toLowerCase();});/**
+ * Converts the first character of `string` to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.lowerFirst('Fred');
+ * // => 'fred'
+ *
+ * _.lowerFirst('FRED');
+ * // => 'fRED'
+ */var lowerFirst=createCaseFirst('toLowerCase');/**
+ * Pads `string` on the left and right sides if it's shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.pad('abc', 8);
+ * // => ' abc '
+ *
+ * _.pad('abc', 8, '_-');
+ * // => '_-abc_-_'
+ *
+ * _.pad('abc', 3);
+ * // => 'abc'
+ */function pad(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;if(!length||strLength>=length){return string;}var mid=(length-strLength)/2;return createPadding(nativeFloor(mid),chars)+string+createPadding(nativeCeil(mid),chars);}/**
+ * Pads `string` on the right side if it's shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to pad.
+ * @param {number} [length=0] The padding length.
+ * @param {string} [chars=' '] The string used as padding.
+ * @returns {string} Returns the padded string.
+ * @example
+ *
+ * _.padEnd('abc', 6);
+ * // => 'abc '
+ *
+ * _.padEnd('abc', 6, '_-');
+ * // => 'abc_-_'
+ *
+ * _.padEnd('abc', 3);
+ * // => 'abc'
+ */function padEnd(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength ' abc'
+ *
+ * _.padStart('abc', 6, '_-');
+ * // => '_-_abc'
+ *
+ * _.padStart('abc', 3);
+ * // => 'abc'
+ */function padStart(string,length,chars){string=toString(string);length=toInteger(length);var strLength=length?stringSize(string):0;return length&&strLength 8
+ *
+ * _.map(['6', '08', '10'], _.parseInt);
+ * // => [6, 8, 10]
+ */function parseInt(string,radix,guard){if(guard||radix==null){radix=0;}else if(radix){radix=+radix;}return nativeParseInt(toString(string).replace(reTrimStart,''),radix||0);}/**
+ * Repeats the given string `n` times.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to repeat.
+ * @param {number} [n=1] The number of times to repeat the string.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {string} Returns the repeated string.
+ * @example
+ *
+ * _.repeat('*', 3);
+ * // => '***'
+ *
+ * _.repeat('abc', 2);
+ * // => 'abcabc'
+ *
+ * _.repeat('abc', 0);
+ * // => ''
+ */function repeat(string,n,guard){if(guard?isIterateeCall(string,n,guard):n===undefined$1){n=1;}else {n=toInteger(n);}return baseRepeat(toString(string),n);}/**
+ * Replaces matches for `pattern` in `string` with `replacement`.
+ *
+ * **Note:** This method is based on
+ * [`String#replace`](https://mdn.io/String/replace).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to modify.
+ * @param {RegExp|string} pattern The pattern to replace.
+ * @param {Function|string} replacement The match replacement.
+ * @returns {string} Returns the modified string.
+ * @example
+ *
+ * _.replace('Hi Fred', 'Fred', 'Barney');
+ * // => 'Hi Barney'
+ */function replace(){var args=arguments,string=toString(args[0]);return args.length<3?string:string.replace(args[1],args[2]);}/**
+ * Converts `string` to
+ * [snake case](https://en.wikipedia.org/wiki/Snake_case).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the snake cased string.
+ * @example
+ *
+ * _.snakeCase('Foo Bar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('fooBar');
+ * // => 'foo_bar'
+ *
+ * _.snakeCase('--FOO-BAR--');
+ * // => 'foo_bar'
+ */var snakeCase=createCompounder(function(result,word,index){return result+(index?'_':'')+word.toLowerCase();});/**
+ * Splits `string` by `separator`.
+ *
+ * **Note:** This method is based on
+ * [`String#split`](https://mdn.io/String/split).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to split.
+ * @param {RegExp|string} separator The separator pattern to split by.
+ * @param {number} [limit] The length to truncate results to.
+ * @returns {Array} Returns the string segments.
+ * @example
+ *
+ * _.split('a-b-c', '-', 2);
+ * // => ['a', 'b']
+ */function split(string,separator,limit){if(limit&&typeof limit!='number'&&isIterateeCall(string,separator,limit)){separator=limit=undefined$1;}limit=limit===undefined$1?MAX_ARRAY_LENGTH:limit>>>0;if(!limit){return [];}string=toString(string);if(string&&(typeof separator=='string'||separator!=null&&!isRegExp(separator))){separator=baseToString(separator);if(!separator&&hasUnicode(string)){return castSlice(stringToArray(string),0,limit);}}return string.split(separator,limit);}/**
+ * Converts `string` to
+ * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.1.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the start cased string.
+ * @example
+ *
+ * _.startCase('--foo-bar--');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('fooBar');
+ * // => 'Foo Bar'
+ *
+ * _.startCase('__FOO_BAR__');
+ * // => 'FOO BAR'
+ */var startCase=createCompounder(function(result,word,index){return result+(index?' ':'')+upperFirst(word);});/**
+ * Checks if `string` starts with the given target string.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {string} [target] The string to search for.
+ * @param {number} [position=0] The position to search from.
+ * @returns {boolean} Returns `true` if `string` starts with `target`,
+ * else `false`.
+ * @example
+ *
+ * _.startsWith('abc', 'a');
+ * // => true
+ *
+ * _.startsWith('abc', 'b');
+ * // => false
+ *
+ * _.startsWith('abc', 'b', 1);
+ * // => true
+ */function startsWith(string,target,position){string=toString(string);position=position==null?0:baseClamp(toInteger(position),0,string.length);target=baseToString(target);return string.slice(position,position+target.length)==target;}/**
+ * Creates a compiled template function that can interpolate data properties
+ * in "interpolate" delimiters, HTML-escape interpolated data properties in
+ * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+ * properties may be accessed as free variables in the template. If a setting
+ * object is given, it takes precedence over `_.templateSettings` values.
+ *
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
+ *
+ * For more information on precompiling templates see
+ * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+ *
+ * For more information on Chrome extension sandboxes see
+ * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category String
+ * @param {string} [string=''] The template string.
+ * @param {Object} [options={}] The options object.
+ * @param {RegExp} [options.escape=_.templateSettings.escape]
+ * The HTML "escape" delimiter.
+ * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
+ * The "evaluate" delimiter.
+ * @param {Object} [options.imports=_.templateSettings.imports]
+ * An object to import into the template as free variables.
+ * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
+ * The "interpolate" delimiter.
+ * @param {string} [options.sourceURL='lodash.templateSources[n]']
+ * The sourceURL of the compiled template.
+ * @param {string} [options.variable='obj']
+ * The data object variable name.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Function} Returns the compiled template function.
+ * @example
+ *
+ * // Use the "interpolate" delimiter to create a compiled template.
+ * var compiled = _.template('hello <%= user %>!');
+ * compiled({ 'user': 'fred' });
+ * // => 'hello fred!'
+ *
+ * // Use the HTML "escape" delimiter to escape data property values.
+ * var compiled = _.template('<%- value %>');
+ * compiled({ 'value': '