From d7d7582409126adc7afd59dffb82376f7f1d6b25 Mon Sep 17 00:00:00 2001
From: xingyy <373639591@qq.com>
Date: Tue, 7 Nov 2023 16:25:30 +0800
Subject: [PATCH] submit
---
App.vue | 4 +-
http/interface.js | 2 +-
pages/confirm-order/index.vue | 3 +-
pages/consignment-painting/index.vue | 63 ++++++++++++++++---
.../.sourcemap/mp-weixin/common/main.js.map | 2 +-
.../mp-weixin/common/runtime.js.map | 2 +-
.../.sourcemap/mp-weixin/common/vendor.js.map | 2 +-
.../components/title-block/title-block.js.map | 2 +-
.../components/uiq-tabbar/uiq-tabbar.js.map | 2 +-
.../pages/cameraContext/cameraContext.js.map | 2 +-
.../pages/confirm-order/index.js.map | 2 +-
.../pages/consignment-painting/index.js.map | 2 +-
.../mp-weixin/pages/contract/index.js.map | 2 +-
.../mp-weixin/pages/home/index.js.map | 2 +-
.../mp-weixin/pages/login/login.js.map | 2 +-
.../mp-weixin/pages/mine/index.js.map | 2 +-
.../mp-weixin/pages/mine/set-up.js.map | 2 +-
.../mp-weixin/pages/order-goods/index.js.map | 2 +-
.../pages/order-goods/order-details.js.map | 2 +-
.../mp-weixin/pages/payError/payError.js.map | 2 +-
.../pages/paySuccess/paySuccess.js.map | 2 +-
.../pages/realName/FDDRegister.js.map | 2 +-
.../mp-weixin/pages/realName/agreement.js.map | 2 +-
.../mp-weixin/pages/realName/realName.js.map | 2 +-
.../mp-weixin/pages/register/register.js.map | 2 +-
.../mp-weixin/pages/signwebview/index.js.map | 2 +-
.../components/tm-poup/tm-poup.js.map | 2 +-
.../uni-popup-dialog/uni-popup-dialog.js.map | 2 +-
.../components/uni-popup/uni-popup.js.map | 2 +-
.../uni-transition/uni-transition.js.map | 2 +-
.../components/u--image/u--image.js.map | 2 +-
.../components/u--input/u--input.js.map | 2 +-
.../u-action-sheet/u-action-sheet.js.map | 2 +-
.../components/u-badge/u-badge.js.map | 2 +-
.../components/u-button/u-button.js.map | 2 +-
.../u-checkbox-group/u-checkbox-group.js.map | 2 +-
.../components/u-checkbox/u-checkbox.js.map | 2 +-
.../u-count-down/u-count-down.js.map | 2 +-
.../components/u-divider/u-divider.js.map | 2 +-
.../uview-ui/components/u-gap/u-gap.js.map | 2 +-
.../uview-ui/components/u-icon/u-icon.js.map | 2 +-
.../components/u-image/u-image.js.map | 2 +-
.../components/u-input/u-input.js.map | 2 +-
.../uview-ui/components/u-line/u-line.js.map | 2 +-
.../u-loading-icon/u-loading-icon.js.map | 2 +-
.../u-loading-page/u-loading-page.js.map | 2 +-
.../components/u-overlay/u-overlay.js.map | 2 +-
.../components/u-parse/node/node.js.map | 2 +-
.../components/u-parse/u-parse.js.map | 2 +-
.../components/u-popup/u-popup.js.map | 2 +-
.../u-safe-bottom/u-safe-bottom.js.map | 2 +-
.../u-status-bar/u-status-bar.js.map | 2 +-
.../u-tabbar-item/u-tabbar-item.js.map | 2 +-
.../components/u-tabbar/u-tabbar.js.map | 2 +-
.../u-transition/u-transition.js.map | 2 +-
.../components/u-upload/u-upload.js.map | 2 +-
56 files changed, 110 insertions(+), 66 deletions(-)
diff --git a/App.vue b/App.vue
index d95cd84..6d25df6 100644
--- a/App.vue
+++ b/App.vue
@@ -29,9 +29,7 @@ export default {
.u-tabbar__content{
height: 166rpx;
}
-.tm-poup-wk{
- height: initial!important;
-}
+
.u-upload__button{
width: 404rpx!important;
height: 306rpx!important;
diff --git a/http/interface.js b/http/interface.js
index 2f7474e..dfa7585 100644
--- a/http/interface.js
+++ b/http/interface.js
@@ -4,7 +4,7 @@
*/
export default {
config: {
- baseUrl: "https://stock.szjixun.cn", //"http://172.16.100.93:8017", //"http://192.168.88.175:9021",//'https://warehouse.szjixun.cn'
+ baseUrl: "https://warehouse.szjixun.cn", //"http://172.16.100.93:8017", //"http://192.168.88.175:9021",//'https://warehouse.szjixun.cn'
header: {
"Content-Type": "application/json;charset=UTF-8",
// 'Content-Type':'application/x-www-form-urlencoded'
diff --git a/pages/confirm-order/index.vue b/pages/confirm-order/index.vue
index 4a80930..03d5d5e 100644
--- a/pages/confirm-order/index.vue
+++ b/pages/confirm-order/index.vue
@@ -179,7 +179,8 @@ export default {
artworkSizeL:this.orderingInfo.info.artworkSizeL,
artworkSizeW:this.orderingInfo.info.artworkSizeW,
artworkSquareSize:Number(this.orderingInfo.info.artworkSquareSize),
- contractTransactionId:this.orderingInfo.transactionId
+ contractTransactionId:this.orderingInfo.transactionId,
+ endAt:uni.getStorageSync("endAt")
}
const res1 = await postDataByParams('/api/warehouse/create',data1)
if (res1.code===200){
diff --git a/pages/consignment-painting/index.vue b/pages/consignment-painting/index.vue
index ac4f21c..2371841 100644
--- a/pages/consignment-painting/index.vue
+++ b/pages/consignment-painting/index.vue
@@ -26,12 +26,11 @@
上传画作图片
-
+
-
+
-
+ {show_2=true}">
更换您的寄存地址
@@ -61,8 +60,9 @@
确定
-
-
+
+
+ {show_1=true}">
请选择您的寄存时限
@@ -83,6 +83,28 @@
*暂时不可选
-->
+
+
+
+
+
+
+
+
' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.SharedObject.target) {\n Dep.SharedObject.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n if (process.env.NODE_ENV !== 'production' && !config.async) {\n // subs aren't sorted in scheduler if not running async\n // we need to sort them now to make sure they fire in correct\n // order\n subs.sort(function (a, b) { return a.id - b.id; });\n }\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\n// fixed by xxxxxx (nvue shared vuex)\n/* eslint-disable no-undef */\nDep.SharedObject = {};\nDep.SharedObject.target = null;\nDep.SharedObject.targetStack = [];\n\nfunction pushTarget (target) {\n Dep.SharedObject.targetStack.push(target);\n Dep.SharedObject.target = target;\n Dep.target = target;\n}\n\nfunction popTarget () {\n Dep.SharedObject.targetStack.pop();\n Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];\n Dep.target = Dep.SharedObject.target;\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n // #7975\n // clone children array to avoid mutating original in case of cloning\n // a child.\n vnode.children && vnode.children.slice(),\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.asyncMeta = vnode.asyncMeta;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n if (hasProto) {\n {// fixed by xxxxxx 微信小程序使用 plugins 之后,数组方法被直接挂载到了数组对象上,需要执行 copyAugment 逻辑\n if(value.push !== value.__proto__.push){\n copyAugment(value, arrayMethods, arrayKeys);\n } else {\n protoAugment(value, arrayMethods);\n }\n }\n } else {\n copyAugment(value, arrayMethods, arrayKeys);\n }\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive$$1(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue &&\n !value.__v_isMPComponent\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n var setter = property && property.set;\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key];\n }\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.SharedObject.target) { // fixed by xxxxxx\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if (process.env.NODE_ENV !== 'production' && customSetter) {\n customSetter();\n }\n // #7981: for accessor properties without setter\n if (getter && !setter) { return }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive$$1(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (process.env.NODE_ENV !== 'production') {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n\n var keys = hasSymbol\n ? Reflect.ownKeys(from)\n : Object.keys(from);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n // in case the object is already observed...\n if (key === '__ob__') { continue }\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (\n toVal !== fromVal &&\n isPlainObject(toVal) &&\n isPlainObject(fromVal)\n ) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n process.env.NODE_ENV !== 'production' && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n var res = childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal;\n return res\n ? dedupeHooks(res)\n : res\n}\n\nfunction dedupeHooks (hooks) {\n var res = [];\n for (var i = 0; i < hooks.length; i++) {\n if (res.indexOf(hooks[i]) === -1) {\n res.push(hooks[i]);\n }\n }\n return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'should conform to valid custom element name in html5 specification.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (process.env.NODE_ENV !== 'production') {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def$$1 = dirs[key];\n if (typeof def$$1 === 'function') {\n dirs[key] = { bind: def$$1, update: def$$1 };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (process.env.NODE_ENV !== 'production') {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n\n // Apply extends and mixins on the child options,\n // but only if it is a raw options object that isn't\n // the result of another mergeOptions call.\n // Only merged options has the _base property.\n if (!child._base) {\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n }\n\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\n\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n process.env.NODE_ENV !== 'production' &&\n // skip validation for weex recycle-list child component props\n !(false)\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if (process.env.NODE_ENV !== 'production' && isObject(def)) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n\n if (!valid) {\n warn(\n getInvalidTypeMessage(name, value, expectedTypes),\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n var expectedType = expectedTypes[0];\n var receivedType = toRawType(value);\n var expectedValue = styleValue(value, expectedType);\n var receivedValue = styleValue(value, receivedType);\n // check if we need to specify expected value\n if (expectedTypes.length === 1 &&\n isExplicable(expectedType) &&\n !isBoolean(expectedType, receivedType)) {\n message += \" with value \" + expectedValue;\n }\n message += \", got \" + receivedType + \" \";\n // check if we need to specify received value\n if (isExplicable(receivedType)) {\n message += \"with value \" + receivedValue + \".\";\n }\n return message\n}\n\nfunction styleValue (value, type) {\n if (type === 'String') {\n return (\"\\\"\" + value + \"\\\"\")\n } else if (type === 'Number') {\n return (\"\" + (Number(value)))\n } else {\n return (\"\" + value)\n }\n}\n\nfunction isExplicable (value) {\n var explicitTypes = ['string', 'number', 'boolean'];\n return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n // See: https://github.com/vuejs/vuex/issues/1505\n pushTarget();\n try {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n } finally {\n popTarget();\n }\n}\n\nfunction invokeWithErrorHandling (\n handler,\n context,\n args,\n vm,\n info\n) {\n var res;\n try {\n res = args ? handler.apply(context, args) : handler.call(context);\n if (res && !res._isVue && isPromise(res) && !res._handled) {\n res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n // issue #9511\n // avoid catch triggering multiple times when nested calls\n res._handled = true;\n }\n } catch (e) {\n handleError(e, vm, info);\n }\n return res\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n // if the user intentionally throws the original error in the handler,\n // do not log it twice\n if (e !== err) {\n logError(e, null, 'config.errorHandler');\n }\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (process.env.NODE_ENV !== 'production') {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n timerFunc = function () {\n p.then(flushCallbacks);\n // In problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n isNative(MutationObserver) ||\n // PhantomJS and iOS 7.x\n MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n // Use MutationObserver where native Promise is not available,\n // e.g. PhantomJS, iOS7, Android 4.4\n // (#6466 MutationObserver is unreliable in IE11)\n var counter = 1;\n var observer = new MutationObserver(flushCallbacks);\n var textNode = document.createTextNode(String(counter));\n observer.observe(textNode, {\n characterData: true\n });\n timerFunc = function () {\n counter = (counter + 1) % 2;\n textNode.data = String(counter);\n };\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n // Fallback to setImmediate.\n // Technically it leverages the (macro) task queue,\n // but it is still a better choice than setTimeout.\n timerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else {\n // Fallback to setTimeout.\n timerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n timerFunc();\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (process.env.NODE_ENV !== 'production') {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var warnReservedPrefix = function (target, key) {\n warn(\n \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n 'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n 'prevent conflicts with Vue internals. ' +\n 'See: https://vuejs.org/v2/api/#data',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) ||\n (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n if (!has && !isAllowed) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\nvar mark;\nvar measure;\n\nif (process.env.NODE_ENV !== 'production') {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n // perf.clearMeasures(name)\n };\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns, vm) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n }\n } else {\n // return handler return value for single handlers\n return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n createOnceHandler,\n vm\n) {\n var name, def$$1, cur, old, event;\n for (name in on) {\n def$$1 = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n if (isUndef(cur)) {\n process.env.NODE_ENV !== 'production' && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur, vm);\n }\n if (isTrue(event.once)) {\n cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n }\n add(event.name, cur, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\n/* */\n\n// fixed by xxxxxx (mp properties)\r\nfunction extractPropertiesFromVNodeData(data, Ctor, res, context) {\r\n var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties;\r\n if (isUndef(propOptions)) {\r\n return res\r\n }\n var externalClasses = Ctor.options.mpOptions.externalClasses || [];\r\n var attrs = data.attrs;\n var props = data.props;\r\n if (isDef(attrs) || isDef(props)) {\r\n for (var key in propOptions) {\r\n var altKey = hyphenate(key);\n var result = checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n // externalClass\n if (\n result &&\n res[key] &&\n externalClasses.indexOf(altKey) !== -1 &&\n context[camelize(res[key])]\n ) {\n // 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串)\n res[key] = context[camelize(res[key])];\n }\r\n }\r\n }\r\n return res\r\n}\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag,\n context// fixed by xxxxxx\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n // fixed by xxxxxx\n return extractPropertiesFromVNodeData(data, Ctor, {}, context)\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (process.env.NODE_ENV !== 'production') {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n // fixed by xxxxxx\n return extractPropertiesFromVNodeData(data, Ctor, res, context)\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. , , v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n return isPrimitive(children)\n ? [createTextVNode(children)]\n : Array.isArray(children)\n ? normalizeArrayChildren(children)\n : undefined\n}\n\nfunction isTextNode (node) {\n return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n var res = [];\n var i, c, lastIndex, last;\n for (i = 0; i < children.length; i++) {\n c = children[i];\n if (isUndef(c) || typeof c === 'boolean') { continue }\n lastIndex = res.length - 1;\n last = res[lastIndex];\n // nested\n if (Array.isArray(c)) {\n if (c.length > 0) {\n c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n // merge adjacent text nodes\n if (isTextNode(c[0]) && isTextNode(last)) {\n res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n c.shift();\n }\n res.push.apply(res, c);\n }\n } else if (isPrimitive(c)) {\n if (isTextNode(last)) {\n // merge adjacent text nodes\n // this is necessary for SSR hydration because text nodes are\n // essentially merged when rendered to HTML strings\n res[lastIndex] = createTextVNode(last.text + c);\n } else if (c !== '') {\n // convert primitive to vnode\n res.push(createTextVNode(c));\n }\n } else {\n if (isTextNode(c) && isTextNode(last)) {\n // merge adjacent text nodes\n res[lastIndex] = createTextVNode(last.text + c.text);\n } else {\n // default key for nested array children (likely generated by v-for)\n if (isTrue(children._isVList) &&\n isDef(c.tag) &&\n isUndef(c.key) &&\n isDef(nestedIndex)) {\n c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n }\n res.push(c);\n }\n }\n }\n return res\n}\n\n/* */\n\nfunction initProvide (vm) {\n var provide = vm.$options.provide;\n if (provide) {\n vm._provided = typeof provide === 'function'\n ? provide.call(vm)\n : provide;\n }\n}\n\nfunction initInjections (vm) {\n var result = resolveInject(vm.$options.inject, vm);\n if (result) {\n toggleObserving(false);\n Object.keys(result).forEach(function (key) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n defineReactive$$1(vm, key, result[key], function () {\n warn(\n \"Avoid mutating an injected value directly since the changes will be \" +\n \"overwritten whenever the provided component re-renders. \" +\n \"injection being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n });\n } else {\n defineReactive$$1(vm, key, result[key]);\n }\n });\n toggleObserving(true);\n }\n}\n\nfunction resolveInject (inject, vm) {\n if (inject) {\n // inject is :any because flow is not smart enough to figure out cached\n var result = Object.create(null);\n var keys = hasSymbol\n ? Reflect.ownKeys(inject)\n : Object.keys(inject);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n // #6574 in case the inject object is observed...\n if (key === '__ob__') { continue }\n var provideKey = inject[key].from;\n var source = vm;\n while (source) {\n if (source._provided && hasOwn(source._provided, provideKey)) {\n result[key] = source._provided[provideKey];\n break\n }\n source = source.$parent;\n }\n if (!source) {\n if ('default' in inject[key]) {\n var provideDefault = inject[key].default;\n result[key] = typeof provideDefault === 'function'\n ? provideDefault.call(vm)\n : provideDefault;\n } else if (process.env.NODE_ENV !== 'production') {\n warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n }\n }\n }\n return result\n }\n}\n\n/* */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n children,\n context\n) {\n if (!children || !children.length) {\n return {}\n }\n var slots = {};\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n var data = child.data;\n // remove slot attribute if the node is resolved as a Vue slot node\n if (data && data.attrs && data.attrs.slot) {\n delete data.attrs.slot;\n }\n // named slots should only be respected if the vnode was rendered in the\n // same context.\n if ((child.context === context || child.fnContext === context) &&\n data && data.slot != null\n ) {\n var name = data.slot;\n var slot = (slots[name] || (slots[name] = []));\n if (child.tag === 'template') {\n slot.push.apply(slot, child.children || []);\n } else {\n slot.push(child);\n }\n } else {\n // fixed by xxxxxx 临时 hack 掉 uni-app 中的异步 name slot page\n if(child.asyncMeta && child.asyncMeta.data && child.asyncMeta.data.slot === 'page'){\n (slots['page'] || (slots['page'] = [])).push(child);\n }else{\n (slots.default || (slots.default = [])).push(child);\n }\n }\n }\n // ignore slots that contains only whitespace\n for (var name$1 in slots) {\n if (slots[name$1].every(isWhitespace)) {\n delete slots[name$1];\n }\n }\n return slots\n}\n\nfunction isWhitespace (node) {\n return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\n/* */\n\nfunction normalizeScopedSlots (\n slots,\n normalSlots,\n prevSlots\n) {\n var res;\n var hasNormalSlots = Object.keys(normalSlots).length > 0;\n var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n var key = slots && slots.$key;\n if (!slots) {\n res = {};\n } else if (slots._normalized) {\n // fast path 1: child component re-render only, parent did not change\n return slots._normalized\n } else if (\n isStable &&\n prevSlots &&\n prevSlots !== emptyObject &&\n key === prevSlots.$key &&\n !hasNormalSlots &&\n !prevSlots.$hasNormal\n ) {\n // fast path 2: stable scoped slots w/ no normal slots to proxy,\n // only need to normalize once\n return prevSlots\n } else {\n res = {};\n for (var key$1 in slots) {\n if (slots[key$1] && key$1[0] !== '$') {\n res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n }\n }\n }\n // expose normal slots on scopedSlots\n for (var key$2 in normalSlots) {\n if (!(key$2 in res)) {\n res[key$2] = proxyNormalSlot(normalSlots, key$2);\n }\n }\n // avoriaz seems to mock a non-extensible $scopedSlots object\n // and when that is passed down this would cause an error\n if (slots && Object.isExtensible(slots)) {\n (slots)._normalized = res;\n }\n def(res, '$stable', isStable);\n def(res, '$key', key);\n def(res, '$hasNormal', hasNormalSlots);\n return res\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n var normalized = function () {\n var res = arguments.length ? fn.apply(null, arguments) : fn({});\n res = res && typeof res === 'object' && !Array.isArray(res)\n ? [res] // single vnode\n : normalizeChildren(res);\n return res && (\n res.length === 0 ||\n (res.length === 1 && res[0].isComment) // #9658\n ) ? undefined\n : res\n };\n // this is a slot using the new v-slot syntax without scope. although it is\n // compiled as a scoped slot, render fn users would expect it to be present\n // on this.$slots because the usage is semantically a normal slot.\n if (fn.proxy) {\n Object.defineProperty(normalSlots, key, {\n get: normalized,\n enumerable: true,\n configurable: true\n });\n }\n return normalized\n}\n\nfunction proxyNormalSlot(slots, key) {\n return function () { return slots[key]; }\n}\n\n/* */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n val,\n render\n) {\n var ret, i, l, keys, key;\n if (Array.isArray(val) || typeof val === 'string') {\n ret = new Array(val.length);\n for (i = 0, l = val.length; i < l; i++) {\n ret[i] = render(val[i], i, i, i); // fixed by xxxxxx\n }\n } else if (typeof val === 'number') {\n ret = new Array(val);\n for (i = 0; i < val; i++) {\n ret[i] = render(i + 1, i, i, i); // fixed by xxxxxx\n }\n } else if (isObject(val)) {\n if (hasSymbol && val[Symbol.iterator]) {\n ret = [];\n var iterator = val[Symbol.iterator]();\n var result = iterator.next();\n while (!result.done) {\n ret.push(render(result.value, ret.length, i, i++)); // fixed by xxxxxx\n result = iterator.next();\n }\n } else {\n keys = Object.keys(val);\n ret = new Array(keys.length);\n for (i = 0, l = keys.length; i < l; i++) {\n key = keys[i];\n ret[i] = render(val[key], key, i, i); // fixed by xxxxxx\n }\n }\n }\n if (!isDef(ret)) {\n ret = [];\n }\n (ret)._isVList = true;\n return ret\n}\n\n/* */\n\n/**\n * Runtime helper for rendering \n */\nfunction renderSlot (\n name,\n fallback,\n props,\n bindObject\n) {\n var scopedSlotFn = this.$scopedSlots[name];\n var nodes;\n if (scopedSlotFn) { // scoped slot\n props = props || {};\n if (bindObject) {\n if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {\n warn(\n 'slot v-bind without argument expects an Object',\n this\n );\n }\n props = extend(extend({}, bindObject), props);\n }\n // fixed by xxxxxx app-plus scopedSlot\n nodes = scopedSlotFn(props, this, props._i) || fallback;\n } else {\n nodes = this.$slots[name] || fallback;\n }\n\n var target = props && props.slot;\n if (target) {\n return this.$createElement('template', { slot: target }, nodes)\n } else {\n return nodes\n }\n}\n\n/* */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/* */\n\nfunction isKeyNotMatch (expect, actual) {\n if (Array.isArray(expect)) {\n return expect.indexOf(actual) === -1\n } else {\n return expect !== actual\n }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n eventKeyCode,\n key,\n builtInKeyCode,\n eventKeyName,\n builtInKeyName\n) {\n var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n return isKeyNotMatch(builtInKeyName, eventKeyName)\n } else if (mappedKeyCode) {\n return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n } else if (eventKeyName) {\n return hyphenate(eventKeyName) !== key\n }\n}\n\n/* */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n data,\n tag,\n value,\n asProp,\n isSync\n) {\n if (value) {\n if (!isObject(value)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'v-bind without argument expects an Object or Array value',\n this\n );\n } else {\n if (Array.isArray(value)) {\n value = toObject(value);\n }\n var hash;\n var loop = function ( key ) {\n if (\n key === 'class' ||\n key === 'style' ||\n isReservedAttribute(key)\n ) {\n hash = data;\n } else {\n var type = data.attrs && data.attrs.type;\n hash = asProp || config.mustUseProp(tag, type, key)\n ? data.domProps || (data.domProps = {})\n : data.attrs || (data.attrs = {});\n }\n var camelizedKey = camelize(key);\n var hyphenatedKey = hyphenate(key);\n if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n hash[key] = value[key];\n\n if (isSync) {\n var on = data.on || (data.on = {});\n on[(\"update:\" + key)] = function ($event) {\n value[key] = $event;\n };\n }\n }\n };\n\n for (var key in value) loop( key );\n }\n }\n return data\n}\n\n/* */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n index,\n isInFor\n) {\n var cached = this._staticTrees || (this._staticTrees = []);\n var tree = cached[index];\n // if has already-rendered static tree and not inside v-for,\n // we can reuse the same tree.\n if (tree && !isInFor) {\n return tree\n }\n // otherwise, render a fresh tree.\n tree = cached[index] = this.$options.staticRenderFns[index].call(\n this._renderProxy,\n null,\n this // for render fns generated for functional component templates\n );\n markStatic(tree, (\"__static__\" + index), false);\n return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n tree,\n index,\n key\n) {\n markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n return tree\n}\n\nfunction markStatic (\n tree,\n key,\n isOnce\n) {\n if (Array.isArray(tree)) {\n for (var i = 0; i < tree.length; i++) {\n if (tree[i] && typeof tree[i] !== 'string') {\n markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n }\n }\n } else {\n markStaticNode(tree, key, isOnce);\n }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n node.isStatic = true;\n node.key = key;\n node.isOnce = isOnce;\n}\n\n/* */\n\nfunction bindObjectListeners (data, value) {\n if (value) {\n if (!isPlainObject(value)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'v-on without argument expects an Object value',\n this\n );\n } else {\n var on = data.on = data.on ? extend({}, data.on) : {};\n for (var key in value) {\n var existing = on[key];\n var ours = value[key];\n on[key] = existing ? [].concat(existing, ours) : ours;\n }\n }\n }\n return data\n}\n\n/* */\n\nfunction resolveScopedSlots (\n fns, // see flow/vnode\n res,\n // the following are added in 2.6\n hasDynamicKeys,\n contentHashKey\n) {\n res = res || { $stable: !hasDynamicKeys };\n for (var i = 0; i < fns.length; i++) {\n var slot = fns[i];\n if (Array.isArray(slot)) {\n resolveScopedSlots(slot, res, hasDynamicKeys);\n } else if (slot) {\n // marker for reverse proxying v-slot without scope on this.$slots\n if (slot.proxy) {\n slot.fn.proxy = true;\n }\n res[slot.key] = slot.fn;\n }\n }\n if (contentHashKey) {\n (res).$key = contentHashKey;\n }\n return res\n}\n\n/* */\n\nfunction bindDynamicKeys (baseObj, values) {\n for (var i = 0; i < values.length; i += 2) {\n var key = values[i];\n if (typeof key === 'string' && key) {\n baseObj[values[i]] = values[i + 1];\n } else if (process.env.NODE_ENV !== 'production' && key !== '' && key !== null) {\n // null is a special value for explicitly removing a binding\n warn(\n (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n this\n );\n }\n }\n return baseObj\n}\n\n// helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\nfunction prependModifier (value, symbol) {\n return typeof value === 'string' ? symbol + value : value\n}\n\n/* */\n\nfunction installRenderHelpers (target) {\n target._o = markOnce;\n target._n = toNumber;\n target._s = toString;\n target._l = renderList;\n target._t = renderSlot;\n target._q = looseEqual;\n target._i = looseIndexOf;\n target._m = renderStatic;\n target._f = resolveFilter;\n target._k = checkKeyCodes;\n target._b = bindObjectProps;\n target._v = createTextVNode;\n target._e = createEmptyVNode;\n target._u = resolveScopedSlots;\n target._g = bindObjectListeners;\n target._d = bindDynamicKeys;\n target._p = prependModifier;\n}\n\n/* */\n\nfunction FunctionalRenderContext (\n data,\n props,\n children,\n parent,\n Ctor\n) {\n var this$1 = this;\n\n var options = Ctor.options;\n // ensure the createElement function in functional components\n // gets a unique context - this is necessary for correct named slot check\n var contextVm;\n if (hasOwn(parent, '_uid')) {\n contextVm = Object.create(parent);\n // $flow-disable-line\n contextVm._original = parent;\n } else {\n // the context vm passed in is a functional context as well.\n // in this case we want to make sure we are able to get a hold to the\n // real context instance.\n contextVm = parent;\n // $flow-disable-line\n parent = parent._original;\n }\n var isCompiled = isTrue(options._compiled);\n var needNormalization = !isCompiled;\n\n this.data = data;\n this.props = props;\n this.children = children;\n this.parent = parent;\n this.listeners = data.on || emptyObject;\n this.injections = resolveInject(options.inject, parent);\n this.slots = function () {\n if (!this$1.$slots) {\n normalizeScopedSlots(\n data.scopedSlots,\n this$1.$slots = resolveSlots(children, parent)\n );\n }\n return this$1.$slots\n };\n\n Object.defineProperty(this, 'scopedSlots', ({\n enumerable: true,\n get: function get () {\n return normalizeScopedSlots(data.scopedSlots, this.slots())\n }\n }));\n\n // support for compiled functional template\n if (isCompiled) {\n // exposing $options for renderStatic()\n this.$options = options;\n // pre-resolve slots for renderSlot()\n this.$slots = this.slots();\n this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n }\n\n if (options._scopeId) {\n this._c = function (a, b, c, d) {\n var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n if (vnode && !Array.isArray(vnode)) {\n vnode.fnScopeId = options._scopeId;\n vnode.fnContext = parent;\n }\n return vnode\n };\n } else {\n this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n Ctor,\n propsData,\n data,\n contextVm,\n children\n) {\n var options = Ctor.options;\n var props = {};\n var propOptions = options.props;\n if (isDef(propOptions)) {\n for (var key in propOptions) {\n props[key] = validateProp(key, propOptions, propsData || emptyObject);\n }\n } else {\n if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n if (isDef(data.props)) { mergeProps(props, data.props); }\n }\n\n var renderContext = new FunctionalRenderContext(\n data,\n props,\n children,\n contextVm,\n Ctor\n );\n\n var vnode = options.render.call(null, renderContext._c, renderContext);\n\n if (vnode instanceof VNode) {\n return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n } else if (Array.isArray(vnode)) {\n var vnodes = normalizeChildren(vnode) || [];\n var res = new Array(vnodes.length);\n for (var i = 0; i < vnodes.length; i++) {\n res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n }\n return res\n }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n // #7817 clone node before setting fnContext, otherwise if the node is reused\n // (e.g. it was from a cached normal slot) the fnContext causes named slots\n // that should not be matched to match.\n var clone = cloneVNode(vnode);\n clone.fnContext = contextVm;\n clone.fnOptions = options;\n if (process.env.NODE_ENV !== 'production') {\n (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n }\n if (data.slot) {\n (clone.data || (clone.data = {})).slot = data.slot;\n }\n return clone\n}\n\nfunction mergeProps (to, from) {\n for (var key in from) {\n to[camelize(key)] = from[key];\n }\n}\n\n/* */\n\n/* */\n\n/* */\n\n/* */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n init: function init (vnode, hydrating) {\n if (\n vnode.componentInstance &&\n !vnode.componentInstance._isDestroyed &&\n vnode.data.keepAlive\n ) {\n // kept-alive components, treat as a patch\n var mountedNode = vnode; // work around flow\n componentVNodeHooks.prepatch(mountedNode, mountedNode);\n } else {\n var child = vnode.componentInstance = createComponentInstanceForVnode(\n vnode,\n activeInstance\n );\n child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n }\n },\n\n prepatch: function prepatch (oldVnode, vnode) {\n var options = vnode.componentOptions;\n var child = vnode.componentInstance = oldVnode.componentInstance;\n updateChildComponent(\n child,\n options.propsData, // updated props\n options.listeners, // updated listeners\n vnode, // new parent vnode\n options.children // new children\n );\n },\n\n insert: function insert (vnode) {\n var context = vnode.context;\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isMounted) {\n callHook(componentInstance, 'onServiceCreated');\n callHook(componentInstance, 'onServiceAttached');\n componentInstance._isMounted = true;\n callHook(componentInstance, 'mounted');\n }\n if (vnode.data.keepAlive) {\n if (context._isMounted) {\n // vue-router#1212\n // During updates, a kept-alive component's child components may\n // change, so directly walking the tree here may call activated hooks\n // on incorrect children. Instead we push them into a queue which will\n // be processed after the whole patch process ended.\n queueActivatedComponent(componentInstance);\n } else {\n activateChildComponent(componentInstance, true /* direct */);\n }\n }\n },\n\n destroy: function destroy (vnode) {\n var componentInstance = vnode.componentInstance;\n if (!componentInstance._isDestroyed) {\n if (!vnode.data.keepAlive) {\n componentInstance.$destroy();\n } else {\n deactivateChildComponent(componentInstance, true /* direct */);\n }\n }\n }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n Ctor,\n data,\n context,\n children,\n tag\n) {\n if (isUndef(Ctor)) {\n return\n }\n\n var baseCtor = context.$options._base;\n\n // plain options object: turn it into a constructor\n if (isObject(Ctor)) {\n Ctor = baseCtor.extend(Ctor);\n }\n\n // if at this stage it's not a constructor or an async component factory,\n // reject.\n if (typeof Ctor !== 'function') {\n if (process.env.NODE_ENV !== 'production') {\n warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n }\n return\n }\n\n // async component\n var asyncFactory;\n if (isUndef(Ctor.cid)) {\n asyncFactory = Ctor;\n Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n if (Ctor === undefined) {\n // return a placeholder node for async component, which is rendered\n // as a comment node but preserves all the raw information for the node.\n // the information will be used for async server-rendering and hydration.\n return createAsyncPlaceholder(\n asyncFactory,\n data,\n context,\n children,\n tag\n )\n }\n }\n\n data = data || {};\n\n // resolve constructor options in case global mixins are applied after\n // component constructor creation\n resolveConstructorOptions(Ctor);\n\n // transform component v-model data into props & events\n if (isDef(data.model)) {\n transformModel(Ctor.options, data);\n }\n\n // extract props\n var propsData = extractPropsFromVNodeData(data, Ctor, tag, context); // fixed by xxxxxx\n\n // functional component\n if (isTrue(Ctor.options.functional)) {\n return createFunctionalComponent(Ctor, propsData, data, context, children)\n }\n\n // extract listeners, since these needs to be treated as\n // child component listeners instead of DOM listeners\n var listeners = data.on;\n // replace with listeners with .native modifier\n // so it gets processed during parent component patch.\n data.on = data.nativeOn;\n\n if (isTrue(Ctor.options.abstract)) {\n // abstract components do not keep anything\n // other than props & listeners & slot\n\n // work around flow\n var slot = data.slot;\n data = {};\n if (slot) {\n data.slot = slot;\n }\n }\n\n // install component management hooks onto the placeholder node\n installComponentHooks(data);\n\n // return a placeholder vnode\n var name = Ctor.options.name || tag;\n var vnode = new VNode(\n (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n data, undefined, undefined, undefined, context,\n { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n asyncFactory\n );\n\n return vnode\n}\n\nfunction createComponentInstanceForVnode (\n vnode, // we know it's MountedComponentVNode but flow doesn't\n parent // activeInstance in lifecycle state\n) {\n var options = {\n _isComponent: true,\n _parentVnode: vnode,\n parent: parent\n };\n // check inline-template render functions\n var inlineTemplate = vnode.data.inlineTemplate;\n if (isDef(inlineTemplate)) {\n options.render = inlineTemplate.render;\n options.staticRenderFns = inlineTemplate.staticRenderFns;\n }\n return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n var hooks = data.hook || (data.hook = {});\n for (var i = 0; i < hooksToMerge.length; i++) {\n var key = hooksToMerge[i];\n var existing = hooks[key];\n var toMerge = componentVNodeHooks[key];\n if (existing !== toMerge && !(existing && existing._merged)) {\n hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n }\n }\n}\n\nfunction mergeHook$1 (f1, f2) {\n var merged = function (a, b) {\n // flow complains about extra args which is why we use any\n f1(a, b);\n f2(a, b);\n };\n merged._merged = true;\n return merged\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n var prop = (options.model && options.model.prop) || 'value';\n var event = (options.model && options.model.event) || 'input'\n ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n var on = data.on || (data.on = {});\n var existing = on[event];\n var callback = data.model.callback;\n if (isDef(existing)) {\n if (\n Array.isArray(existing)\n ? existing.indexOf(callback) === -1\n : existing !== callback\n ) {\n on[event] = [callback].concat(existing);\n }\n } else {\n on[event] = callback;\n }\n}\n\n/* */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n context,\n tag,\n data,\n children,\n normalizationType,\n alwaysNormalize\n) {\n if (Array.isArray(data) || isPrimitive(data)) {\n normalizationType = children;\n children = data;\n data = undefined;\n }\n if (isTrue(alwaysNormalize)) {\n normalizationType = ALWAYS_NORMALIZE;\n }\n return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n context,\n tag,\n data,\n children,\n normalizationType\n) {\n if (isDef(data) && isDef((data).__ob__)) {\n process.env.NODE_ENV !== 'production' && warn(\n \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n 'Always create fresh vnode data objects in each render!',\n context\n );\n return createEmptyVNode()\n }\n // object syntax in v-bind\n if (isDef(data) && isDef(data.is)) {\n tag = data.is;\n }\n if (!tag) {\n // in case of component :is set to falsy value\n return createEmptyVNode()\n }\n // warn against non-primitive key\n if (process.env.NODE_ENV !== 'production' &&\n isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n ) {\n {\n warn(\n 'Avoid using non-primitive value as key, ' +\n 'use string/number value instead.',\n context\n );\n }\n }\n // support single function children as default scoped slot\n if (Array.isArray(children) &&\n typeof children[0] === 'function'\n ) {\n data = data || {};\n data.scopedSlots = { default: children[0] };\n children.length = 0;\n }\n if (normalizationType === ALWAYS_NORMALIZE) {\n children = normalizeChildren(children);\n } else if (normalizationType === SIMPLE_NORMALIZE) {\n children = simpleNormalizeChildren(children);\n }\n var vnode, ns;\n if (typeof tag === 'string') {\n var Ctor;\n ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n if (config.isReservedTag(tag)) {\n // platform built-in elements\n if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn)) {\n warn(\n (\"The .native modifier for v-on is only valid on components but it was used on <\" + tag + \">.\"),\n context\n );\n }\n vnode = new VNode(\n config.parsePlatformTagName(tag), data, children,\n undefined, undefined, context\n );\n } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n // component\n vnode = createComponent(Ctor, data, context, children, tag);\n } else {\n // unknown or unlisted namespaced elements\n // check at runtime because it may get assigned a namespace when its\n // parent normalizes children\n vnode = new VNode(\n tag, data, children,\n undefined, undefined, context\n );\n }\n } else {\n // direct component options / constructor\n vnode = createComponent(tag, data, context, children);\n }\n if (Array.isArray(vnode)) {\n return vnode\n } else if (isDef(vnode)) {\n if (isDef(ns)) { applyNS(vnode, ns); }\n if (isDef(data)) { registerDeepBindings(data); }\n return vnode\n } else {\n return createEmptyVNode()\n }\n}\n\nfunction applyNS (vnode, ns, force) {\n vnode.ns = ns;\n if (vnode.tag === 'foreignObject') {\n // use default namespace inside foreignObject\n ns = undefined;\n force = true;\n }\n if (isDef(vnode.children)) {\n for (var i = 0, l = vnode.children.length; i < l; i++) {\n var child = vnode.children[i];\n if (isDef(child.tag) && (\n isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n applyNS(child, ns, force);\n }\n }\n }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n if (isObject(data.style)) {\n traverse(data.style);\n }\n if (isObject(data.class)) {\n traverse(data.class);\n }\n}\n\n/* */\n\nfunction initRender (vm) {\n vm._vnode = null; // the root of the child tree\n vm._staticTrees = null; // v-once cached trees\n var options = vm.$options;\n var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n var renderContext = parentVnode && parentVnode.context;\n vm.$slots = resolveSlots(options._renderChildren, renderContext);\n vm.$scopedSlots = emptyObject;\n // bind the createElement fn to this instance\n // so that we get proper render context inside it.\n // args order: tag, data, children, normalizationType, alwaysNormalize\n // internal version is used by render functions compiled from templates\n vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n // normalization is always applied for the public version, used in\n // user-written render functions.\n vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n // $attrs & $listeners are exposed for easier HOC creation.\n // they need to be reactive so that HOCs using them are always updated\n var parentData = parentVnode && parentVnode.data;\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n }, true);\n defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n }, true);\n } else {\n defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);\n defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true);\n }\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin (Vue) {\n // install runtime convenience helpers\n installRenderHelpers(Vue.prototype);\n\n Vue.prototype.$nextTick = function (fn) {\n return nextTick(fn, this)\n };\n\n Vue.prototype._render = function () {\n var vm = this;\n var ref = vm.$options;\n var render = ref.render;\n var _parentVnode = ref._parentVnode;\n\n if (_parentVnode) {\n vm.$scopedSlots = normalizeScopedSlots(\n _parentVnode.data.scopedSlots,\n vm.$slots,\n vm.$scopedSlots\n );\n }\n\n // set parent vnode. this allows render functions to have access\n // to the data on the placeholder node.\n vm.$vnode = _parentVnode;\n // render self\n var vnode;\n try {\n // There's no need to maintain a stack because all render fns are called\n // separately from one another. Nested component's render fns are called\n // when parent component is patched.\n currentRenderingInstance = vm;\n vnode = render.call(vm._renderProxy, vm.$createElement);\n } catch (e) {\n handleError(e, vm, \"render\");\n // return error render result,\n // or previous vnode to prevent render error causing blank component\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production' && vm.$options.renderError) {\n try {\n vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n } catch (e) {\n handleError(e, vm, \"renderError\");\n vnode = vm._vnode;\n }\n } else {\n vnode = vm._vnode;\n }\n } finally {\n currentRenderingInstance = null;\n }\n // if the returned array contains only a single node, allow it\n if (Array.isArray(vnode) && vnode.length === 1) {\n vnode = vnode[0];\n }\n // return empty vnode in case the render function errored out\n if (!(vnode instanceof VNode)) {\n if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {\n warn(\n 'Multiple root nodes returned from render function. Render function ' +\n 'should return a single root node.',\n vm\n );\n }\n vnode = createEmptyVNode();\n }\n // set parent\n vnode.parent = _parentVnode;\n return vnode\n };\n}\n\n/* */\n\nfunction ensureCtor (comp, base) {\n if (\n comp.__esModule ||\n (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n ) {\n comp = comp.default;\n }\n return isObject(comp)\n ? base.extend(comp)\n : comp\n}\n\nfunction createAsyncPlaceholder (\n factory,\n data,\n context,\n children,\n tag\n) {\n var node = createEmptyVNode();\n node.asyncFactory = factory;\n node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n return node\n}\n\nfunction resolveAsyncComponent (\n factory,\n baseCtor\n) {\n if (isTrue(factory.error) && isDef(factory.errorComp)) {\n return factory.errorComp\n }\n\n if (isDef(factory.resolved)) {\n return factory.resolved\n }\n\n var owner = currentRenderingInstance;\n if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n // already pending\n factory.owners.push(owner);\n }\n\n if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n return factory.loadingComp\n }\n\n if (owner && !isDef(factory.owners)) {\n var owners = factory.owners = [owner];\n var sync = true;\n var timerLoading = null;\n var timerTimeout = null\n\n ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });\n\n var forceRender = function (renderCompleted) {\n for (var i = 0, l = owners.length; i < l; i++) {\n (owners[i]).$forceUpdate();\n }\n\n if (renderCompleted) {\n owners.length = 0;\n if (timerLoading !== null) {\n clearTimeout(timerLoading);\n timerLoading = null;\n }\n if (timerTimeout !== null) {\n clearTimeout(timerTimeout);\n timerTimeout = null;\n }\n }\n };\n\n var resolve = once(function (res) {\n // cache resolved\n factory.resolved = ensureCtor(res, baseCtor);\n // invoke callbacks only if this is not a synchronous resolve\n // (async resolves are shimmed as synchronous during SSR)\n if (!sync) {\n forceRender(true);\n } else {\n owners.length = 0;\n }\n });\n\n var reject = once(function (reason) {\n process.env.NODE_ENV !== 'production' && warn(\n \"Failed to resolve async component: \" + (String(factory)) +\n (reason ? (\"\\nReason: \" + reason) : '')\n );\n if (isDef(factory.errorComp)) {\n factory.error = true;\n forceRender(true);\n }\n });\n\n var res = factory(resolve, reject);\n\n if (isObject(res)) {\n if (isPromise(res)) {\n // () => Promise\n if (isUndef(factory.resolved)) {\n res.then(resolve, reject);\n }\n } else if (isPromise(res.component)) {\n res.component.then(resolve, reject);\n\n if (isDef(res.error)) {\n factory.errorComp = ensureCtor(res.error, baseCtor);\n }\n\n if (isDef(res.loading)) {\n factory.loadingComp = ensureCtor(res.loading, baseCtor);\n if (res.delay === 0) {\n factory.loading = true;\n } else {\n timerLoading = setTimeout(function () {\n timerLoading = null;\n if (isUndef(factory.resolved) && isUndef(factory.error)) {\n factory.loading = true;\n forceRender(false);\n }\n }, res.delay || 200);\n }\n }\n\n if (isDef(res.timeout)) {\n timerTimeout = setTimeout(function () {\n timerTimeout = null;\n if (isUndef(factory.resolved)) {\n reject(\n process.env.NODE_ENV !== 'production'\n ? (\"timeout (\" + (res.timeout) + \"ms)\")\n : null\n );\n }\n }, res.timeout);\n }\n }\n }\n\n sync = false;\n // return in case resolved synchronously\n return factory.loading\n ? factory.loadingComp\n : factory.resolved\n }\n}\n\n/* */\n\nfunction isAsyncPlaceholder (node) {\n return node.isComment && node.asyncFactory\n}\n\n/* */\n\nfunction getFirstComponentChild (children) {\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n var c = children[i];\n if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n return c\n }\n }\n }\n}\n\n/* */\n\n/* */\n\nfunction initEvents (vm) {\n vm._events = Object.create(null);\n vm._hasHookEvent = false;\n // init parent attached events\n var listeners = vm.$options._parentListeners;\n if (listeners) {\n updateComponentListeners(vm, listeners);\n }\n}\n\nvar target;\n\nfunction add (event, fn) {\n target.$on(event, fn);\n}\n\nfunction remove$1 (event, fn) {\n target.$off(event, fn);\n}\n\nfunction createOnceHandler (event, fn) {\n var _target = target;\n return function onceHandler () {\n var res = fn.apply(null, arguments);\n if (res !== null) {\n _target.$off(event, onceHandler);\n }\n }\n}\n\nfunction updateComponentListeners (\n vm,\n listeners,\n oldListeners\n) {\n target = vm;\n updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n var hookRE = /^hook:/;\n Vue.prototype.$on = function (event, fn) {\n var vm = this;\n if (Array.isArray(event)) {\n for (var i = 0, l = event.length; i < l; i++) {\n vm.$on(event[i], fn);\n }\n } else {\n (vm._events[event] || (vm._events[event] = [])).push(fn);\n // optimize hook:event cost by using a boolean flag marked at registration\n // instead of a hash lookup\n if (hookRE.test(event)) {\n vm._hasHookEvent = true;\n }\n }\n return vm\n };\n\n Vue.prototype.$once = function (event, fn) {\n var vm = this;\n function on () {\n vm.$off(event, on);\n fn.apply(vm, arguments);\n }\n on.fn = fn;\n vm.$on(event, on);\n return vm\n };\n\n Vue.prototype.$off = function (event, fn) {\n var vm = this;\n // all\n if (!arguments.length) {\n vm._events = Object.create(null);\n return vm\n }\n // array of events\n if (Array.isArray(event)) {\n for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n vm.$off(event[i$1], fn);\n }\n return vm\n }\n // specific event\n var cbs = vm._events[event];\n if (!cbs) {\n return vm\n }\n if (!fn) {\n vm._events[event] = null;\n return vm\n }\n // specific handler\n var cb;\n var i = cbs.length;\n while (i--) {\n cb = cbs[i];\n if (cb === fn || cb.fn === fn) {\n cbs.splice(i, 1);\n break\n }\n }\n return vm\n };\n\n Vue.prototype.$emit = function (event) {\n var vm = this;\n if (process.env.NODE_ENV !== 'production') {\n var lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n tip(\n \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and you cannot use \" +\n \"v-on to listen to camelCase events when using in-DOM templates. \" +\n \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n );\n }\n }\n var cbs = vm._events[event];\n if (cbs) {\n cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n var args = toArray(arguments, 1);\n var info = \"event handler for \\\"\" + event + \"\\\"\";\n for (var i = 0, l = cbs.length; i < l; i++) {\n invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n }\n }\n return vm\n };\n}\n\n/* */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n var prevActiveInstance = activeInstance;\n activeInstance = vm;\n return function () {\n activeInstance = prevActiveInstance;\n }\n}\n\nfunction initLifecycle (vm) {\n var options = vm.$options;\n\n // locate first non-abstract parent\n var parent = options.parent;\n if (parent && !options.abstract) {\n while (parent.$options.abstract && parent.$parent) {\n parent = parent.$parent;\n }\n parent.$children.push(vm);\n }\n\n vm.$parent = parent;\n vm.$root = parent ? parent.$root : vm;\n\n vm.$children = [];\n vm.$refs = {};\n\n vm._watcher = null;\n vm._inactive = null;\n vm._directInactive = false;\n vm._isMounted = false;\n vm._isDestroyed = false;\n vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n Vue.prototype._update = function (vnode, hydrating) {\n var vm = this;\n var prevEl = vm.$el;\n var prevVnode = vm._vnode;\n var restoreActiveInstance = setActiveInstance(vm);\n vm._vnode = vnode;\n // Vue.prototype.__patch__ is injected in entry points\n // based on the rendering backend used.\n if (!prevVnode) {\n // initial render\n vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n } else {\n // updates\n vm.$el = vm.__patch__(prevVnode, vnode);\n }\n restoreActiveInstance();\n // update __vue__ reference\n if (prevEl) {\n prevEl.__vue__ = null;\n }\n if (vm.$el) {\n vm.$el.__vue__ = vm;\n }\n // if parent is an HOC, update its $el as well\n if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n vm.$parent.$el = vm.$el;\n }\n // updated hook is called by the scheduler to ensure that children are\n // updated in a parent's updated hook.\n };\n\n Vue.prototype.$forceUpdate = function () {\n var vm = this;\n if (vm._watcher) {\n vm._watcher.update();\n }\n };\n\n Vue.prototype.$destroy = function () {\n var vm = this;\n if (vm._isBeingDestroyed) {\n return\n }\n callHook(vm, 'beforeDestroy');\n vm._isBeingDestroyed = true;\n // remove self from parent\n var parent = vm.$parent;\n if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n remove(parent.$children, vm);\n }\n // teardown watchers\n if (vm._watcher) {\n vm._watcher.teardown();\n }\n var i = vm._watchers.length;\n while (i--) {\n vm._watchers[i].teardown();\n }\n // remove reference from data ob\n // frozen object may not have observer.\n if (vm._data.__ob__) {\n vm._data.__ob__.vmCount--;\n }\n // call the last hook...\n vm._isDestroyed = true;\n // invoke destroy hooks on current rendered tree\n vm.__patch__(vm._vnode, null);\n // fire destroyed hook\n callHook(vm, 'destroyed');\n // turn off all instance listeners.\n vm.$off();\n // remove __vue__ reference\n if (vm.$el) {\n vm.$el.__vue__ = null;\n }\n // release circular reference (#6759)\n if (vm.$vnode) {\n vm.$vnode.parent = null;\n }\n };\n}\n\nfunction updateChildComponent (\n vm,\n propsData,\n listeners,\n parentVnode,\n renderChildren\n) {\n if (process.env.NODE_ENV !== 'production') {\n isUpdatingChildComponent = true;\n }\n\n // determine whether component has slot children\n // we need to do this before overwriting $options._renderChildren.\n\n // check if there are dynamic scopedSlots (hand-written or compiled but with\n // dynamic slot names). Static scoped slots compiled from template has the\n // \"$stable\" marker.\n var newScopedSlots = parentVnode.data.scopedSlots;\n var oldScopedSlots = vm.$scopedSlots;\n var hasDynamicScopedSlot = !!(\n (newScopedSlots && !newScopedSlots.$stable) ||\n (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)\n );\n\n // Any static slot children from the parent may have changed during parent's\n // update. Dynamic scoped slots may also have changed. In such cases, a forced\n // update is necessary to ensure correctness.\n var needsForceUpdate = !!(\n renderChildren || // has new static slots\n vm.$options._renderChildren || // has old static slots\n hasDynamicScopedSlot\n );\n\n vm.$options._parentVnode = parentVnode;\n vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n if (vm._vnode) { // update child tree's parent\n vm._vnode.parent = parentVnode;\n }\n vm.$options._renderChildren = renderChildren;\n\n // update $attrs and $listeners hash\n // these are also reactive so they may trigger child update if the child\n // used them during render\n vm.$attrs = parentVnode.data.attrs || emptyObject;\n vm.$listeners = listeners || emptyObject;\n\n // update props\n if (propsData && vm.$options.props) {\n toggleObserving(false);\n var props = vm._props;\n var propKeys = vm.$options._propKeys || [];\n for (var i = 0; i < propKeys.length; i++) {\n var key = propKeys[i];\n var propOptions = vm.$options.props; // wtf flow?\n props[key] = validateProp(key, propOptions, propsData, vm);\n }\n toggleObserving(true);\n // keep a copy of raw propsData\n vm.$options.propsData = propsData;\n }\n \n // fixed by xxxxxx update properties(mp runtime)\n vm._$updateProperties && vm._$updateProperties(vm);\n \n // update listeners\n listeners = listeners || emptyObject;\n var oldListeners = vm.$options._parentListeners;\n vm.$options._parentListeners = listeners;\n updateComponentListeners(vm, listeners, oldListeners);\n\n // resolve slots + force update if has children\n if (needsForceUpdate) {\n vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n vm.$forceUpdate();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n isUpdatingChildComponent = false;\n }\n}\n\nfunction isInInactiveTree (vm) {\n while (vm && (vm = vm.$parent)) {\n if (vm._inactive) { return true }\n }\n return false\n}\n\nfunction activateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = false;\n if (isInInactiveTree(vm)) {\n return\n }\n } else if (vm._directInactive) {\n return\n }\n if (vm._inactive || vm._inactive === null) {\n vm._inactive = false;\n for (var i = 0; i < vm.$children.length; i++) {\n activateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'activated');\n }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n if (direct) {\n vm._directInactive = true;\n if (isInInactiveTree(vm)) {\n return\n }\n }\n if (!vm._inactive) {\n vm._inactive = true;\n for (var i = 0; i < vm.$children.length; i++) {\n deactivateChildComponent(vm.$children[i]);\n }\n callHook(vm, 'deactivated');\n }\n}\n\nfunction callHook (vm, hook) {\n // #7573 disable dep collection when invoking lifecycle hooks\n pushTarget();\n var handlers = vm.$options[hook];\n var info = hook + \" hook\";\n if (handlers) {\n for (var i = 0, j = handlers.length; i < j; i++) {\n invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n }\n }\n if (vm._hasHookEvent) {\n vm.$emit('hook:' + hook);\n }\n popTarget();\n}\n\n/* */\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n index = queue.length = activatedChildren.length = 0;\n has = {};\n if (process.env.NODE_ENV !== 'production') {\n circular = {};\n }\n waiting = flushing = false;\n}\n\n// Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\nvar currentFlushTimestamp = 0;\n\n// Async edge case fix requires storing an event listener's attach timestamp.\nvar getNow = Date.now;\n\n// Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\nif (inBrowser && !isIE) {\n var performance = window.performance;\n if (\n performance &&\n typeof performance.now === 'function' &&\n getNow() > document.createEvent('Event').timeStamp\n ) {\n // if the event timestamp, although evaluated AFTER the Date.now(), is\n // smaller than it, it means the event is using a hi-res timestamp,\n // and we need to use the hi-res version for event listener timestamps as\n // well.\n getNow = function () { return performance.now(); };\n }\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n currentFlushTimestamp = getNow();\n flushing = true;\n var watcher, id;\n\n // Sort queue before flush.\n // This ensures that:\n // 1. Components are updated from parent to child. (because parent is always\n // created before the child)\n // 2. A component's user watchers are run before its render watcher (because\n // user watchers are created before the render watcher)\n // 3. If a component is destroyed during a parent component's watcher run,\n // its watchers can be skipped.\n queue.sort(function (a, b) { return a.id - b.id; });\n\n // do not cache length because more watchers might be pushed\n // as we run existing watchers\n for (index = 0; index < queue.length; index++) {\n watcher = queue[index];\n if (watcher.before) {\n watcher.before();\n }\n id = watcher.id;\n has[id] = null;\n watcher.run();\n // in dev build, check and stop circular updates.\n if (process.env.NODE_ENV !== 'production' && has[id] != null) {\n circular[id] = (circular[id] || 0) + 1;\n if (circular[id] > MAX_UPDATE_COUNT) {\n warn(\n 'You may have an infinite update loop ' + (\n watcher.user\n ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n : \"in a component render function.\"\n ),\n watcher.vm\n );\n break\n }\n }\n }\n\n // keep copies of post queues before resetting state\n var activatedQueue = activatedChildren.slice();\n var updatedQueue = queue.slice();\n\n resetSchedulerState();\n\n // call component updated and activated hooks\n callActivatedHooks(activatedQueue);\n callUpdatedHooks(updatedQueue);\n\n // devtool hook\n /* istanbul ignore if */\n if (devtools && config.devtools) {\n devtools.emit('flush');\n }\n}\n\nfunction callUpdatedHooks (queue) {\n var i = queue.length;\n while (i--) {\n var watcher = queue[i];\n var vm = watcher.vm;\n if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'updated');\n }\n }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n // setting _inactive to false here so that a render function can\n // rely on checking whether it's in an inactive tree (e.g. router-view)\n vm._inactive = false;\n activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n for (var i = 0; i < queue.length; i++) {\n queue[i]._inactive = true;\n activateChildComponent(queue[i], true /* true */);\n }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n var id = watcher.id;\n if (has[id] == null) {\n has[id] = true;\n if (!flushing) {\n queue.push(watcher);\n } else {\n // if already flushing, splice the watcher based on its id\n // if already past its id, it will be run next immediately.\n var i = queue.length - 1;\n while (i > index && queue[i].id > watcher.id) {\n i--;\n }\n queue.splice(i + 1, 0, watcher);\n }\n // queue the flush\n if (!waiting) {\n waiting = true;\n\n if (process.env.NODE_ENV !== 'production' && !config.async) {\n flushSchedulerQueue();\n return\n }\n nextTick(flushSchedulerQueue);\n }\n }\n}\n\n/* */\n\n\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n vm,\n expOrFn,\n cb,\n options,\n isRenderWatcher\n) {\n this.vm = vm;\n if (isRenderWatcher) {\n vm._watcher = this;\n }\n vm._watchers.push(this);\n // options\n if (options) {\n this.deep = !!options.deep;\n this.user = !!options.user;\n this.lazy = !!options.lazy;\n this.sync = !!options.sync;\n this.before = options.before;\n } else {\n this.deep = this.user = this.lazy = this.sync = false;\n }\n this.cb = cb;\n this.id = ++uid$2; // uid for batching\n this.active = true;\n this.dirty = this.lazy; // for lazy watchers\n this.deps = [];\n this.newDeps = [];\n this.depIds = new _Set();\n this.newDepIds = new _Set();\n this.expression = process.env.NODE_ENV !== 'production'\n ? expOrFn.toString()\n : '';\n // parse expression for getter\n if (typeof expOrFn === 'function') {\n this.getter = expOrFn;\n } else {\n this.getter = parsePath(expOrFn);\n if (!this.getter) {\n this.getter = noop;\n process.env.NODE_ENV !== 'production' && warn(\n \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n 'Watcher only accepts simple dot-delimited paths. ' +\n 'For full control, use a function instead.',\n vm\n );\n }\n }\n this.value = this.lazy\n ? undefined\n : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n pushTarget(this);\n var value;\n var vm = this.vm;\n try {\n value = this.getter.call(vm, vm);\n } catch (e) {\n if (this.user) {\n handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n } else {\n throw e\n }\n } finally {\n // \"touch\" every property so they are all tracked as\n // dependencies for deep watching\n if (this.deep) {\n traverse(value);\n }\n popTarget();\n this.cleanupDeps();\n }\n return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n var id = dep.id;\n if (!this.newDepIds.has(id)) {\n this.newDepIds.add(id);\n this.newDeps.push(dep);\n if (!this.depIds.has(id)) {\n dep.addSub(this);\n }\n }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n var i = this.deps.length;\n while (i--) {\n var dep = this.deps[i];\n if (!this.newDepIds.has(dep.id)) {\n dep.removeSub(this);\n }\n }\n var tmp = this.depIds;\n this.depIds = this.newDepIds;\n this.newDepIds = tmp;\n this.newDepIds.clear();\n tmp = this.deps;\n this.deps = this.newDeps;\n this.newDeps = tmp;\n this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n /* istanbul ignore else */\n if (this.lazy) {\n this.dirty = true;\n } else if (this.sync) {\n this.run();\n } else {\n queueWatcher(this);\n }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n if (this.active) {\n var value = this.get();\n if (\n value !== this.value ||\n // Deep watchers and watchers on Object/Arrays should fire even\n // when the value is the same, because the value may\n // have mutated.\n isObject(value) ||\n this.deep\n ) {\n // set new value\n var oldValue = this.value;\n this.value = value;\n if (this.user) {\n try {\n this.cb.call(this.vm, value, oldValue);\n } catch (e) {\n handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n }\n } else {\n this.cb.call(this.vm, value, oldValue);\n }\n }\n }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n this.value = this.get();\n this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n var i = this.deps.length;\n while (i--) {\n this.deps[i].depend();\n }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n if (this.active) {\n // remove self from vm's watcher list\n // this is a somewhat expensive operation so we skip it\n // if the vm is being destroyed.\n if (!this.vm._isBeingDestroyed) {\n remove(this.vm._watchers, this);\n }\n var i = this.deps.length;\n while (i--) {\n this.deps[i].removeSub(this);\n }\n this.active = false;\n }\n};\n\n/* */\n\nvar sharedPropertyDefinition = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n sharedPropertyDefinition.get = function proxyGetter () {\n return this[sourceKey][key]\n };\n sharedPropertyDefinition.set = function proxySetter (val) {\n this[sourceKey][key] = val;\n };\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n vm._watchers = [];\n var opts = vm.$options;\n if (opts.props) { initProps(vm, opts.props); }\n if (opts.methods) { initMethods(vm, opts.methods); }\n if (opts.data) {\n initData(vm);\n } else {\n observe(vm._data = {}, true /* asRootData */);\n }\n if (opts.computed) { initComputed(vm, opts.computed); }\n if (opts.watch && opts.watch !== nativeWatch) {\n initWatch(vm, opts.watch);\n }\n}\n\nfunction initProps (vm, propsOptions) {\n var propsData = vm.$options.propsData || {};\n var props = vm._props = {};\n // cache prop keys so that future props updates can iterate using Array\n // instead of dynamic object key enumeration.\n var keys = vm.$options._propKeys = [];\n var isRoot = !vm.$parent;\n // root instance props should be converted\n if (!isRoot) {\n toggleObserving(false);\n }\n var loop = function ( key ) {\n keys.push(key);\n var value = validateProp(key, propsOptions, propsData, vm);\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n var hyphenatedKey = hyphenate(key);\n if (isReservedAttribute(hyphenatedKey) ||\n config.isReservedAttr(hyphenatedKey)) {\n warn(\n (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n vm\n );\n }\n defineReactive$$1(props, key, value, function () {\n if (!isRoot && !isUpdatingChildComponent) {\n {\n if(vm.mpHost === 'mp-baidu' || vm.mpHost === 'mp-kuaishou' || vm.mpHost === 'mp-xhs'){//百度、快手、小红书 observer 在 setData callback 之后触发,直接忽略该 warn\n return\n }\n //fixed by xxxxxx __next_tick_pending,uni://form-field 时不告警\n if(\n key === 'value' && \n Array.isArray(vm.$options.behaviors) &&\n vm.$options.behaviors.indexOf('uni://form-field') !== -1\n ){\n return\n }\n if(vm._getFormData){\n return\n }\n var $parent = vm.$parent;\n while($parent){\n if($parent.__next_tick_pending){\n return \n }\n $parent = $parent.$parent;\n }\n }\n warn(\n \"Avoid mutating a prop directly since the value will be \" +\n \"overwritten whenever the parent component re-renders. \" +\n \"Instead, use a data or computed property based on the prop's \" +\n \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n vm\n );\n }\n });\n } else {\n defineReactive$$1(props, key, value);\n }\n // static props are already proxied on the component's prototype\n // during Vue.extend(). We only need to proxy props defined at\n // instantiation here.\n if (!(key in vm)) {\n proxy(vm, \"_props\", key);\n }\n };\n\n for (var key in propsOptions) loop( key );\n toggleObserving(true);\n}\n\nfunction initData (vm) {\n var data = vm.$options.data;\n data = vm._data = typeof data === 'function'\n ? getData(data, vm)\n : data || {};\n if (!isPlainObject(data)) {\n data = {};\n process.env.NODE_ENV !== 'production' && warn(\n 'data functions should return an object:\\n' +\n 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n vm\n );\n }\n // proxy data on instance\n var keys = Object.keys(data);\n var props = vm.$options.props;\n var methods = vm.$options.methods;\n var i = keys.length;\n while (i--) {\n var key = keys[i];\n if (process.env.NODE_ENV !== 'production') {\n if (methods && hasOwn(methods, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n vm\n );\n }\n }\n if (props && hasOwn(props, key)) {\n process.env.NODE_ENV !== 'production' && warn(\n \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n \"Use prop default value instead.\",\n vm\n );\n } else if (!isReserved(key)) {\n proxy(vm, \"_data\", key);\n }\n }\n // observe data\n observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n // #7573 disable dep collection when invoking data getters\n pushTarget();\n try {\n return data.call(vm, vm)\n } catch (e) {\n handleError(e, vm, \"data()\");\n return {}\n } finally {\n popTarget();\n }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n // $flow-disable-line\n var watchers = vm._computedWatchers = Object.create(null);\n // computed properties are just getters during SSR\n var isSSR = isServerRendering();\n\n for (var key in computed) {\n var userDef = computed[key];\n var getter = typeof userDef === 'function' ? userDef : userDef.get;\n if (process.env.NODE_ENV !== 'production' && getter == null) {\n warn(\n (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n vm\n );\n }\n\n if (!isSSR) {\n // create internal watcher for the computed property.\n watchers[key] = new Watcher(\n vm,\n getter || noop,\n noop,\n computedWatcherOptions\n );\n }\n\n // component-defined computed properties are already defined on the\n // component prototype. We only need to define computed properties defined\n // at instantiation here.\n if (!(key in vm)) {\n defineComputed(vm, key, userDef);\n } else if (process.env.NODE_ENV !== 'production') {\n if (key in vm.$data) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n } else if (vm.$options.props && key in vm.$options.props) {\n warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n }\n }\n }\n}\n\nfunction defineComputed (\n target,\n key,\n userDef\n) {\n var shouldCache = !isServerRendering();\n if (typeof userDef === 'function') {\n sharedPropertyDefinition.get = shouldCache\n ? createComputedGetter(key)\n : createGetterInvoker(userDef);\n sharedPropertyDefinition.set = noop;\n } else {\n sharedPropertyDefinition.get = userDef.get\n ? shouldCache && userDef.cache !== false\n ? createComputedGetter(key)\n : createGetterInvoker(userDef.get)\n : noop;\n sharedPropertyDefinition.set = userDef.set || noop;\n }\n if (process.env.NODE_ENV !== 'production' &&\n sharedPropertyDefinition.set === noop) {\n sharedPropertyDefinition.set = function () {\n warn(\n (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n this\n );\n };\n }\n Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n return function computedGetter () {\n var watcher = this._computedWatchers && this._computedWatchers[key];\n if (watcher) {\n if (watcher.dirty) {\n watcher.evaluate();\n }\n if (Dep.SharedObject.target) {// fixed by xxxxxx\n watcher.depend();\n }\n return watcher.value\n }\n }\n}\n\nfunction createGetterInvoker(fn) {\n return function computedGetter () {\n return fn.call(this, this)\n }\n}\n\nfunction initMethods (vm, methods) {\n var props = vm.$options.props;\n for (var key in methods) {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof methods[key] !== 'function') {\n warn(\n \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n \"Did you reference the function correctly?\",\n vm\n );\n }\n if (props && hasOwn(props, key)) {\n warn(\n (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n vm\n );\n }\n if ((key in vm) && isReserved(key)) {\n warn(\n \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n \"Avoid defining component methods that start with _ or $.\"\n );\n }\n }\n vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n }\n}\n\nfunction initWatch (vm, watch) {\n for (var key in watch) {\n var handler = watch[key];\n if (Array.isArray(handler)) {\n for (var i = 0; i < handler.length; i++) {\n createWatcher(vm, key, handler[i]);\n }\n } else {\n createWatcher(vm, key, handler);\n }\n }\n}\n\nfunction createWatcher (\n vm,\n expOrFn,\n handler,\n options\n) {\n if (isPlainObject(handler)) {\n options = handler;\n handler = handler.handler;\n }\n if (typeof handler === 'string') {\n handler = vm[handler];\n }\n return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n // flow somehow has problems with directly declared definition object\n // when using Object.defineProperty, so we have to procedurally build up\n // the object here.\n var dataDef = {};\n dataDef.get = function () { return this._data };\n var propsDef = {};\n propsDef.get = function () { return this._props };\n if (process.env.NODE_ENV !== 'production') {\n dataDef.set = function () {\n warn(\n 'Avoid replacing instance root $data. ' +\n 'Use nested data properties instead.',\n this\n );\n };\n propsDef.set = function () {\n warn(\"$props is readonly.\", this);\n };\n }\n Object.defineProperty(Vue.prototype, '$data', dataDef);\n Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n Vue.prototype.$set = set;\n Vue.prototype.$delete = del;\n\n Vue.prototype.$watch = function (\n expOrFn,\n cb,\n options\n ) {\n var vm = this;\n if (isPlainObject(cb)) {\n return createWatcher(vm, expOrFn, cb, options)\n }\n options = options || {};\n options.user = true;\n var watcher = new Watcher(vm, expOrFn, cb, options);\n if (options.immediate) {\n try {\n cb.call(vm, watcher.value);\n } catch (error) {\n handleError(error, vm, (\"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\"));\n }\n }\n return function unwatchFn () {\n watcher.teardown();\n }\n };\n}\n\n/* */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n Vue.prototype._init = function (options) {\n var vm = this;\n // a uid\n vm._uid = uid$3++;\n\n var startTag, endTag;\n /* istanbul ignore if */\n if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n startTag = \"vue-perf-start:\" + (vm._uid);\n endTag = \"vue-perf-end:\" + (vm._uid);\n mark(startTag);\n }\n\n // a flag to avoid this being observed\n vm._isVue = true;\n // merge options\n if (options && options._isComponent) {\n // optimize internal component instantiation\n // since dynamic options merging is pretty slow, and none of the\n // internal component options needs special treatment.\n initInternalComponent(vm, options);\n } else {\n vm.$options = mergeOptions(\n resolveConstructorOptions(vm.constructor),\n options || {},\n vm\n );\n }\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n initProxy(vm);\n } else {\n vm._renderProxy = vm;\n }\n // expose real self\n vm._self = vm;\n initLifecycle(vm);\n initEvents(vm);\n initRender(vm);\n callHook(vm, 'beforeCreate');\n !vm._$fallback && initInjections(vm); // resolve injections before data/props \n initState(vm);\n !vm._$fallback && initProvide(vm); // resolve provide after data/props\n !vm._$fallback && callHook(vm, 'created'); \n\n /* istanbul ignore if */\n if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n vm._name = formatComponentName(vm, false);\n mark(endTag);\n measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n }\n\n if (vm.$options.el) {\n vm.$mount(vm.$options.el);\n }\n };\n}\n\nfunction initInternalComponent (vm, options) {\n var opts = vm.$options = Object.create(vm.constructor.options);\n // doing this because it's faster than dynamic enumeration.\n var parentVnode = options._parentVnode;\n opts.parent = options.parent;\n opts._parentVnode = parentVnode;\n\n var vnodeComponentOptions = parentVnode.componentOptions;\n opts.propsData = vnodeComponentOptions.propsData;\n opts._parentListeners = vnodeComponentOptions.listeners;\n opts._renderChildren = vnodeComponentOptions.children;\n opts._componentTag = vnodeComponentOptions.tag;\n\n if (options.render) {\n opts.render = options.render;\n opts.staticRenderFns = options.staticRenderFns;\n }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n var options = Ctor.options;\n if (Ctor.super) {\n var superOptions = resolveConstructorOptions(Ctor.super);\n var cachedSuperOptions = Ctor.superOptions;\n if (superOptions !== cachedSuperOptions) {\n // super option changed,\n // need to resolve new options.\n Ctor.superOptions = superOptions;\n // check if there are any late-modified/attached options (#4976)\n var modifiedOptions = resolveModifiedOptions(Ctor);\n // update base extend options\n if (modifiedOptions) {\n extend(Ctor.extendOptions, modifiedOptions);\n }\n options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n if (options.name) {\n options.components[options.name] = Ctor;\n }\n }\n }\n return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n var modified;\n var latest = Ctor.options;\n var sealed = Ctor.sealedOptions;\n for (var key in latest) {\n if (latest[key] !== sealed[key]) {\n if (!modified) { modified = {}; }\n modified[key] = latest[key];\n }\n }\n return modified\n}\n\nfunction Vue (options) {\n if (process.env.NODE_ENV !== 'production' &&\n !(this instanceof Vue)\n ) {\n warn('Vue is a constructor and should be called with the `new` keyword');\n }\n this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/* */\n\nfunction initUse (Vue) {\n Vue.use = function (plugin) {\n var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n if (installedPlugins.indexOf(plugin) > -1) {\n return this\n }\n\n // additional parameters\n var args = toArray(arguments, 1);\n args.unshift(this);\n if (typeof plugin.install === 'function') {\n plugin.install.apply(plugin, args);\n } else if (typeof plugin === 'function') {\n plugin.apply(null, args);\n }\n installedPlugins.push(plugin);\n return this\n };\n}\n\n/* */\n\nfunction initMixin$1 (Vue) {\n Vue.mixin = function (mixin) {\n this.options = mergeOptions(this.options, mixin);\n return this\n };\n}\n\n/* */\n\nfunction initExtend (Vue) {\n /**\n * Each instance constructor, including Vue, has a unique\n * cid. This enables us to create wrapped \"child\n * constructors\" for prototypal inheritance and cache them.\n */\n Vue.cid = 0;\n var cid = 1;\n\n /**\n * Class inheritance\n */\n Vue.extend = function (extendOptions) {\n extendOptions = extendOptions || {};\n var Super = this;\n var SuperId = Super.cid;\n var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n if (cachedCtors[SuperId]) {\n return cachedCtors[SuperId]\n }\n\n var name = extendOptions.name || Super.options.name;\n if (process.env.NODE_ENV !== 'production' && name) {\n validateComponentName(name);\n }\n\n var Sub = function VueComponent (options) {\n this._init(options);\n };\n Sub.prototype = Object.create(Super.prototype);\n Sub.prototype.constructor = Sub;\n Sub.cid = cid++;\n Sub.options = mergeOptions(\n Super.options,\n extendOptions\n );\n Sub['super'] = Super;\n\n // For props and computed properties, we define the proxy getters on\n // the Vue instances at extension time, on the extended prototype. This\n // avoids Object.defineProperty calls for each instance created.\n if (Sub.options.props) {\n initProps$1(Sub);\n }\n if (Sub.options.computed) {\n initComputed$1(Sub);\n }\n\n // allow further extension/mixin/plugin usage\n Sub.extend = Super.extend;\n Sub.mixin = Super.mixin;\n Sub.use = Super.use;\n\n // create asset registers, so extended classes\n // can have their private assets too.\n ASSET_TYPES.forEach(function (type) {\n Sub[type] = Super[type];\n });\n // enable recursive self-lookup\n if (name) {\n Sub.options.components[name] = Sub;\n }\n\n // keep a reference to the super options at extension time.\n // later at instantiation we can check if Super's options have\n // been updated.\n Sub.superOptions = Super.options;\n Sub.extendOptions = extendOptions;\n Sub.sealedOptions = extend({}, Sub.options);\n\n // cache constructor\n cachedCtors[SuperId] = Sub;\n return Sub\n };\n}\n\nfunction initProps$1 (Comp) {\n var props = Comp.options.props;\n for (var key in props) {\n proxy(Comp.prototype, \"_props\", key);\n }\n}\n\nfunction initComputed$1 (Comp) {\n var computed = Comp.options.computed;\n for (var key in computed) {\n defineComputed(Comp.prototype, key, computed[key]);\n }\n}\n\n/* */\n\nfunction initAssetRegisters (Vue) {\n /**\n * Create asset registration methods.\n */\n ASSET_TYPES.forEach(function (type) {\n Vue[type] = function (\n id,\n definition\n ) {\n if (!definition) {\n return this.options[type + 's'][id]\n } else {\n /* istanbul ignore if */\n if (process.env.NODE_ENV !== 'production' && type === 'component') {\n validateComponentName(id);\n }\n if (type === 'component' && isPlainObject(definition)) {\n definition.name = definition.name || id;\n definition = this.options._base.extend(definition);\n }\n if (type === 'directive' && typeof definition === 'function') {\n definition = { bind: definition, update: definition };\n }\n this.options[type + 's'][id] = definition;\n return definition\n }\n };\n });\n}\n\n/* */\n\n\n\nfunction getComponentName (opts) {\n return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n if (Array.isArray(pattern)) {\n return pattern.indexOf(name) > -1\n } else if (typeof pattern === 'string') {\n return pattern.split(',').indexOf(name) > -1\n } else if (isRegExp(pattern)) {\n return pattern.test(name)\n }\n /* istanbul ignore next */\n return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n var cache = keepAliveInstance.cache;\n var keys = keepAliveInstance.keys;\n var _vnode = keepAliveInstance._vnode;\n for (var key in cache) {\n var cachedNode = cache[key];\n if (cachedNode) {\n var name = getComponentName(cachedNode.componentOptions);\n if (name && !filter(name)) {\n pruneCacheEntry(cache, key, keys, _vnode);\n }\n }\n }\n}\n\nfunction pruneCacheEntry (\n cache,\n key,\n keys,\n current\n) {\n var cached$$1 = cache[key];\n if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n cached$$1.componentInstance.$destroy();\n }\n cache[key] = null;\n remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n name: 'keep-alive',\n abstract: true,\n\n props: {\n include: patternTypes,\n exclude: patternTypes,\n max: [String, Number]\n },\n\n created: function created () {\n this.cache = Object.create(null);\n this.keys = [];\n },\n\n destroyed: function destroyed () {\n for (var key in this.cache) {\n pruneCacheEntry(this.cache, key, this.keys);\n }\n },\n\n mounted: function mounted () {\n var this$1 = this;\n\n this.$watch('include', function (val) {\n pruneCache(this$1, function (name) { return matches(val, name); });\n });\n this.$watch('exclude', function (val) {\n pruneCache(this$1, function (name) { return !matches(val, name); });\n });\n },\n\n render: function render () {\n var slot = this.$slots.default;\n var vnode = getFirstComponentChild(slot);\n var componentOptions = vnode && vnode.componentOptions;\n if (componentOptions) {\n // check pattern\n var name = getComponentName(componentOptions);\n var ref = this;\n var include = ref.include;\n var exclude = ref.exclude;\n if (\n // not included\n (include && (!name || !matches(include, name))) ||\n // excluded\n (exclude && name && matches(exclude, name))\n ) {\n return vnode\n }\n\n var ref$1 = this;\n var cache = ref$1.cache;\n var keys = ref$1.keys;\n var key = vnode.key == null\n // same constructor may get registered as different local components\n // so cid alone is not enough (#3269)\n ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n : vnode.key;\n if (cache[key]) {\n vnode.componentInstance = cache[key].componentInstance;\n // make current key freshest\n remove(keys, key);\n keys.push(key);\n } else {\n cache[key] = vnode;\n keys.push(key);\n // prune oldest entry\n if (this.max && keys.length > parseInt(this.max)) {\n pruneCacheEntry(cache, keys[0], keys, this._vnode);\n }\n }\n\n vnode.data.keepAlive = true;\n }\n return vnode || (slot && slot[0])\n }\n};\n\nvar builtInComponents = {\n KeepAlive: KeepAlive\n};\n\n/* */\n\nfunction initGlobalAPI (Vue) {\n // config\n var configDef = {};\n configDef.get = function () { return config; };\n if (process.env.NODE_ENV !== 'production') {\n configDef.set = function () {\n warn(\n 'Do not replace the Vue.config object, set individual fields instead.'\n );\n };\n }\n Object.defineProperty(Vue, 'config', configDef);\n\n // exposed util methods.\n // NOTE: these are not considered part of the public API - avoid relying on\n // them unless you are aware of the risk.\n Vue.util = {\n warn: warn,\n extend: extend,\n mergeOptions: mergeOptions,\n defineReactive: defineReactive$$1\n };\n\n Vue.set = set;\n Vue.delete = del;\n Vue.nextTick = nextTick;\n\n // 2.6 explicit observable API\n Vue.observable = function (obj) {\n observe(obj);\n return obj\n };\n\n Vue.options = Object.create(null);\n ASSET_TYPES.forEach(function (type) {\n Vue.options[type + 's'] = Object.create(null);\n });\n\n // this is used to identify the \"base\" constructor to extend all plain-object\n // components with in Weex's multi-instance scenarios.\n Vue.options._base = Vue;\n\n extend(Vue.options.components, builtInComponents);\n\n initUse(Vue);\n initMixin$1(Vue);\n initExtend(Vue);\n initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n get: function get () {\n /* istanbul ignore next */\n return this.$vnode && this.$vnode.ssrContext\n }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n value: FunctionalRenderContext\n});\n\nVue.version = '2.6.11';\n\n/**\n * https://raw.githubusercontent.com/Tencent/westore/master/packages/westore/utils/diff.js\n */\nvar ARRAYTYPE = '[object Array]';\nvar OBJECTTYPE = '[object Object]';\nvar NULLTYPE = '[object Null]';\nvar UNDEFINEDTYPE = '[object Undefined]';\n// const FUNCTIONTYPE = '[object Function]'\n\nfunction diff(current, pre) {\n var result = {};\n syncKeys(current, pre);\n _diff(current, pre, '', result);\n return result\n}\n\nfunction syncKeys(current, pre) {\n if (current === pre) { return }\n var rootCurrentType = type(current);\n var rootPreType = type(pre);\n if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {\n if(Object.keys(current).length >= Object.keys(pre).length){\n for (var key in pre) {\n var currentValue = current[key];\n if (currentValue === undefined) {\n current[key] = null;\n } else {\n syncKeys(currentValue, pre[key]);\n }\n }\n }\n } else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {\n if (current.length >= pre.length) {\n pre.forEach(function (item, index) {\n syncKeys(current[index], item);\n });\n }\n }\n}\n\nfunction nullOrUndefined(currentType, preType) {\n if(\n (currentType === NULLTYPE || currentType === UNDEFINEDTYPE) && \n (preType === NULLTYPE || preType === UNDEFINEDTYPE)\n ) {\n return false\n }\n return true\n}\n\nfunction _diff(current, pre, path, result) {\n if (current === pre) { return }\n var rootCurrentType = type(current);\n var rootPreType = type(pre);\n if (rootCurrentType == OBJECTTYPE) {\n if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {\n setResult(result, path, current);\n } else {\n var loop = function ( key ) {\n var currentValue = current[key];\n var preValue = pre[key];\n var currentType = type(currentValue);\n var preType = type(preValue);\n if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {\n if (currentValue !== pre[key] && nullOrUndefined(currentType, preType)) {\n setResult(result, (path == '' ? '' : path + \".\") + key, currentValue);\n }\n } else if (currentType == ARRAYTYPE) {\n if (preType != ARRAYTYPE) {\n setResult(result, (path == '' ? '' : path + \".\") + key, currentValue);\n } else {\n if (currentValue.length < preValue.length) {\n setResult(result, (path == '' ? '' : path + \".\") + key, currentValue);\n } else {\n currentValue.forEach(function (item, index) {\n _diff(item, preValue[index], (path == '' ? '' : path + \".\") + key + '[' + index + ']', result);\n });\n }\n }\n } else if (currentType == OBJECTTYPE) {\n if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {\n setResult(result, (path == '' ? '' : path + \".\") + key, currentValue);\n } else {\n for (var subKey in currentValue) {\n _diff(currentValue[subKey], preValue[subKey], (path == '' ? '' : path + \".\") + key + '.' + subKey, result);\n }\n }\n }\n };\n\n for (var key in current) loop( key );\n }\n } else if (rootCurrentType == ARRAYTYPE) {\n if (rootPreType != ARRAYTYPE) {\n setResult(result, path, current);\n } else {\n if (current.length < pre.length) {\n setResult(result, path, current);\n } else {\n current.forEach(function (item, index) {\n _diff(item, pre[index], path + '[' + index + ']', result);\n });\n }\n }\n } else {\n setResult(result, path, current);\n }\n}\n\nfunction setResult(result, k, v) {\n // if (type(v) != FUNCTIONTYPE) {\n result[k] = v;\n // }\n}\n\nfunction type(obj) {\n return Object.prototype.toString.call(obj)\n}\n\n/* */\r\n\r\nfunction flushCallbacks$1(vm) {\r\n if (vm.__next_tick_callbacks && vm.__next_tick_callbacks.length) {\r\n if (process.env.VUE_APP_DEBUG) {\r\n var mpInstance = vm.$scope;\r\n console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +\r\n ']:flushCallbacks[' + vm.__next_tick_callbacks.length + ']');\r\n }\r\n var copies = vm.__next_tick_callbacks.slice(0);\r\n vm.__next_tick_callbacks.length = 0;\r\n for (var i = 0; i < copies.length; i++) {\r\n copies[i]();\r\n }\r\n }\r\n}\r\n\r\nfunction hasRenderWatcher(vm) {\r\n return queue.find(function (watcher) { return vm._watcher === watcher; })\r\n}\r\n\r\nfunction nextTick$1(vm, cb) {\r\n //1.nextTick 之前 已 setData 且 setData 还未回调完成\r\n //2.nextTick 之前存在 render watcher\r\n if (!vm.__next_tick_pending && !hasRenderWatcher(vm)) {\n if(process.env.VUE_APP_DEBUG){\n var mpInstance = vm.$scope;\n console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +\n ']:nextVueTick');\n }\r\n return nextTick(cb, vm)\r\n }else{\n if(process.env.VUE_APP_DEBUG){\n var mpInstance$1 = vm.$scope;\n console.log('[' + (+new Date) + '][' + (mpInstance$1.is || mpInstance$1.route) + '][' + vm._uid +\n ']:nextMPTick');\n }\n }\r\n var _resolve;\r\n if (!vm.__next_tick_callbacks) {\r\n vm.__next_tick_callbacks = [];\r\n }\r\n vm.__next_tick_callbacks.push(function () {\r\n if (cb) {\r\n try {\r\n cb.call(vm);\r\n } catch (e) {\r\n handleError(e, vm, 'nextTick');\r\n }\r\n } else if (_resolve) {\r\n _resolve(vm);\r\n }\r\n });\r\n // $flow-disable-line\r\n if (!cb && typeof Promise !== 'undefined') {\r\n return new Promise(function (resolve) {\r\n _resolve = resolve;\r\n })\r\n }\r\n}\n\n/* */\r\n\r\nfunction clearInstance(key, value) {\r\n // 简易去除 Vue 和小程序组件实例\r\n if (value) {\r\n if (value._isVue || value.__v_isMPComponent) {\r\n return {}\r\n }\r\n }\r\n return value\r\n}\r\n\r\nfunction cloneWithData(vm) {\r\n // 确保当前 vm 所有数据被同步\r\n var ret = Object.create(null);\r\n var dataKeys = [].concat(\r\n Object.keys(vm._data || {}),\r\n Object.keys(vm._computedWatchers || {}));\r\n\r\n dataKeys.reduce(function(ret, key) {\r\n ret[key] = vm[key];\r\n return ret\r\n }, ret);\r\n\r\n // vue-composition-api\r\n var compositionApiState = vm.__composition_api_state__ || vm.__secret_vfa_state__;\r\n var rawBindings = compositionApiState && compositionApiState.rawBindings;\r\n if (rawBindings) {\r\n Object.keys(rawBindings).forEach(function (key) {\r\n ret[key] = vm[key];\r\n });\r\n }\r\n\r\n //TODO 需要把无用数据处理掉,比如 list=>l0 则 list 需要移除,否则多传输一份数据\r\n Object.assign(ret, vm.$mp.data || {});\r\n if (\r\n Array.isArray(vm.$options.behaviors) &&\r\n vm.$options.behaviors.indexOf('uni://form-field') !== -1\r\n ) { //form-field\r\n ret['name'] = vm.name;\r\n ret['value'] = vm.value;\r\n }\r\n\r\n return JSON.parse(JSON.stringify(ret, clearInstance))\r\n}\r\n\r\nvar patch = function(oldVnode, vnode) {\n var this$1 = this;\n\r\n if (vnode === null) { //destroy\r\n return\r\n }\r\n if (this.mpType === 'page' || this.mpType === 'component') {\r\n var mpInstance = this.$scope;\r\n var data = Object.create(null);\r\n try {\r\n data = cloneWithData(this);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n data.__webviewId__ = mpInstance.data.__webviewId__;\r\n var mpData = Object.create(null);\r\n Object.keys(data).forEach(function (key) { //仅同步 data 中有的数据\r\n mpData[key] = mpInstance.data[key];\r\n });\r\n var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);\r\n if (Object.keys(diffData).length) {\r\n if (process.env.VUE_APP_DEBUG) {\r\n console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + this._uid +\r\n ']差量更新',\r\n JSON.stringify(diffData));\r\n }\r\n this.__next_tick_pending = true;\r\n mpInstance.setData(diffData, function () {\r\n this$1.__next_tick_pending = false;\r\n flushCallbacks$1(this$1);\r\n });\r\n } else {\r\n flushCallbacks$1(this);\r\n }\r\n }\r\n};\n\n/* */\n\nfunction createEmptyRender() {\n\n}\n\nfunction mountComponent$1(\n vm,\n el,\n hydrating\n) {\n if (!vm.mpType) {//main.js 中的 new Vue\n return vm\n }\n if (vm.mpType === 'app') {\n vm.$options.render = createEmptyRender;\n }\n if (!vm.$options.render) {\n vm.$options.render = createEmptyRender;\n if (process.env.NODE_ENV !== 'production') {\n /* istanbul ignore if */\n if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n vm.$options.el || el) {\n warn(\n 'You are using the runtime-only build of Vue where the template ' +\n 'compiler is not available. Either pre-compile the templates into ' +\n 'render functions, or use the compiler-included build.',\n vm\n );\n } else {\n warn(\n 'Failed to mount component: template or render function not defined.',\n vm\n );\n }\n }\n }\n \n !vm._$fallback && callHook(vm, 'beforeMount');\n\n var updateComponent = function () {\n vm._update(vm._render(), hydrating);\n };\n\n // we set this to vm._watcher inside the watcher's constructor\n // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n // component's mounted hook), which relies on vm._watcher being already defined\n new Watcher(vm, updateComponent, noop, {\n before: function before() {\n if (vm._isMounted && !vm._isDestroyed) {\n callHook(vm, 'beforeUpdate');\n }\n }\n }, true /* isRenderWatcher */);\n hydrating = false;\n return vm\n}\n\n/* */\n\nfunction renderClass (\n staticClass,\n dynamicClass\n) {\n if (isDef(staticClass) || isDef(dynamicClass)) {\n return concat(staticClass, stringifyClass(dynamicClass))\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction concat (a, b) {\n return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n if (Array.isArray(value)) {\n return stringifyArray(value)\n }\n if (isObject(value)) {\n return stringifyObject(value)\n }\n if (typeof value === 'string') {\n return value\n }\n /* istanbul ignore next */\n return ''\n}\n\nfunction stringifyArray (value) {\n var res = '';\n var stringified;\n for (var i = 0, l = value.length; i < l; i++) {\n if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n if (res) { res += ' '; }\n res += stringified;\n }\n }\n return res\n}\n\nfunction stringifyObject (value) {\n var res = '';\n for (var key in value) {\n if (value[key]) {\n if (res) { res += ' '; }\n res += key;\n }\n }\n return res\n}\n\n/* */\n\nvar parseStyleText = cached(function (cssText) {\n var res = {};\n var listDelimiter = /;(?![^(]*\\))/g;\n var propertyDelimiter = /:(.+)/;\n cssText.split(listDelimiter).forEach(function (item) {\n if (item) {\n var tmp = item.split(propertyDelimiter);\n tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return res\n});\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n if (Array.isArray(bindingStyle)) {\n return toObject(bindingStyle)\n }\n if (typeof bindingStyle === 'string') {\n return parseStyleText(bindingStyle)\n }\n return bindingStyle\n}\n\n/* */\r\n\r\nvar MP_METHODS = ['createSelectorQuery', 'createIntersectionObserver', 'selectAllComponents', 'selectComponent'];\r\n\r\nfunction getTarget(obj, path) {\r\n var parts = path.split('.');\r\n var key = parts[0];\r\n if (key.indexOf('__$n') === 0) { //number index\r\n key = parseInt(key.replace('__$n', ''));\r\n }\r\n if (parts.length === 1) {\r\n return obj[key]\r\n }\r\n return getTarget(obj[key], parts.slice(1).join('.'))\r\n}\r\n\r\nfunction internalMixin(Vue) {\r\n\r\n Vue.config.errorHandler = function(err, vm, info) {\r\n Vue.util.warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\r\n console.error(err);\r\n /* eslint-disable no-undef */\r\n var app = typeof getApp === 'function' && getApp();\r\n if (app && app.onError) {\r\n app.onError(err);\r\n }\r\n };\r\n\r\n var oldEmit = Vue.prototype.$emit;\r\n\r\n Vue.prototype.$emit = function(event) {\r\n if (this.$scope && event) {\r\n var triggerEvent = this.$scope['_triggerEvent'] || this.$scope['triggerEvent'];\r\n if (triggerEvent) {\r\n try {\r\n triggerEvent.call(this.$scope, event, {\r\n __args__: toArray(arguments, 1)\r\n });\r\n } catch (error) {\r\n\r\n }\r\n }\r\n }\r\n return oldEmit.apply(this, arguments)\r\n };\r\n\r\n Vue.prototype.$nextTick = function(fn) {\r\n return nextTick$1(this, fn)\r\n };\r\n\r\n MP_METHODS.forEach(function (method) {\r\n Vue.prototype[method] = function(args) {\r\n if (this.$scope && this.$scope[method]) {\r\n return this.$scope[method](args)\r\n }\r\n // mp-alipay\r\n if (typeof my === 'undefined') {\r\n return\r\n }\r\n if (method === 'createSelectorQuery') {\r\n /* eslint-disable no-undef */\r\n return my.createSelectorQuery(args)\r\n } else if (method === 'createIntersectionObserver') {\r\n /* eslint-disable no-undef */\r\n return my.createIntersectionObserver(args)\r\n }\r\n // TODO mp-alipay 暂不支持 selectAllComponents,selectComponent\r\n };\r\n });\r\n\r\n Vue.prototype.__init_provide = initProvide;\r\n\r\n Vue.prototype.__init_injections = initInjections;\r\n\r\n Vue.prototype.__call_hook = function(hook, args) {\r\n var vm = this;\r\n // #7573 disable dep collection when invoking lifecycle hooks\r\n pushTarget();\r\n var handlers = vm.$options[hook];\r\n var info = hook + \" hook\";\r\n var ret;\r\n if (handlers) {\r\n for (var i = 0, j = handlers.length; i < j; i++) {\r\n ret = invokeWithErrorHandling(handlers[i], vm, args ? [args] : null, vm, info);\r\n }\r\n }\r\n if (vm._hasHookEvent) {\r\n vm.$emit('hook:' + hook, args);\r\n }\r\n popTarget();\r\n return ret\r\n };\r\n\r\n Vue.prototype.__set_model = function(target, key, value, modifiers) {\r\n if (Array.isArray(modifiers)) {\r\n if (modifiers.indexOf('trim') !== -1) {\r\n value = value.trim();\r\n }\r\n if (modifiers.indexOf('number') !== -1) {\r\n value = this._n(value);\r\n }\r\n }\r\n if (!target) {\r\n target = this;\r\n }\r\n // 解决动态属性添加\r\n Vue.set(target, key, value);\r\n };\r\n\r\n Vue.prototype.__set_sync = function(target, key, value) {\r\n if (!target) {\r\n target = this;\r\n }\r\n // 解决动态属性添加\r\n Vue.set(target, key, value);\r\n };\r\n\r\n Vue.prototype.__get_orig = function(item) {\r\n if (isPlainObject(item)) {\r\n return item['$orig'] || item\r\n }\r\n return item\r\n };\r\n\r\n Vue.prototype.__get_value = function(dataPath, target) {\r\n return getTarget(target || this, dataPath)\r\n };\r\n\r\n\r\n Vue.prototype.__get_class = function(dynamicClass, staticClass) {\r\n return renderClass(staticClass, dynamicClass)\r\n };\r\n\r\n Vue.prototype.__get_style = function(dynamicStyle, staticStyle) {\r\n if (!dynamicStyle && !staticStyle) {\r\n return ''\r\n }\r\n var dynamicStyleObj = normalizeStyleBinding(dynamicStyle);\r\n var styleObj = staticStyle ? extend(staticStyle, dynamicStyleObj) : dynamicStyleObj;\r\n return Object.keys(styleObj).map(function (name) { return ((hyphenate(name)) + \":\" + (styleObj[name])); }).join(';')\r\n };\r\n\r\n Vue.prototype.__map = function(val, iteratee) {\r\n //TODO 暂不考虑 string\r\n var ret, i, l, keys, key;\r\n if (Array.isArray(val)) {\r\n ret = new Array(val.length);\r\n for (i = 0, l = val.length; i < l; i++) {\r\n ret[i] = iteratee(val[i], i);\r\n }\r\n return ret\r\n } else if (isObject(val)) {\r\n keys = Object.keys(val);\r\n ret = Object.create(null);\r\n for (i = 0, l = keys.length; i < l; i++) {\r\n key = keys[i];\r\n ret[key] = iteratee(val[key], key, i);\r\n }\r\n return ret\r\n } else if (typeof val === 'number') {\r\n ret = new Array(val);\r\n for (i = 0, l = val; i < l; i++) {\r\n // 第一个参数暂时仍和小程序一致\r\n ret[i] = iteratee(i, i);\r\n }\r\n return ret\r\n }\r\n return []\r\n };\r\n\r\n}\n\n/* */\r\n\r\nvar LIFECYCLE_HOOKS$1 = [\r\n //App\r\n 'onLaunch',\r\n 'onShow',\r\n 'onHide',\r\n 'onUniNViewMessage',\r\n 'onPageNotFound',\r\n 'onThemeChange',\r\n 'onError',\r\n 'onUnhandledRejection',\r\n //Page\r\n 'onInit',\r\n 'onLoad',\r\n // 'onShow',\r\n 'onReady',\r\n // 'onHide',\r\n 'onUnload',\r\n 'onPullDownRefresh',\r\n 'onReachBottom',\r\n 'onTabItemTap',\r\n 'onAddToFavorites',\r\n 'onShareTimeline',\r\n 'onShareAppMessage',\r\n 'onResize',\r\n 'onPageScroll',\r\n 'onNavigationBarButtonTap',\r\n 'onBackPress',\r\n 'onNavigationBarSearchInputChanged',\r\n 'onNavigationBarSearchInputConfirmed',\r\n 'onNavigationBarSearchInputClicked',\r\n 'onUploadDouyinVideo',\r\n 'onNFCReadMessage',\r\n //Component\r\n // 'onReady', // 兼容旧版本,应该移除该事件\r\n 'onPageShow',\r\n 'onPageHide',\r\n 'onPageResize'\r\n];\r\nfunction lifecycleMixin$1(Vue) {\r\n\r\n //fixed vue-class-component\r\n var oldExtend = Vue.extend;\r\n Vue.extend = function(extendOptions) {\r\n extendOptions = extendOptions || {};\r\n\r\n var methods = extendOptions.methods;\r\n if (methods) {\r\n Object.keys(methods).forEach(function (methodName) {\r\n if (LIFECYCLE_HOOKS$1.indexOf(methodName)!==-1) {\r\n extendOptions[methodName] = methods[methodName];\r\n delete methods[methodName];\r\n }\r\n });\r\n }\r\n\r\n return oldExtend.call(this, extendOptions)\r\n };\r\n\r\n var strategies = Vue.config.optionMergeStrategies;\r\n var mergeHook = strategies.created;\r\n LIFECYCLE_HOOKS$1.forEach(function (hook) {\r\n strategies[hook] = mergeHook;\r\n });\r\n\r\n Vue.prototype.__lifecycle_hooks__ = LIFECYCLE_HOOKS$1;\r\n}\n\n/* */\r\n\n// install platform patch function\r\nVue.prototype.__patch__ = patch;\r\n\r\n// public mount method\r\nVue.prototype.$mount = function(\r\n el ,\r\n hydrating \r\n) {\r\n return mountComponent$1(this, el, hydrating)\r\n};\r\n\r\nlifecycleMixin$1(Vue);\r\ninternalMixin(Vue);\n\n/* */\n\nexport default Vue;\n","let tab1 = [{\r\n \"text\": \"寄存\",\r\n \"pagePath\": \"pages/home/index\",\r\n \"iconPath\": \"../../static/tabbar/home.png\",\r\n \"selectedIconPath\": \"../../static/tabbar/home-active.png\"\r\n},\r\n {\r\n \"text\": \"订单\",\r\n \"pagePath\": \"pages/order-goods/index\",\r\n \"iconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/cf65acab-6d46-4d2a-af07-3f1daf09139c.png\",\r\n \"selectedIconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/a5710018-3791-4e0c-b698-caee9bbb642b.png\"\r\n },\r\n {\r\n \"text\": \"合同\",\r\n \"pagePath\": \"pages/contract/index\",\r\n \"iconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/17b5895b-6572-49de-b710-4b318fe0776c.png\",\r\n \"selectedIconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/c37e0bb7-8702-4d6f-8caf-d62abcf07845.png\"\r\n }\r\n ,\r\n {\r\n \"text\": \"我的\",\r\n \"pagePath\": \"pages/mine/index\",\r\n \"iconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/bc489115-daba-4457-a8de-f151d7caf610.png\",\r\n \"selectedIconPath\": \"https://cdns.fontree.cn/fonchain-main/prod/image/default/artwork/91cae751-1b5a-441d-aa09-aecca60c8519.png\"\r\n }\r\n]\r\nexport default tab1\r\n","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode, /* vue-cli only */\n components, // fixed by xxxxxx auto components\n renderjs // fixed by xxxxxx renderjs\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // fixed by xxxxxx auto components\n if (components) {\n if (!options.components) {\n options.components = {}\n }\n var hasOwn = Object.prototype.hasOwnProperty\n for (var name in components) {\n if (hasOwn.call(components, name) && !hasOwn.call(options.components, name)) {\n options.components[name] = components[name]\n }\n }\n }\n // fixed by xxxxxx renderjs\n if (renderjs) {\n if(typeof renderjs.beforeCreate === 'function'){\n\t\t\trenderjs.beforeCreate = [renderjs.beforeCreate]\n\t\t}\n (renderjs.beforeCreate || (renderjs.beforeCreate = [])).unshift(function() {\n this[renderjs.__module] = this\n });\n (options.mixins || (options.mixins = [])).push(renderjs)\n }\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import login from \"./login\";\r\nimport deposit from \"./deposit\";\r\nimport mine from \"./mine\";\r\nexport default {\r\n login,\r\n deposit,\r\n mine,\r\n};\r\n","import http from \"./interface\";\r\n\r\n// openId\r\nexport const login = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/openid\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\n// 获取手机号\r\nexport const getTel = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/get/telnum\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\n// 注册\r\nexport const register = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/register\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\n// 身份验证\r\nexport const chenckId = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/ocr\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\n// 法大大\r\nexport const fddRealName = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/bind/fdd\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\n//法大大是否验证\r\nexport const checkFdd = () => {\r\n return http.request({\r\n url: \"/api/wxuser/fdd/check\",\r\n method: \"POST\",\r\n });\r\n};\r\nexport default {\r\n login,\r\n getTel,\r\n register,\r\n chenckId,\r\n fddRealName,\r\n checkFdd,\r\n};\r\n","/**\r\n * 通用uni-app网络请求\r\n * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截\r\n */\r\nexport default {\r\n config: {\r\n baseUrl: \"https://stock.szjixun.cn\", //\"http://172.16.100.93:8017\", //\"http://192.168.88.175:9021\",//'https://warehouse.szjixun.cn'\r\n header: {\r\n \"Content-Type\": \"application/json;charset=UTF-8\",\r\n // 'Content-Type':'application/x-www-form-urlencoded'\r\n },\r\n data: {},\r\n method: \"GET\",\r\n dataType: \"json\" /* 如设为json,会对返回的数据做一次 JSON.parse */,\r\n responseType: \"text\",\r\n success() {},\r\n fail() {},\r\n complete() {},\r\n },\r\n interceptor: {\r\n request: null,\r\n response: null,\r\n },\r\n request(options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n options.baseUrl = options.baseUrl || this.config.baseUrl;\r\n options.dataType = options.dataType || this.config.dataType;\r\n options.url = options.baseUrl + options.url;\r\n options.data = options.data || {};\r\n options.method = options.method || this.config.method;\r\n //TODO 加密数据\r\n options.header = options.header || this.config.header;\r\n //TODO 数据签名\r\n let _token = {\r\n Authorization: uni.getStorageSync(\"token\") || \"undefined\",\r\n };\r\n options.header = Object.assign({}, options.header, _token);\r\n /*\r\n\r\n _sign = {'sign': sign(JSON.stringify(options.data))}\r\n options.header = Object.assign({}, options.header, _token,_sign)\r\n */\r\n\r\n return new Promise((resolve, reject) => {\r\n let _config = null;\r\n\r\n options.complete = (response) => {\r\n let statusCode = response.statusCode;\r\n response.config = _config;\r\n if (process.env.NODE_ENV === \"development\") {\r\n if (statusCode === 200) {\r\n // console.log(\"【\" + _config.requestId + \"】 结果:\" + JSON.stringify(response.data))\r\n }\r\n }\r\n if (this.interceptor.response) {\r\n let newResponse = this.interceptor.response(response);\r\n if (newResponse) {\r\n response = newResponse;\r\n }\r\n }\r\n if (response.data?.status === 401) {\r\n let curPage = getCurrentPages();\r\n let route = curPage[curPage.length - 1].route; //获取当前页面的路由\r\n if (route !== \"pages/login/login\") {\r\n uni.navigateTo({\r\n url: \"/pages/login/login\",\r\n });\r\n }\r\n }\r\n // 统一的响应日志记录\r\n _reslog(response);\r\n if (statusCode === 200) {\r\n //成功\r\n resolve(response.data);\r\n } else {\r\n reject(response);\r\n }\r\n };\r\n\r\n _config = Object.assign({}, this.config, options);\r\n _config.requestId = new Date().getTime();\r\n\r\n if (this.interceptor.request) {\r\n this.interceptor.request(_config);\r\n }\r\n\r\n // 统一的请求日志记录\r\n _reqlog(_config);\r\n\r\n uni.request(_config);\r\n });\r\n },\r\n get(url, data, options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n options.url = url;\r\n options.data = data;\r\n options.method = \"GET\";\r\n return this.request(options);\r\n },\r\n post(url, data, options, header) {\r\n if (!options) {\r\n options = {};\r\n }\r\n options.url = url;\r\n options.data = data;\r\n options.header = header;\r\n options.method = \"POST\";\r\n return this.request(options);\r\n },\r\n put(url, data, options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n options.url = url;\r\n options.data = data;\r\n options.method = \"PUT\";\r\n return this.request(options);\r\n },\r\n delete(url, data, options) {\r\n if (!options) {\r\n options = {};\r\n }\r\n options.url = url;\r\n options.data = data;\r\n options.method = \"DELETE\";\r\n return this.request(options);\r\n },\r\n};\r\n\r\n/**\r\n * 请求接口日志记录\r\n */\r\nfunction _reqlog(req) {\r\n if (process.env.NODE_ENV === \"development\") {\r\n // console.log(\"【\" + req.requestId + \"】 地址:\" + req.url)\r\n if (req.data) {\r\n // console.log(\"【\" + req.requestId + \"】 请求参数:\" + JSON.stringify(req.data))\r\n }\r\n }\r\n //TODO 调接口异步写入日志数据库\r\n}\r\n\r\n/**\r\n * 响应接口日志记录\r\n */\r\nfunction _reslog(res) {\r\n let _statusCode = res.statusCode;\r\n if (process.env.NODE_ENV === \"development\") {\r\n // console.log(\"【\" + res.config.requestId + \"】 地址:\" + res.config.url)\r\n if (res.config.data) {\r\n // console.log(\"【\" + res.config.requestId + \"】 请求参数:\" + JSON.stringify(res.config.data))\r\n }\r\n // console.log(\"【\" + res.config.requestId + \"】 响应结果:\" + JSON.stringify(res))\r\n }\r\n //TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库\r\n switch (_statusCode) {\r\n case 200:\r\n break;\r\n case 401:\r\n break;\r\n case 404:\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","import http from \"./interface\";\r\n\r\n// 地点\r\nexport const address = () => {\r\n return http.request({\r\n url: \"/api/warehouse/address\",\r\n method: \"POST\",\r\n });\r\n};\r\nexport default {\r\n address,\r\n};\r\n","import http from \"./interface\";\r\n\r\nconst infoOrders = () => {\r\n return http.request({\r\n url: \"/api/warehouse/static/info\",\r\n method: \"POST\",\r\n });\r\n};\r\nconst info = () => {\r\n return http.request({\r\n url: \"/api/wxuser/info\",\r\n method: \"POST\",\r\n });\r\n};\r\n// 更新信息\r\nconst update = (data) => {\r\n return http.request({\r\n url: \"/api/wxuser/update\",\r\n method: \"POST\",\r\n data,\r\n });\r\n};\r\nconst logout = () => {\r\n return http.request({\r\n url: \"/api/wxuser/remove\",\r\n method: \"POST\",\r\n });\r\n};\r\nexport default {\r\n infoOrders,\r\n info,\r\n update,\r\n logout,\r\n};\r\n","/**\r\n * 通用消息框\r\n * @param content string 消息内容\r\n * @param fn function 回调\r\n *\r\n */\r\nconst msgToast = (content, fn, type = \"none\") => {\r\n uni.showToast({\r\n title: content,\r\n duration: 2000,\r\n icon: type,\r\n success: fn\r\n ? () => {\r\n setTimeout(() => {\r\n fn();\r\n }, 1500);\r\n }\r\n : function () {},\r\n });\r\n};\r\n\r\n/* 手机号验证 */\r\nconst vefTel = (key) => {\r\n let reg_tel =\r\n /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$/;\r\n ///^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[3-8]{1})|(18[0-9]{1})|(19[0-9]{1})|(14[5-7]{1}))+\\d{8})$/; // 11位手机号\r\n if (key === \"\" || key === undefined || key === null) {\r\n uni.showToast({\r\n title: \"请输入手机号\",\r\n duration: 2000,\r\n icon: \"none\",\r\n });\r\n return false;\r\n } else if (!reg_tel.test(key)) {\r\n uni.showToast({\r\n title: \"手机号码格式不正确\",\r\n duration: 2000,\r\n icon: \"none\",\r\n });\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n};\r\n\r\n/* 非空验证 */\r\nconst vefEmpty = (key, msg) => {\r\n if (key === \"\" || key === undefined || key === null) {\r\n uni.showToast({\r\n title: msg,\r\n duration: 2000,\r\n icon: \"none\",\r\n });\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n};\r\n\r\nconst logout = () => {\r\n msgToast(\"登录已过期,请重新登录\", () => {\r\n uni.removeStorageSync(\"userInfo\");\r\n uni.reLaunch({\r\n url: \"../login/login\",\r\n });\r\n });\r\n};\r\n/**\r\n * @description: H5 App通用方案 解决H5刷新返回失败问题\r\n * @param {*} params\r\n */\r\nconst navigateBack = (params) => {\r\n const pages = getCurrentPages();\r\n if (pages.length === 1) {\r\n if (typeof params === \"number\") {\r\n history.go(-params);\r\n } else {\r\n history.back();\r\n }\r\n } else {\r\n uni.navigateBack();\r\n }\r\n};\r\n/**\r\n * @description: 获取url参数\r\n * @param {*} params\r\n */\r\nconst getLocationParams = (name) => {\r\n const pages = getCurrentPages();\r\n const curPage = pages[pages.length - 1];\r\n return name ? curPage.options[name] : curPage.options;\r\n};\r\nexport default {\r\n msgToast,\r\n vefTel,\r\n vefEmpty,\r\n logout,\r\n navigateBack,\r\n getLocationParams,\r\n};\r\n","uni.addInterceptor({\r\n returnValue (res) {\r\n if (!(!!res && (typeof res === \"object\" || typeof res === \"function\") && typeof res.then === \"function\")) {\r\n return res;\r\n }\r\n return new Promise((resolve, reject) => {\r\n res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));\r\n });\r\n },\r\n});","// 看到此报错,是因为没有配置vue.config.js的【transpileDependencies】,详见:https://www.uviewui.com/components/npmSetting.html#_5-cli模式额外配置\r\nconst pleaseSetTranspileDependencies = {}, babelTest = pleaseSetTranspileDependencies?.test\r\n\r\n\r\n\r\n// 引入全局mixin\r\nimport mixin from './libs/mixin/mixin.js'\r\n// 小程序特有的mixin\r\nimport mpMixin from './libs/mixin/mpMixin.js'\r\n// 全局挂载引入http相关请求拦截插件\r\nimport Request from './libs/luch-request'\r\n\r\n// 路由封装\r\nimport route from './libs/util/route.js'\r\n// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制\r\nimport colorGradient from './libs/function/colorGradient.js'\r\n\r\n// 规则检验\r\nimport test from './libs/function/test.js'\r\n// 防抖方法\r\nimport debounce from './libs/function/debounce.js'\r\n// 节流方法\r\nimport throttle from './libs/function/throttle.js'\r\n// 公共文件写入的方法\r\nimport index from './libs/function/index.js'\r\n\r\n// 配置信息\r\nimport config from './libs/config/config.js'\r\n// props配置信息\r\nimport props from './libs/config/props.js'\r\n// 各个需要fixed的地方的z-index配置文件\r\nimport zIndex from './libs/config/zIndex.js'\r\n// 关于颜色的配置,特殊场景使用\r\nimport color from './libs/config/color.js'\r\n// 平台\r\nimport platform from './libs/function/platform'\r\n\r\nconst $u = {\r\n route,\r\n date: index.timeFormat, // 另名date\r\n colorGradient: colorGradient.colorGradient,\r\n hexToRgb: colorGradient.hexToRgb,\r\n rgbToHex: colorGradient.rgbToHex,\r\n colorToRgba: colorGradient.colorToRgba,\r\n test,\r\n type: ['primary', 'success', 'error', 'warning', 'info'],\r\n http: new Request(),\r\n config, // uView配置信息相关,比如版本号\r\n zIndex,\r\n debounce,\r\n throttle,\r\n mixin,\r\n mpMixin,\r\n props,\r\n ...index,\r\n color,\r\n platform\r\n}\r\n\r\n// $u挂载到uni对象上\r\nuni.$u = $u\r\n\r\nconst install = (Vue) => {\r\n // 时间格式化,同时两个名称,date和timeFormat\r\n Vue.filter('timeFormat', (timestamp, format) => uni.$u.timeFormat(timestamp, format))\r\n Vue.filter('date', (timestamp, format) => uni.$u.timeFormat(timestamp, format))\r\n // 将多久以前的方法,注入到全局过滤器\r\n Vue.filter('timeFrom', (timestamp, format) => uni.$u.timeFrom(timestamp, format))\r\n // 同时挂载到uni和Vue.prototype中\r\n\r\n // 只有vue,挂载到Vue.prototype才有意义,因为nvue中全局Vue.prototype和Vue.mixin是无效的\r\n Vue.prototype.$u = $u\r\n Vue.mixin(mixin)\r\n\r\n}\r\n\r\nexport default {\r\n install\r\n}\r\n","module.exports = {\r\n // 定义每个组件都可能需要用到的外部样式以及类名\r\n props: {\r\n // 每个组件都有的父组件传递的样式,可以为字符串或者对象形式\r\n customStyle: {\r\n type: [Object, String],\r\n default: () => ({})\r\n },\r\n customClass: {\r\n type: String,\r\n default: ''\r\n },\r\n // 跳转的页面路径\r\n url: {\r\n type: String,\r\n default: ''\r\n },\r\n // 页面跳转的类型\r\n linkType: {\r\n type: String,\r\n default: 'navigateTo'\r\n }\r\n },\r\n data() {\r\n return {}\r\n },\r\n onLoad() {\r\n // getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出\r\n this.$u.getRect = this.$uGetRect\r\n },\r\n created() {\r\n // 组件当中,只有created声明周期,为了能在组件使用,故也在created中将方法挂载到$u\r\n this.$u.getRect = this.$uGetRect\r\n },\r\n computed: {\r\n // 在2.x版本中,将会把$u挂载到uni对象下,导致在模板中无法使用uni.$u.xxx形式\r\n // 所以这里通过computed计算属性将其附加到this.$u上,就可以在模板或者js中使用uni.$u.xxx\r\n // 只在nvue环境通过此方式引入完整的$u,其他平台会出现性能问题,非nvue则按需引入(主要原因是props过大)\r\n $u() {\r\n\r\n // 在非nvue端,移除props,http,mixin等对象,避免在小程序setData时数据过大影响性能\r\n return uni.$u.deepMerge(uni.$u, {\r\n props: undefined,\r\n http: undefined,\r\n mixin: undefined\r\n })\r\n\r\n\r\n\r\n\r\n },\r\n /**\r\n * 生成bem规则类名\r\n * 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class=\"[bem()]\"的形式进行同用\r\n * 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式\r\n * @param {String} name 组件名称\r\n * @param {Array} fixed 一直会存在的类名\r\n * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名\r\n * @returns {Array|string}\r\n */\r\n bem() {\r\n return function (name, fixed, change) {\r\n // 类名前缀\r\n const prefix = `u-${name}--`\r\n const classes = {}\r\n if (fixed) {\r\n fixed.map((item) => {\r\n // 这里的类名,会一直存在\r\n classes[prefix + this[item]] = true\r\n })\r\n }\r\n if (change) {\r\n change.map((item) => {\r\n // 这里的类名,会根据this[item]的值为true或者false,而进行添加或者移除某一个类\r\n this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item])\r\n })\r\n }\r\n return Object.keys(classes)\r\n // 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有\",\",而导致失效\r\n\r\n\r\n\r\n }\r\n }\r\n },\r\n methods: {\r\n // 跳转某一个页面\r\n openPage(urlKey = 'url') {\r\n const url = this[urlKey]\r\n if (url) {\r\n // 执行类似uni.navigateTo的方法\r\n uni[this.linkType]({\r\n url\r\n })\r\n }\r\n },\r\n // 查询节点信息\r\n // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21)\r\n // 解决办法为在组件根部再套一个没有任何作用的view元素\r\n $uGetRect(selector, all) {\r\n return new Promise((resolve) => {\r\n uni.createSelectorQuery()\r\n .in(this)[all ? 'selectAll' : 'select'](selector)\r\n .boundingClientRect((rect) => {\r\n if (all && Array.isArray(rect) && rect.length) {\r\n resolve(rect)\r\n }\r\n if (!all && rect) {\r\n resolve(rect)\r\n }\r\n })\r\n .exec()\r\n })\r\n },\r\n getParentData(parentName = '') {\r\n // 避免在created中去定义parent变量\r\n if (!this.parent) this.parent = {}\r\n // 这里的本质原理是,通过获取父组件实例(也即类似u-radio的父组件u-radio-group的this)\r\n // 将父组件this中对应的参数,赋值给本组件(u-radio的this)的parentData对象中对应的属性\r\n // 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化\r\n // 此处并不会自动更新子组件的数据,而是依赖父组件u-radio-group去监听data的变化,手动调用更新子组件的方法去重新获取\r\n this.parent = uni.$u.$parent.call(this, parentName)\r\n if (this.parent.children) {\r\n // 如果父组件的children不存在本组件的实例,才将本实例添加到父组件的children中\r\n this.parent.children.indexOf(this) === -1 && this.parent.children.push(this)\r\n }\r\n if (this.parent && this.parentData) {\r\n // 历遍parentData中的属性,将parent中的同名属性赋值给parentData\r\n Object.keys(this.parentData).map((key) => {\r\n this.parentData[key] = this.parent[key]\r\n })\r\n }\r\n },\r\n // 阻止事件冒泡\r\n preventEvent(e) {\r\n e && typeof (e.stopPropagation) === 'function' && e.stopPropagation()\r\n },\r\n // 空操作\r\n noop(e) {\r\n this.preventEvent(e)\r\n }\r\n },\r\n onReachBottom() {\r\n uni.$emit('uOnReachBottom')\r\n },\r\n beforeDestroy() {\r\n // 判断当前页面是否存在parent和chldren,一般在checkbox和checkbox-group父子联动的场景会有此情况\r\n // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱\r\n if (this.parent && uni.$u.test.array(this.parent.children)) {\r\n // 组件销毁时,移除父组件中的children数组中对应的实例\r\n const childrenList = this.parent.children\r\n childrenList.map((child, index) => {\r\n // 如果相等,则移除\r\n if (child === this) {\r\n childrenList.splice(index, 1)\r\n }\r\n })\r\n }\r\n }\r\n}\r\n","export default {\r\n\r\n // 将自定义节点设置成虚拟的,更加接近Vue组件的表现,能更好的使用flex属性\r\n options: {\r\n virtualHost: true\r\n }\r\n\r\n}\r\n","import Request from './core/Request'\r\n\r\nexport default Request\r\n","/**\r\n * @Class Request\r\n * @description luch-request http请求插件\r\n * @version 3.0.7\r\n * @Author lu-ch\r\n * @Date 2021-09-04\r\n * @Email webwork.s@qq.com\r\n * 文档: https://www.quanzhan.co/luch-request/\r\n * github: https://github.com/lei-mu/luch-request\r\n * DCloud: http://ext.dcloud.net.cn/plugin?id=392\r\n * HBuilderX: beat-3.0.4 alpha-3.0.4\r\n */\r\n\r\nimport dispatchRequest from './dispatchRequest'\r\nimport InterceptorManager from './InterceptorManager'\r\nimport mergeConfig from './mergeConfig'\r\nimport defaults from './defaults'\r\nimport { isPlainObject } from '../utils'\r\nimport clone from '../utils/clone'\r\n\r\nexport default class Request {\r\n /**\r\n * @param {Object} arg - 全局配置\r\n * @param {String} arg.baseURL - 全局根路径\r\n * @param {Object} arg.header - 全局header\r\n * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式\r\n * @param {String} arg.dataType = [json] - 全局默认的dataType\r\n * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持\r\n * @param {Object} arg.custom - 全局默认的自定义参数\r\n * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序\r\n * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)\r\n * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)\r\n * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)\r\n * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300\r\n */\r\n constructor(arg = {}) {\r\n if (!isPlainObject(arg)) {\r\n arg = {}\r\n console.warn('设置全局参数必须接收一个Object')\r\n }\r\n this.config = clone({ ...defaults, ...arg })\r\n this.interceptors = {\r\n request: new InterceptorManager(),\r\n response: new InterceptorManager()\r\n }\r\n }\r\n\r\n /**\r\n * @Function\r\n * @param {Request~setConfigCallback} f - 设置全局默认配置\r\n */\r\n setConfig(f) {\r\n this.config = f(this.config)\r\n }\r\n\r\n middleware(config) {\r\n config = mergeConfig(this.config, config)\r\n const chain = [dispatchRequest, undefined]\r\n let promise = Promise.resolve(config)\r\n\r\n this.interceptors.request.forEach((interceptor) => {\r\n chain.unshift(interceptor.fulfilled, interceptor.rejected)\r\n })\r\n\r\n this.interceptors.response.forEach((interceptor) => {\r\n chain.push(interceptor.fulfilled, interceptor.rejected)\r\n })\r\n\r\n while (chain.length) {\r\n promise = promise.then(chain.shift(), chain.shift())\r\n }\r\n\r\n return promise\r\n }\r\n\r\n /**\r\n * @Function\r\n * @param {Object} config - 请求配置项\r\n * @prop {String} options.url - 请求路径\r\n * @prop {Object} options.data - 请求参数\r\n * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型\r\n * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse\r\n * @prop {Object} [options.header = config.header] - 请求header\r\n * @prop {Object} [options.method = config.method] - 请求方法\r\n * @returns {Promise}\r\n */\r\n request(config = {}) {\r\n return this.middleware(config)\r\n }\r\n\r\n get(url, options = {}) {\r\n return this.middleware({\r\n url,\r\n method: 'GET',\r\n ...options\r\n })\r\n }\r\n\r\n post(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'POST',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n put(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'PUT',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n delete(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'DELETE',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n connect(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'CONNECT',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n head(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'HEAD',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n options(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'OPTIONS',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n\r\n trace(url, data, options = {}) {\r\n return this.middleware({\r\n url,\r\n data,\r\n method: 'TRACE',\r\n ...options\r\n })\r\n }\r\n\r\n\r\n\r\n upload(url, config = {}) {\r\n config.url = url\r\n config.method = 'UPLOAD'\r\n return this.middleware(config)\r\n }\r\n\r\n download(url, config = {}) {\r\n config.url = url\r\n config.method = 'DOWNLOAD'\r\n return this.middleware(config)\r\n }\r\n}\r\n\r\n/**\r\n * setConfig回调\r\n * @return {Object} - 返回操作后的config\r\n * @callback Request~setConfigCallback\r\n * @param {Object} config - 全局默认config\r\n */\r\n","import adapter from '../adapters/index'\r\n\r\nexport default (config) => adapter(config)\r\n","import buildURL from '../helpers/buildURL'\r\nimport buildFullPath from '../core/buildFullPath'\r\nimport settle from '../core/settle'\r\nimport { isUndefined } from '../utils'\r\n\r\n/**\r\n * 返回可选值存在的配置\r\n * @param {Array} keys - 可选值数组\r\n * @param {Object} config2 - 配置\r\n * @return {{}} - 存在的配置项\r\n */\r\nconst mergeKeys = (keys, config2) => {\r\n const config = {}\r\n keys.forEach((prop) => {\r\n if (!isUndefined(config2[prop])) {\r\n config[prop] = config2[prop]\r\n }\r\n })\r\n return config\r\n}\r\nexport default (config) => new Promise((resolve, reject) => {\r\n const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)\r\n const _config = {\r\n url: fullPath,\r\n header: config.header,\r\n complete: (response) => {\r\n config.fullPath = fullPath\r\n response.config = config\r\n try {\r\n // 对可能字符串不是json 的情况容错\r\n if (typeof response.data === 'string') {\r\n response.data = JSON.parse(response.data)\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (e) {\r\n }\r\n settle(resolve, reject, response)\r\n }\r\n }\r\n let requestTask\r\n if (config.method === 'UPLOAD') {\r\n delete _config.header['content-type']\r\n delete _config.header['Content-Type']\r\n const otherConfig = {\r\n\r\n\r\n\r\n filePath: config.filePath,\r\n name: config.name\r\n }\r\n const optionalKeys = [\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n 'formData'\r\n ]\r\n requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })\r\n } else if (config.method === 'DOWNLOAD') {\r\n\r\n\r\n\r\n\r\n\r\n requestTask = uni.downloadFile(_config)\r\n } else {\r\n const optionalKeys = [\r\n 'data',\r\n 'method',\r\n\r\n 'timeout',\r\n\r\n 'dataType',\r\n\r\n 'responseType',\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n ]\r\n requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })\r\n }\r\n if (config.getTask) {\r\n config.getTask(requestTask, config)\r\n }\r\n})\r\n","'use strict'\r\n\r\nimport * as utils from '../utils'\r\n\r\nfunction encode(val) {\r\n return encodeURIComponent(val)\r\n .replace(/%40/gi, '@')\r\n .replace(/%3A/gi, ':')\r\n .replace(/%24/g, '$')\r\n .replace(/%2C/gi, ',')\r\n .replace(/%20/g, '+')\r\n .replace(/%5B/gi, '[')\r\n .replace(/%5D/gi, ']')\r\n}\r\n\r\n/**\r\n * Build a URL by appending params to the end\r\n *\r\n * @param {string} url The base of the url (e.g., http://www.google.com)\r\n * @param {object} [params] The params to be appended\r\n * @returns {string} The formatted url\r\n */\r\nexport default function buildURL(url, params) {\r\n /* eslint no-param-reassign:0 */\r\n if (!params) {\r\n return url\r\n }\r\n\r\n let serializedParams\r\n if (utils.isURLSearchParams(params)) {\r\n serializedParams = params.toString()\r\n } else {\r\n const parts = []\r\n\r\n utils.forEach(params, (val, key) => {\r\n if (val === null || typeof val === 'undefined') {\r\n return\r\n }\r\n\r\n if (utils.isArray(val)) {\r\n key = `${key}[]`\r\n } else {\r\n val = [val]\r\n }\r\n\r\n utils.forEach(val, (v) => {\r\n if (utils.isDate(v)) {\r\n v = v.toISOString()\r\n } else if (utils.isObject(v)) {\r\n v = JSON.stringify(v)\r\n }\r\n parts.push(`${encode(key)}=${encode(v)}`)\r\n })\r\n })\r\n\r\n serializedParams = parts.join('&')\r\n }\r\n\r\n if (serializedParams) {\r\n const hashmarkIndex = url.indexOf('#')\r\n if (hashmarkIndex !== -1) {\r\n url = url.slice(0, hashmarkIndex)\r\n }\r\n\r\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams\r\n }\r\n\r\n return url\r\n}\r\n","'use strict'\r\n\r\n// utils is a library of generic helper functions non-specific to axios\r\n\r\nconst { toString } = Object.prototype\r\n\r\n/**\r\n * Determine if a value is an Array\r\n *\r\n * @param {Object} val The value to test\r\n * @returns {boolean} True if value is an Array, otherwise false\r\n */\r\nexport function isArray(val) {\r\n return toString.call(val) === '[object Array]'\r\n}\r\n\r\n/**\r\n * Determine if a value is an Object\r\n *\r\n * @param {Object} val The value to test\r\n * @returns {boolean} True if value is an Object, otherwise false\r\n */\r\nexport function isObject(val) {\r\n return val !== null && typeof val === 'object'\r\n}\r\n\r\n/**\r\n * Determine if a value is a Date\r\n *\r\n * @param {Object} val The value to test\r\n * @returns {boolean} True if value is a Date, otherwise false\r\n */\r\nexport function isDate(val) {\r\n return toString.call(val) === '[object Date]'\r\n}\r\n\r\n/**\r\n * Determine if a value is a URLSearchParams object\r\n *\r\n * @param {Object} val The value to test\r\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\r\n */\r\nexport function isURLSearchParams(val) {\r\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams\r\n}\r\n\r\n/**\r\n * Iterate over an Array or an Object invoking a function for each item.\r\n *\r\n * If `obj` is an Array callback will be called passing\r\n * the value, index, and complete array for each item.\r\n *\r\n * If 'obj' is an Object callback will be called passing\r\n * the value, key, and complete object for each property.\r\n *\r\n * @param {Object|Array} obj The object to iterate\r\n * @param {Function} fn The callback to invoke for each item\r\n */\r\nexport function forEach(obj, fn) {\r\n // Don't bother if no value provided\r\n if (obj === null || typeof obj === 'undefined') {\r\n return\r\n }\r\n\r\n // Force an array if not already something iterable\r\n if (typeof obj !== 'object') {\r\n /* eslint no-param-reassign:0 */\r\n obj = [obj]\r\n }\r\n\r\n if (isArray(obj)) {\r\n // Iterate over array values\r\n for (let i = 0, l = obj.length; i < l; i++) {\r\n fn.call(null, obj[i], i, obj)\r\n }\r\n } else {\r\n // Iterate over object keys\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n fn.call(null, obj[key], key, obj)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 是否为boolean 值\r\n * @param val\r\n * @returns {boolean}\r\n */\r\nexport function isBoolean(val) {\r\n return typeof val === 'boolean'\r\n}\r\n\r\n/**\r\n * 是否为真正的对象{} new Object\r\n * @param {any} obj - 检测的对象\r\n * @returns {boolean}\r\n */\r\nexport function isPlainObject(obj) {\r\n return Object.prototype.toString.call(obj) === '[object Object]'\r\n}\r\n\r\n/**\r\n * Function equal to merge with the difference being that no reference\r\n * to original objects is kept.\r\n *\r\n * @see merge\r\n * @param {Object} obj1 Object to merge\r\n * @returns {Object} Result of all merge properties\r\n */\r\nexport function deepMerge(/* obj1, obj2, obj3, ... */) {\r\n const result = {}\r\n function assignValue(val, key) {\r\n if (typeof result[key] === 'object' && typeof val === 'object') {\r\n result[key] = deepMerge(result[key], val)\r\n } else if (typeof val === 'object') {\r\n result[key] = deepMerge({}, val)\r\n } else {\r\n result[key] = val\r\n }\r\n }\r\n for (let i = 0, l = arguments.length; i < l; i++) {\r\n forEach(arguments[i], assignValue)\r\n }\r\n return result\r\n}\r\n\r\nexport function isUndefined(val) {\r\n return typeof val === 'undefined'\r\n}\r\n","'use strict'\r\n\r\nimport isAbsoluteURL from '../helpers/isAbsoluteURL'\r\nimport combineURLs from '../helpers/combineURLs'\r\n\r\n/**\r\n * Creates a new URL by combining the baseURL with the requestedURL,\r\n * only when the requestedURL is not already an absolute URL.\r\n * If the requestURL is absolute, this function returns the requestedURL untouched.\r\n *\r\n * @param {string} baseURL The base URL\r\n * @param {string} requestedURL Absolute or relative URL to combine\r\n * @returns {string} The combined full path\r\n */\r\nexport default function buildFullPath(baseURL, requestedURL) {\r\n if (baseURL && !isAbsoluteURL(requestedURL)) {\r\n return combineURLs(baseURL, requestedURL)\r\n }\r\n return requestedURL\r\n}\r\n","'use strict'\r\n\r\n/**\r\n * Determines whether the specified URL is absolute\r\n *\r\n * @param {string} url The URL to test\r\n * @returns {boolean} True if the specified URL is absolute, otherwise false\r\n */\r\nexport default function isAbsoluteURL(url) {\r\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\r\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\r\n // by any combination of letters, digits, plus, period, or hyphen.\r\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url)\r\n}\r\n","'use strict'\r\n\r\n/**\r\n * Creates a new URL by combining the specified URLs\r\n *\r\n * @param {string} baseURL The base URL\r\n * @param {string} relativeURL The relative URL\r\n * @returns {string} The combined URL\r\n */\r\nexport default function combineURLs(baseURL, relativeURL) {\r\n return relativeURL\r\n ? `${baseURL.replace(/\\/+$/, '')}/${relativeURL.replace(/^\\/+/, '')}`\r\n : baseURL\r\n}\r\n","/**\r\n * Resolve or reject a Promise based on response status.\r\n *\r\n * @param {Function} resolve A function that resolves the promise.\r\n * @param {Function} reject A function that rejects the promise.\r\n * @param {object} response The response.\r\n */\r\nexport default function settle(resolve, reject, response) {\r\n const { validateStatus } = response.config\r\n const status = response.statusCode\r\n if (status && (!validateStatus || validateStatus(status))) {\r\n resolve(response)\r\n } else {\r\n reject(response)\r\n }\r\n}\r\n","'use strict'\r\n\r\nfunction InterceptorManager() {\r\n this.handlers = []\r\n}\r\n\r\n/**\r\n * Add a new interceptor to the stack\r\n *\r\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\r\n * @param {Function} rejected The function to handle `reject` for a `Promise`\r\n *\r\n * @return {Number} An ID used to remove interceptor later\r\n */\r\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\r\n this.handlers.push({\r\n fulfilled,\r\n rejected\r\n })\r\n return this.handlers.length - 1\r\n}\r\n\r\n/**\r\n * Remove an interceptor from the stack\r\n *\r\n * @param {Number} id The ID that was returned by `use`\r\n */\r\nInterceptorManager.prototype.eject = function eject(id) {\r\n if (this.handlers[id]) {\r\n this.handlers[id] = null\r\n }\r\n}\r\n\r\n/**\r\n * Iterate over all the registered interceptors\r\n *\r\n * This method is particularly useful for skipping over any\r\n * interceptors that may have become `null` calling `eject`.\r\n *\r\n * @param {Function} fn The function to call for each interceptor\r\n */\r\nInterceptorManager.prototype.forEach = function forEach(fn) {\r\n this.handlers.forEach((h) => {\r\n if (h !== null) {\r\n fn(h)\r\n }\r\n })\r\n}\r\n\r\nexport default InterceptorManager\r\n","import { deepMerge, isUndefined } from '../utils'\r\n\r\n/**\r\n * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局\r\n * @param {Array} keys - 配置项\r\n * @param {Object} globalsConfig - 当前的全局配置\r\n * @param {Object} config2 - 局部配置\r\n * @return {{}}\r\n */\r\nconst mergeKeys = (keys, globalsConfig, config2) => {\r\n const config = {}\r\n keys.forEach((prop) => {\r\n if (!isUndefined(config2[prop])) {\r\n config[prop] = config2[prop]\r\n } else if (!isUndefined(globalsConfig[prop])) {\r\n config[prop] = globalsConfig[prop]\r\n }\r\n })\r\n return config\r\n}\r\n/**\r\n *\r\n * @param globalsConfig - 当前实例的全局配置\r\n * @param config2 - 当前的局部配置\r\n * @return - 合并后的配置\r\n */\r\nexport default (globalsConfig, config2 = {}) => {\r\n const method = config2.method || globalsConfig.method || 'GET'\r\n let config = {\r\n baseURL: globalsConfig.baseURL || '',\r\n method,\r\n url: config2.url || '',\r\n params: config2.params || {},\r\n custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) },\r\n header: deepMerge(globalsConfig.header || {}, config2.header || {})\r\n }\r\n const defaultToConfig2Keys = ['getTask', 'validateStatus']\r\n config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) }\r\n\r\n // eslint-disable-next-line no-empty\r\n if (method === 'DOWNLOAD') {\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n } else if (method === 'UPLOAD') {\r\n delete config.header['content-type']\r\n delete config.header['Content-Type']\r\n const uploadKeys = [\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n 'filePath',\r\n 'name',\r\n\r\n\r\n\r\n 'formData'\r\n ]\r\n uploadKeys.forEach((prop) => {\r\n if (!isUndefined(config2[prop])) {\r\n config[prop] = config2[prop]\r\n }\r\n })\r\n\r\n\r\n\r\n\r\n\r\n } else {\r\n const defaultsKeys = [\r\n 'data',\r\n\r\n 'timeout',\r\n\r\n 'dataType',\r\n\r\n 'responseType',\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n ]\r\n config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) }\r\n }\r\n\r\n return config\r\n}\r\n","/**\r\n * 默认的全局配置\r\n */\r\n\r\nexport default {\r\n baseURL: '',\r\n header: {},\r\n method: 'GET',\r\n dataType: 'json',\r\n\r\n responseType: 'text',\r\n\r\n custom: {},\r\n\r\n timeout: 60000,\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n validateStatus: function validateStatus(status) {\r\n return status >= 200 && status < 300\r\n }\r\n}\r\n","/* eslint-disable */\r\nvar clone = (function() {\r\n 'use strict';\r\n\r\n function _instanceof(obj, type) {\r\n return type != null && obj instanceof type;\r\n }\r\n\r\n var nativeMap;\r\n try {\r\n nativeMap = Map;\r\n } catch(_) {\r\n // maybe a reference error because no `Map`. Give it a dummy value that no\r\n // value will ever be an instanceof.\r\n nativeMap = function() {};\r\n }\r\n\r\n var nativeSet;\r\n try {\r\n nativeSet = Set;\r\n } catch(_) {\r\n nativeSet = function() {};\r\n }\r\n\r\n var nativePromise;\r\n try {\r\n nativePromise = Promise;\r\n } catch(_) {\r\n nativePromise = function() {};\r\n }\r\n\r\n /**\r\n * Clones (copies) an Object using deep copying.\r\n *\r\n * This function supports circular references by default, but if you are certain\r\n * there are no circular references in your object, you can save some CPU time\r\n * by calling clone(obj, false).\r\n *\r\n * Caution: if `circular` is false and `parent` contains circular references,\r\n * your program may enter an infinite loop and crash.\r\n *\r\n * @param `parent` - the object to be cloned\r\n * @param `circular` - set to true if the object to be cloned may contain\r\n * circular references. (optional - true by default)\r\n * @param `depth` - set to a number if the object is only to be cloned to\r\n * a particular depth. (optional - defaults to Infinity)\r\n * @param `prototype` - sets the prototype to be used when cloning an object.\r\n * (optional - defaults to parent prototype).\r\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\r\n * should be cloned as well. Non-enumerable properties on the prototype\r\n * chain will be ignored. (optional - false by default)\r\n */\r\n function clone(parent, circular, depth, prototype, includeNonEnumerable) {\r\n if (typeof circular === 'object') {\r\n depth = circular.depth;\r\n prototype = circular.prototype;\r\n includeNonEnumerable = circular.includeNonEnumerable;\r\n circular = circular.circular;\r\n }\r\n // maintain two arrays for circular references, where corresponding parents\r\n // and children have the same index\r\n var allParents = [];\r\n var allChildren = [];\r\n\r\n var useBuffer = typeof Buffer != 'undefined';\r\n\r\n if (typeof circular == 'undefined')\r\n circular = true;\r\n\r\n if (typeof depth == 'undefined')\r\n depth = Infinity;\r\n\r\n // recurse this function so we don't reset allParents and allChildren\r\n function _clone(parent, depth) {\r\n // cloning null always returns null\r\n if (parent === null)\r\n return null;\r\n\r\n if (depth === 0)\r\n return parent;\r\n\r\n var child;\r\n var proto;\r\n if (typeof parent != 'object') {\r\n return parent;\r\n }\r\n\r\n if (_instanceof(parent, nativeMap)) {\r\n child = new nativeMap();\r\n } else if (_instanceof(parent, nativeSet)) {\r\n child = new nativeSet();\r\n } else if (_instanceof(parent, nativePromise)) {\r\n child = new nativePromise(function (resolve, reject) {\r\n parent.then(function(value) {\r\n resolve(_clone(value, depth - 1));\r\n }, function(err) {\r\n reject(_clone(err, depth - 1));\r\n });\r\n });\r\n } else if (clone.__isArray(parent)) {\r\n child = [];\r\n } else if (clone.__isRegExp(parent)) {\r\n child = new RegExp(parent.source, __getRegExpFlags(parent));\r\n if (parent.lastIndex) child.lastIndex = parent.lastIndex;\r\n } else if (clone.__isDate(parent)) {\r\n child = new Date(parent.getTime());\r\n } else if (useBuffer && Buffer.isBuffer(parent)) {\r\n if (Buffer.from) {\r\n // Node.js >= 5.10.0\r\n child = Buffer.from(parent);\r\n } else {\r\n // Older Node.js versions\r\n child = new Buffer(parent.length);\r\n parent.copy(child);\r\n }\r\n return child;\r\n } else if (_instanceof(parent, Error)) {\r\n child = Object.create(parent);\r\n } else {\r\n if (typeof prototype == 'undefined') {\r\n proto = Object.getPrototypeOf(parent);\r\n child = Object.create(proto);\r\n }\r\n else {\r\n child = Object.create(prototype);\r\n proto = prototype;\r\n }\r\n }\r\n\r\n if (circular) {\r\n var index = allParents.indexOf(parent);\r\n\r\n if (index != -1) {\r\n return allChildren[index];\r\n }\r\n allParents.push(parent);\r\n allChildren.push(child);\r\n }\r\n\r\n if (_instanceof(parent, nativeMap)) {\r\n parent.forEach(function(value, key) {\r\n var keyChild = _clone(key, depth - 1);\r\n var valueChild = _clone(value, depth - 1);\r\n child.set(keyChild, valueChild);\r\n });\r\n }\r\n if (_instanceof(parent, nativeSet)) {\r\n parent.forEach(function(value) {\r\n var entryChild = _clone(value, depth - 1);\r\n child.add(entryChild);\r\n });\r\n }\r\n\r\n for (var i in parent) {\r\n var attrs = Object.getOwnPropertyDescriptor(parent, i);\r\n if (attrs) {\r\n child[i] = _clone(parent[i], depth - 1);\r\n }\r\n\r\n try {\r\n var objProperty = Object.getOwnPropertyDescriptor(parent, i);\r\n if (objProperty.set === 'undefined') {\r\n // no setter defined. Skip cloning this property\r\n continue;\r\n }\r\n child[i] = _clone(parent[i], depth - 1);\r\n } catch(e){\r\n if (e instanceof TypeError) {\r\n // when in strict mode, TypeError will be thrown if child[i] property only has a getter\r\n // we can't do anything about this, other than inform the user that this property cannot be set.\r\n continue\r\n } else if (e instanceof ReferenceError) {\r\n //this may happen in non strict mode\r\n continue\r\n }\r\n }\r\n\r\n }\r\n\r\n if (Object.getOwnPropertySymbols) {\r\n var symbols = Object.getOwnPropertySymbols(parent);\r\n for (var i = 0; i < symbols.length; i++) {\r\n // Don't need to worry about cloning a symbol because it is a primitive,\r\n // like a number or string.\r\n var symbol = symbols[i];\r\n var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\r\n if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\r\n continue;\r\n }\r\n child[symbol] = _clone(parent[symbol], depth - 1);\r\n Object.defineProperty(child, symbol, descriptor);\r\n }\r\n }\r\n\r\n if (includeNonEnumerable) {\r\n var allPropertyNames = Object.getOwnPropertyNames(parent);\r\n for (var i = 0; i < allPropertyNames.length; i++) {\r\n var propertyName = allPropertyNames[i];\r\n var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\r\n if (descriptor && descriptor.enumerable) {\r\n continue;\r\n }\r\n child[propertyName] = _clone(parent[propertyName], depth - 1);\r\n Object.defineProperty(child, propertyName, descriptor);\r\n }\r\n }\r\n\r\n return child;\r\n }\r\n\r\n return _clone(parent, depth);\r\n }\r\n\r\n /**\r\n * Simple flat clone using prototype, accepts only objects, usefull for property\r\n * override on FLAT configuration object (no nested props).\r\n *\r\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\r\n * works.\r\n */\r\n clone.clonePrototype = function clonePrototype(parent) {\r\n if (parent === null)\r\n return null;\r\n\r\n var c = function () {};\r\n c.prototype = parent;\r\n return new c();\r\n };\r\n\r\n// private utility functions\r\n\r\n function __objToStr(o) {\r\n return Object.prototype.toString.call(o);\r\n }\r\n clone.__objToStr = __objToStr;\r\n\r\n function __isDate(o) {\r\n return typeof o === 'object' && __objToStr(o) === '[object Date]';\r\n }\r\n clone.__isDate = __isDate;\r\n\r\n function __isArray(o) {\r\n return typeof o === 'object' && __objToStr(o) === '[object Array]';\r\n }\r\n clone.__isArray = __isArray;\r\n\r\n function __isRegExp(o) {\r\n return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\r\n }\r\n clone.__isRegExp = __isRegExp;\r\n\r\n function __getRegExpFlags(re) {\r\n var flags = '';\r\n if (re.global) flags += 'g';\r\n if (re.ignoreCase) flags += 'i';\r\n if (re.multiline) flags += 'm';\r\n return flags;\r\n }\r\n clone.__getRegExpFlags = __getRegExpFlags;\r\n\r\n return clone;\r\n})();\r\n\r\nexport default clone\r\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","/**\r\n * 路由跳转方法,该方法相对于直接使用uni.xxx的好处是使用更加简单快捷\r\n * 并且带有路由拦截功能\r\n */\r\n\r\nclass Router {\r\n constructor() {\r\n // 原始属性定义\r\n this.config = {\r\n type: 'navigateTo',\r\n url: '',\r\n delta: 1, // navigateBack页面后退时,回退的层数\r\n params: {}, // 传递的参数\r\n animationType: 'pop-in', // 窗口动画,只在APP有效\r\n animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效\r\n intercept: false // 是否需要拦截\r\n }\r\n // 因为route方法是需要对外赋值给另外的对象使用,同时route内部有使用this,会导致route失去上下文\r\n // 这里在构造函数中进行this绑定\r\n this.route = this.route.bind(this)\r\n }\r\n\r\n // 判断url前面是否有\"/\",如果没有则加上,否则无法跳转\r\n addRootPath(url) {\r\n return url[0] === '/' ? url : `/${url}`\r\n }\r\n\r\n // 整合路由参数\r\n mixinParam(url, params) {\r\n url = url && this.addRootPath(url)\r\n\r\n // 使用正则匹配,主要依据是判断是否有\"/\",\"?\",\"=\"等,如“/page/index/index?name=mary\"\r\n // 如果有url中有get参数,转换后无需带上\"?\"\r\n let query = ''\r\n if (/.*\\/.*\\?.*=.*/.test(url)) {\r\n // object对象转为get类型的参数\r\n query = uni.$u.queryParams(params, false)\r\n // 因为已有get参数,所以后面拼接的参数需要带上\"&\"隔开\r\n return url += `&${query}`\r\n }\r\n // 直接拼接参数,因为此处url中没有后面的query参数,也就没有\"?/&\"之类的符号\r\n query = uni.$u.queryParams(params)\r\n return url += query\r\n }\r\n\r\n // 对外的方法名称\r\n async route(options = {}, params = {}) {\r\n // 合并用户的配置和内部的默认配置\r\n let mergeConfig = {}\r\n\r\n if (typeof options === 'string') {\r\n // 如果options为字符串,则为route(url, params)的形式\r\n mergeConfig.url = this.mixinParam(options, params)\r\n mergeConfig.type = 'navigateTo'\r\n } else {\r\n mergeConfig = uni.$u.deepClone(options, this.config)\r\n // 否则正常使用mergeConfig中的url和params进行拼接\r\n mergeConfig.url = this.mixinParam(options.url, options.params)\r\n }\r\n\r\n // 如果本次跳转的路径和本页面路径一致,不执行跳转,防止用户快速点击跳转按钮,造成多次跳转同一个页面的问题\r\n if (mergeConfig.url === uni.$u.page()) return\r\n\r\n if (params.intercept) {\r\n this.config.intercept = params.intercept\r\n }\r\n // params参数也带给拦截器\r\n mergeConfig.params = params\r\n // 合并内外部参数\r\n mergeConfig = uni.$u.deepMerge(this.config, mergeConfig)\r\n // 判断用户是否定义了拦截器\r\n if (typeof uni.$u.routeIntercept === 'function') {\r\n // 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转\r\n const isNext = await new Promise((resolve, reject) => {\r\n uni.$u.routeIntercept(mergeConfig, resolve)\r\n })\r\n // 如果isNext为true,则执行路由跳转\r\n isNext && this.openPage(mergeConfig)\r\n } else {\r\n this.openPage(mergeConfig)\r\n }\r\n }\r\n\r\n // 执行路由跳转\r\n openPage(config) {\r\n // 解构参数\r\n const {\r\n url,\r\n type,\r\n delta,\r\n animationType,\r\n animationDuration\r\n } = config\r\n if (config.type == 'navigateTo' || config.type == 'to') {\r\n uni.navigateTo({\r\n url,\r\n animationType,\r\n animationDuration\r\n })\r\n }\r\n if (config.type == 'redirectTo' || config.type == 'redirect') {\r\n uni.redirectTo({\r\n url\r\n })\r\n }\r\n if (config.type == 'switchTab' || config.type == 'tab') {\r\n uni.switchTab({\r\n url\r\n })\r\n }\r\n if (config.type == 'reLaunch' || config.type == 'launch') {\r\n uni.reLaunch({\r\n url\r\n })\r\n }\r\n if (config.type == 'navigateBack' || config.type == 'back') {\r\n uni.navigateBack({\r\n delta\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport default (new Router()).route\r\n","// TODO(Babel 8): Remove this file.\n\nvar runtime = require('@babel/runtime/helpers/regeneratorRuntime')()\nmodule.exports = runtime\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) {\n if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n }\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) {\n keys.push(key);\n }\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {\n \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n }\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\nmodule.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\r\n * 求两个颜色之间的渐变值\r\n * @param {string} startColor 开始的颜色\r\n * @param {string} endColor 结束的颜色\r\n * @param {number} step 颜色等分的份额\r\n * */\r\nfunction colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {\r\n const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式\r\n const startR = startRGB[0]\r\n const startG = startRGB[1]\r\n const startB = startRGB[2]\r\n\r\n const endRGB = hexToRgb(endColor, false)\r\n const endR = endRGB[0]\r\n const endG = endRGB[1]\r\n const endB = endRGB[2]\r\n\r\n const sR = (endR - startR) / step // 总差值\r\n const sG = (endG - startG) / step\r\n const sB = (endB - startB) / step\r\n const colorArr = []\r\n for (let i = 0; i < step; i++) {\r\n // 计算每一步的hex值\r\n let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB\r\n\t\t\t* i + startB))})`)\r\n // 确保第一个颜色值为startColor的值\r\n if (i === 0) hex = rgbToHex(startColor)\r\n // 确保最后一个颜色值为endColor的值\r\n if (i === step - 1) hex = rgbToHex(endColor)\r\n colorArr.push(hex)\r\n }\r\n return colorArr\r\n}\r\n\r\n// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)\r\nfunction hexToRgb(sColor, str = true) {\r\n const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\r\n sColor = String(sColor).toLowerCase()\r\n if (sColor && reg.test(sColor)) {\r\n if (sColor.length === 4) {\r\n let sColorNew = '#'\r\n for (let i = 1; i < 4; i += 1) {\r\n sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))\r\n }\r\n sColor = sColorNew\r\n }\r\n // 处理六位的颜色值\r\n const sColorChange = []\r\n for (let i = 1; i < 7; i += 2) {\r\n sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))\r\n }\r\n if (!str) {\r\n return sColorChange\r\n }\r\n return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`\r\n } if (/^(rgb|RGB)/.test(sColor)) {\r\n const arr = sColor.replace(/(?:\\(|\\)|rgb|RGB)*/g, '').split(',')\r\n return arr.map((val) => Number(val))\r\n }\r\n return sColor\r\n}\r\n\r\n// 将rgb表示方式转换为hex表示方式\r\nfunction rgbToHex(rgb) {\r\n const _this = rgb\r\n const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\r\n if (/^(rgb|RGB)/.test(_this)) {\r\n const aColor = _this.replace(/(?:\\(|\\)|rgb|RGB)*/g, '').split(',')\r\n let strHex = '#'\r\n for (let i = 0; i < aColor.length; i++) {\r\n let hex = Number(aColor[i]).toString(16)\r\n hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位\r\n if (hex === '0') {\r\n hex += hex\r\n }\r\n strHex += hex\r\n }\r\n if (strHex.length !== 7) {\r\n strHex = _this\r\n }\r\n return strHex\r\n } if (reg.test(_this)) {\r\n const aNum = _this.replace(/#/, '').split('')\r\n if (aNum.length === 6) {\r\n return _this\r\n } if (aNum.length === 3) {\r\n let numHex = '#'\r\n for (let i = 0; i < aNum.length; i += 1) {\r\n numHex += (aNum[i] + aNum[i])\r\n }\r\n return numHex\r\n }\r\n } else {\r\n return _this\r\n }\r\n}\r\n\r\n/**\r\n* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串\r\n* sHex为传入的十六进制的色值\r\n* alpha为rgba的透明度\r\n*/\r\nfunction colorToRgba(color, alpha) {\r\n color = rgbToHex(color)\r\n // 十六进制颜色值的正则表达式\r\n const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\r\n /* 16进制颜色转为RGB格式 */\r\n let sColor = String(color).toLowerCase()\r\n if (sColor && reg.test(sColor)) {\r\n if (sColor.length === 4) {\r\n let sColorNew = '#'\r\n for (let i = 1; i < 4; i += 1) {\r\n sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))\r\n }\r\n sColor = sColorNew\r\n }\r\n // 处理六位的颜色值\r\n const sColorChange = []\r\n for (let i = 1; i < 7; i += 2) {\r\n sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))\r\n }\r\n // return sColorChange.join(',')\r\n return `rgba(${sColorChange.join(',')},${alpha})`\r\n }\r\n\r\n return sColor\r\n}\r\n\r\nexport default {\r\n colorGradient,\r\n hexToRgb,\r\n rgbToHex,\r\n colorToRgba\r\n}\r\n","/**\r\n * 验证电子邮箱格式\r\n */\r\nfunction email(value) {\r\n return /^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证手机格式\r\n */\r\nfunction mobile(value) {\r\n return /^1[23456789]\\d{9}$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证URL格式\r\n */\r\nfunction url(value) {\r\n return /^((https|http|ftp|rtsp|mms):\\/\\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\\/?)|(\\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\\/?)$/\r\n .test(value)\r\n}\r\n\r\n/**\r\n * 验证日期格式\r\n */\r\nfunction date(value) {\r\n if (!value) return false\r\n // 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳\r\n if (number(value)) value = +value\r\n return !/Invalid|NaN/.test(new Date(value).toString())\r\n}\r\n\r\n/**\r\n * 验证ISO类型的日期格式\r\n */\r\nfunction dateISO(value) {\r\n return /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证十进制数字\r\n */\r\nfunction number(value) {\r\n return /^[\\+-]?(\\d+\\.?\\d*|\\.\\d+|\\d\\.\\d+e\\+\\d+)$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证字符串\r\n */\r\nfunction string(value) {\r\n return typeof value === 'string'\r\n}\r\n\r\n/**\r\n * 验证整数\r\n */\r\nfunction digits(value) {\r\n return /^\\d+$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证身份证号码\r\n */\r\nfunction idCard(value) {\r\n return /^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/.test(\r\n value\r\n )\r\n}\r\n\r\n/**\r\n * 是否车牌号\r\n */\r\nfunction carNo(value) {\r\n // 新能源车牌\r\n const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/\r\n // 旧车牌\r\n const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/\r\n if (value.length === 7) {\r\n return creg.test(value)\r\n } if (value.length === 8) {\r\n return xreg.test(value)\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 金额,只允许2位小数\r\n */\r\nfunction amount(value) {\r\n // 金额,只允许保留两位小数\r\n return /^[1-9]\\d*(,\\d{3})*(\\.\\d{1,2})?$|^0\\.\\d{1,2}$/.test(value)\r\n}\r\n\r\n/**\r\n * 中文\r\n */\r\nfunction chinese(value) {\r\n const reg = /^[\\u4e00-\\u9fa5]+$/gi\r\n return reg.test(value)\r\n}\r\n\r\n/**\r\n * 只能输入字母\r\n */\r\nfunction letter(value) {\r\n return /^[a-zA-Z]*$/.test(value)\r\n}\r\n\r\n/**\r\n * 只能是字母或者数字\r\n */\r\nfunction enOrNum(value) {\r\n // 英文或者数字\r\n const reg = /^[0-9a-zA-Z]*$/g\r\n return reg.test(value)\r\n}\r\n\r\n/**\r\n * 验证是否包含某个值\r\n */\r\nfunction contains(value, param) {\r\n return value.indexOf(param) >= 0\r\n}\r\n\r\n/**\r\n * 验证一个值范围[min, max]\r\n */\r\nfunction range(value, param) {\r\n return value >= param[0] && value <= param[1]\r\n}\r\n\r\n/**\r\n * 验证一个长度范围[min, max]\r\n */\r\nfunction rangeLength(value, param) {\r\n return value.length >= param[0] && value.length <= param[1]\r\n}\r\n\r\n/**\r\n * 是否固定电话\r\n */\r\nfunction landline(value) {\r\n const reg = /^\\d{3,4}-\\d{7,8}(-\\d{3,4})?$/\r\n return reg.test(value)\r\n}\r\n\r\n/**\r\n * 判断是否为空\r\n */\r\nfunction empty(value) {\r\n switch (typeof value) {\r\n case 'undefined':\r\n return true\r\n case 'string':\r\n if (value.replace(/(^[ \\t\\n\\r]*)|([ \\t\\n\\r]*$)/g, '').length == 0) return true\r\n break\r\n case 'boolean':\r\n if (!value) return true\r\n break\r\n case 'number':\r\n if (value === 0 || isNaN(value)) return true\r\n break\r\n case 'object':\r\n if (value === null || value.length === 0) return true\r\n for (const i in value) {\r\n return false\r\n }\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 是否json字符串\r\n */\r\nfunction jsonString(value) {\r\n if (typeof value === 'string') {\r\n try {\r\n const obj = JSON.parse(value)\r\n if (typeof obj === 'object' && obj) {\r\n return true\r\n }\r\n return false\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 是否数组\r\n */\r\nfunction array(value) {\r\n if (typeof Array.isArray === 'function') {\r\n return Array.isArray(value)\r\n }\r\n return Object.prototype.toString.call(value) === '[object Array]'\r\n}\r\n\r\n/**\r\n * 是否对象\r\n */\r\nfunction object(value) {\r\n return Object.prototype.toString.call(value) === '[object Object]'\r\n}\r\n\r\n/**\r\n * 是否短信验证码\r\n */\r\nfunction code(value, len = 6) {\r\n return new RegExp(`^\\\\d{${len}}$`).test(value)\r\n}\r\n\r\n/**\r\n * 是否函数方法\r\n * @param {Object} value\r\n */\r\nfunction func(value) {\r\n return typeof value === 'function'\r\n}\r\n\r\n/**\r\n * 是否promise对象\r\n * @param {Object} value\r\n */\r\nfunction promise(value) {\r\n return object(value) && func(value.then) && func(value.catch)\r\n}\r\n\r\n/** 是否图片格式\r\n * @param {Object} value\r\n */\r\nfunction image(value) {\r\n const newValue = value.split('?')[0]\r\n const IMAGE_REGEXP = /\\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i\r\n return IMAGE_REGEXP.test(newValue)\r\n}\r\n\r\n/**\r\n * 是否视频格式\r\n * @param {Object} value\r\n */\r\nfunction video(value) {\r\n const VIDEO_REGEXP = /\\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i\r\n return VIDEO_REGEXP.test(value)\r\n}\r\n\r\n/**\r\n * 是否为正则对象\r\n * @param {Object}\r\n * @return {Boolean}\r\n */\r\nfunction regExp(o) {\r\n return o && Object.prototype.toString.call(o) === '[object RegExp]'\r\n}\r\n\r\nexport default {\r\n email,\r\n mobile,\r\n url,\r\n date,\r\n dateISO,\r\n number,\r\n digits,\r\n idCard,\r\n carNo,\r\n amount,\r\n chinese,\r\n letter,\r\n enOrNum,\r\n contains,\r\n range,\r\n rangeLength,\r\n empty,\r\n isEmpty: empty,\r\n jsonString,\r\n landline,\r\n object,\r\n array,\r\n code,\r\n func,\r\n promise,\r\n video,\r\n image,\r\n regExp,\r\n string\r\n}\r\n","let timeout = null\r\n\r\n/**\r\n * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数\r\n *\r\n * @param {Function} func 要执行的回调函数\r\n * @param {Number} wait 延时的时间\r\n * @param {Boolean} immediate 是否立即执行\r\n * @return null\r\n */\r\nfunction debounce(func, wait = 500, immediate = false) {\r\n // 清除定时器\r\n if (timeout !== null) clearTimeout(timeout)\r\n // 立即执行,此类情况一般用不到\r\n if (immediate) {\r\n const callNow = !timeout\r\n timeout = setTimeout(() => {\r\n timeout = null\r\n }, wait)\r\n if (callNow) typeof func === 'function' && func()\r\n } else {\r\n // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法\r\n timeout = setTimeout(() => {\r\n typeof func === 'function' && func()\r\n }, wait)\r\n }\r\n}\r\n\r\nexport default debounce\r\n","let timer; let\r\n flag\r\n/**\r\n * 节流原理:在一定时间内,只能触发一次\r\n *\r\n * @param {Function} func 要执行的回调函数\r\n * @param {Number} wait 延时的时间\r\n * @param {Boolean} immediate 是否立即执行\r\n * @return null\r\n */\r\nfunction throttle(func, wait = 500, immediate = true) {\r\n if (immediate) {\r\n if (!flag) {\r\n flag = true\r\n // 如果是立即执行,则在wait毫秒内开始时执行\r\n typeof func === 'function' && func()\r\n timer = setTimeout(() => {\r\n flag = false\r\n }, wait)\r\n }\r\n } else if (!flag) {\r\n flag = true\r\n // 如果是非立即执行,则在wait毫秒内的结束处执行\r\n timer = setTimeout(() => {\r\n flag = false\r\n typeof func === 'function' && func()\r\n }, wait)\r\n }\r\n}\r\nexport default throttle\r\n","import test from './test.js'\r\nimport { round } from './digit.js'\r\n/**\r\n * @description 如果value小于min,取min;如果value大于max,取max\r\n * @param {number} min \r\n * @param {number} max \r\n * @param {number} value\r\n */\r\nfunction range(min = 0, max = 0, value = 0) {\r\n\treturn Math.max(min, Math.min(max, Number(value)))\r\n}\r\n\r\n/**\r\n * @description 用于获取用户传递值的px值 如果用户传递了\"xxpx\"或者\"xxrpx\",取出其数值部分,如果是\"xxxrpx\"还需要用过uni.upx2px进行转换\r\n * @param {number|string} value 用户传递值的px值\r\n * @param {boolean} unit \r\n * @returns {number|string}\r\n */\r\nfunction getPx(value, unit = false) {\r\n\tif (test.number(value)) {\r\n\t\treturn unit ? `${value}px` : Number(value)\r\n\t}\r\n\t// 如果带有rpx,先取出其数值部分,再转为px值\r\n\tif (/(rpx|upx)$/.test(value)) {\r\n\t\treturn unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))\r\n\t}\r\n\treturn unit ? `${parseInt(value)}px` : parseInt(value)\r\n}\r\n\r\n/**\r\n * @description 进行延时,以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms\r\n * @param {number} value 堵塞时间 单位ms 毫秒\r\n * @returns {Promise} 返回promise\r\n */\r\nfunction sleep(value = 30) {\r\n\treturn new Promise((resolve) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tresolve()\r\n\t\t}, value)\r\n\t})\r\n}\r\n/**\r\n * @description 运行期判断平台\r\n * @returns {string} 返回所在平台(小写) \r\n * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台\r\n */\r\nfunction os() {\r\n\treturn uni.getSystemInfoSync().platform.toLowerCase()\r\n}\r\n/**\r\n * @description 获取系统信息同步接口\r\n * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync \r\n */\r\nfunction sys() {\r\n\treturn uni.getSystemInfoSync()\r\n}\r\n\r\n/**\r\n * @description 取一个区间数\r\n * @param {Number} min 最小值\r\n * @param {Number} max 最大值\r\n */\r\nfunction random(min, max) {\r\n\tif (min >= 0 && max > 0 && max >= min) {\r\n\t\tconst gab = max - min + 1\r\n\t\treturn Math.floor(Math.random() * gab + min)\r\n\t}\r\n\treturn 0\r\n}\r\n\r\n/**\r\n * @param {Number} len uuid的长度\r\n * @param {Boolean} firstU 将返回的首字母置为\"u\"\r\n * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制\r\n */\r\nfunction guid(len = 32, firstU = true, radix = null) {\r\n\tconst chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')\r\n\tconst uuid = []\r\n\tradix = radix || chars.length\r\n\r\n\tif (len) {\r\n\t\t// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位\r\n\t\tfor (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]\r\n\t} else {\r\n\t\tlet r\r\n\t\t// rfc4122标准要求返回的uuid中,某些位为固定的字符\r\n\t\tuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'\r\n\t\tuuid[14] = '4'\r\n\r\n\t\tfor (let i = 0; i < 36; i++) {\r\n\t\t\tif (!uuid[i]) {\r\n\t\t\t\tr = 0 | Math.random() * 16\r\n\t\t\t\tuuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class\r\n\tif (firstU) {\r\n\t\tuuid.shift()\r\n\t\treturn `u${uuid.join('')}`\r\n\t}\r\n\treturn uuid.join('')\r\n}\r\n\r\n/**\r\n* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法\r\n this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx\r\n 这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name\r\n 值(默认为undefined),就是查找最顶层的$parent\r\n* @param {string|undefined} name 父组件的参数名\r\n*/\r\nfunction $parent(name = undefined) {\r\n\tlet parent = this.$parent\r\n\t// 通过while历遍,这里主要是为了H5需要多层解析的问题\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options && parent.$options.name !== name) {\r\n\t\t\t// 如果组件的name不相等,继续上一级寻找\r\n\t\t\tparent = parent.$parent\r\n\t\t} else {\r\n\t\t\treturn parent\r\n\t\t}\r\n\t}\r\n\treturn false\r\n}\r\n\r\n/**\r\n * @description 样式转换\r\n * 对象转字符串,或者字符串转对象\r\n * @param {object | string} customStyle 需要转换的目标\r\n * @param {String} target 转换的目的,object-转为对象,string-转为字符串\r\n * @returns {object|string}\r\n */\r\nfunction addStyle(customStyle, target = 'object') {\r\n\t// 字符串转字符串,对象转对象情形,直接返回\r\n\tif (test.empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&\r\n\t\ttypeof(customStyle) === 'string') {\r\n\t\treturn customStyle\r\n\t}\r\n\t// 字符串转对象\r\n\tif (target === 'object') {\r\n\t\t// 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的\r\n\t\tcustomStyle = trim(customStyle)\r\n\t\t// 根据\";\"将字符串转为数组形式\r\n\t\tconst styleArray = customStyle.split(';')\r\n\t\tconst style = {}\r\n\t\t// 历遍数组,拼接成对象\r\n\t\tfor (let i = 0; i < styleArray.length; i++) {\r\n\t\t\t// 'font-size:20px;color:red;',如此最后字符串有\";\"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤\r\n\t\t\tif (styleArray[i]) {\r\n\t\t\t\tconst item = styleArray[i].split(':')\r\n\t\t\t\tstyle[trim(item[0])] = trim(item[1])\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn style\r\n\t}\r\n\t// 这里为对象转字符串形式\r\n\tlet string = ''\r\n\tfor (const i in customStyle) {\r\n\t\t// 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名\r\n\t\tconst key = i.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n\t\tstring += `${key}:${customStyle[i]};`\r\n\t}\r\n\t// 去除两端空格\r\n\treturn trim(string)\r\n}\r\n\r\n/**\r\n * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾\r\n * @param {string|number} value 需要添加单位的值\r\n * @param {string} unit 添加的单位名 比如px\r\n */\r\nfunction addUnit(value = 'auto', unit = uni?.$u?.config?.unit ?? 'px') {\r\n\tvalue = String(value)\r\n\t// 用uView内置验证规则中的number判断是否为数值\r\n\treturn test.number(value) ? `${value}${unit}` : value\r\n}\r\n\r\n/**\r\n * @description 深度克隆\r\n * @param {object} obj 需要深度克隆的对象\r\n * @returns {*} 克隆后的对象或者原值(不是对象)\r\n */\r\nfunction deepClone(obj) {\r\n\t// 对常见的“非”值,直接返回原来值\r\n\tif ([null, undefined, NaN, false].includes(obj)) return obj\r\n\tif (typeof obj !== 'object' && typeof obj !== 'function') {\r\n\t\t// 原始类型直接返回\r\n\t\treturn obj\r\n\t}\r\n\tconst o = test.array(obj) ? [] : {}\r\n\tfor (const i in obj) {\r\n\t\tif (obj.hasOwnProperty(i)) {\r\n\t\t\to[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]\r\n\t\t}\r\n\t}\r\n\treturn o\r\n}\r\n\r\n/**\r\n * @description JS对象深度合并\r\n * @param {object} target 需要拷贝的对象\r\n * @param {object} source 拷贝的来源对象\r\n * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)\r\n */\r\nfunction deepMerge(target = {}, source = {}) {\r\n\ttarget = deepClone(target)\r\n\tif (typeof target !== 'object' || typeof source !== 'object') return false\r\n\tfor (const prop in source) {\r\n\t\tif (!source.hasOwnProperty(prop)) continue\r\n\t\tif (prop in target) {\r\n\t\t\tif (typeof target[prop] !== 'object') {\r\n\t\t\t\ttarget[prop] = source[prop]\r\n\t\t\t} else if (typeof source[prop] !== 'object') {\r\n\t\t\t\ttarget[prop] = source[prop]\r\n\t\t\t} else if (target[prop].concat && source[prop].concat) {\r\n\t\t\t\ttarget[prop] = target[prop].concat(source[prop])\r\n\t\t\t} else {\r\n\t\t\t\ttarget[prop] = deepMerge(target[prop], source[prop])\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttarget[prop] = source[prop]\r\n\t\t}\r\n\t}\r\n\treturn target\r\n}\r\n\r\n/**\r\n * @description error提示\r\n * @param {*} err 错误内容\r\n */\r\nfunction error(err) {\r\n\t// 开发环境才提示,生产环境不会提示\r\n\tif (process.env.NODE_ENV === 'development') {\r\n\t\tconsole.error(`uView提示:${err}`)\r\n\t}\r\n}\r\n\r\n/**\r\n * @description 打乱数组\r\n * @param {array} array 需要打乱的数组\r\n * @returns {array} 打乱后的数组\r\n */\r\nfunction randomArray(array = []) {\r\n\t// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0\r\n\treturn array.sort(() => Math.random() - 0.5)\r\n}\r\n\r\n// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序\r\n// 所以这里做一个兼容polyfill的兼容处理\r\nif (!String.prototype.padStart) {\r\n\t// 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解\r\n\tString.prototype.padStart = function(maxLength, fillString = ' ') {\r\n\t\tif (Object.prototype.toString.call(fillString) !== '[object String]') {\r\n\t\t\tthrow new TypeError(\r\n\t\t\t\t'fillString must be String'\r\n\t\t\t)\r\n\t\t}\r\n\t\tconst str = this\r\n\t\t// 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉\r\n\t\tif (str.length >= maxLength) return String(str)\r\n\r\n\t\tconst fillLength = maxLength - str.length\r\n\t\tlet times = Math.ceil(fillLength / fillString.length)\r\n\t\twhile (times >>= 1) {\r\n\t\t\tfillString += fillString\r\n\t\t\tif (times === 1) {\r\n\t\t\t\tfillString += fillString\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn fillString.slice(0, fillLength) + str\r\n\t}\r\n}\r\n\r\n/**\r\n * @description 格式化时间\r\n * @param {String|Number} dateTime 需要格式化的时间戳\r\n * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd\r\n * @returns {string} 返回格式化后的字符串\r\n */\r\n function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {\r\n let date\r\n\t// 若传入时间为假值,则取当前时间\r\n if (!dateTime) {\r\n date = new Date()\r\n }\r\n // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)\r\n else if (/^\\d{10}$/.test(dateTime?.toString().trim())) {\r\n date = new Date(dateTime * 1000)\r\n }\r\n // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容\r\n else if (typeof dateTime === 'string' && /^\\d+$/.test(dateTime.trim())) {\r\n date = new Date(Number(dateTime))\r\n }\r\n // 其他都认为符合 RFC 2822 规范\r\n else {\r\n // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间\r\n date = new Date(\r\n typeof dateTime === 'string'\r\n ? dateTime.replace(/-/g, '/')\r\n : dateTime\r\n )\r\n }\r\n\r\n\tconst timeSource = {\r\n\t\t'y': date.getFullYear().toString(), // 年\r\n\t\t'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月\r\n\t\t'd': date.getDate().toString().padStart(2, '0'), // 日\r\n\t\t'h': date.getHours().toString().padStart(2, '0'), // 时\r\n\t\t'M': date.getMinutes().toString().padStart(2, '0'), // 分\r\n\t\t's': date.getSeconds().toString().padStart(2, '0') // 秒\r\n\t\t// 有其他格式化字符需求可以继续添加,必须转化成字符串\r\n\t}\r\n\r\n for (const key in timeSource) {\r\n const [ret] = new RegExp(`${key}+`).exec(formatStr) || []\r\n if (ret) {\r\n // 年可能只需展示两位\r\n const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0\r\n formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))\r\n }\r\n }\r\n\r\n return formatStr\r\n}\r\n\r\n/**\r\n * @description 时间戳转为多久之前\r\n * @param {String|Number} timestamp 时间戳\r\n * @param {String|Boolean} format \r\n * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式;\r\n * 如果为布尔值false,无论什么时间,都返回多久以前的格式\r\n * @returns {string} 转化后的内容\r\n */\r\nfunction timeFrom(timestamp = null, format = 'yyyy-mm-dd') {\r\n\tif (timestamp == null) timestamp = Number(new Date())\r\n\ttimestamp = parseInt(timestamp)\r\n\t// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)\r\n\tif (timestamp.toString().length == 10) timestamp *= 1000\r\n\tlet timer = (new Date()).getTime() - timestamp\r\n\ttimer = parseInt(timer / 1000)\r\n\t// 如果小于5分钟,则返回\"刚刚\",其他以此类推\r\n\tlet tips = ''\r\n\tswitch (true) {\r\n\t\tcase timer < 300:\r\n\t\t\ttips = '刚刚'\r\n\t\t\tbreak\r\n\t\tcase timer >= 300 && timer < 3600:\r\n\t\t\ttips = `${parseInt(timer / 60)}分钟前`\r\n\t\t\tbreak\r\n\t\tcase timer >= 3600 && timer < 86400:\r\n\t\t\ttips = `${parseInt(timer / 3600)}小时前`\r\n\t\t\tbreak\r\n\t\tcase timer >= 86400 && timer < 2592000:\r\n\t\t\ttips = `${parseInt(timer / 86400)}天前`\r\n\t\t\tbreak\r\n\t\tdefault:\r\n\t\t\t// 如果format为false,则无论什么时间戳,都显示xx之前\r\n\t\t\tif (format === false) {\r\n\t\t\t\tif (timer >= 2592000 && timer < 365 * 86400) {\r\n\t\t\t\t\ttips = `${parseInt(timer / (86400 * 30))}个月前`\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttips = `${parseInt(timer / (86400 * 365))}年前`\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttips = timeFormat(timestamp, format)\r\n\t\t\t}\r\n\t}\r\n\treturn tips\r\n}\r\n\r\n/**\r\n * @description 去除空格\r\n * @param String str 需要去除空格的字符串\r\n * @param String pos both(左右)|left|right|all 默认both\r\n */\r\nfunction trim(str, pos = 'both') {\r\n\tstr = String(str)\r\n\tif (pos == 'both') {\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, '')\r\n\t}\r\n\tif (pos == 'left') {\r\n\t\treturn str.replace(/^\\s*/, '')\r\n\t}\r\n\tif (pos == 'right') {\r\n\t\treturn str.replace(/(\\s*$)/g, '')\r\n\t}\r\n\tif (pos == 'all') {\r\n\t\treturn str.replace(/\\s+/g, '')\r\n\t}\r\n\treturn str\r\n}\r\n\r\n/**\r\n * @description 对象转url参数\r\n * @param {object} data,对象\r\n * @param {Boolean} isPrefix,是否自动加上\"?\"\r\n * @param {string} arrayFormat 规则 indices|brackets|repeat|comma\r\n */\r\nfunction queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {\r\n\tconst prefix = isPrefix ? '?' : ''\r\n\tconst _result = []\r\n\tif (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'\r\n\tfor (const key in data) {\r\n\t\tconst value = data[key]\r\n\t\t// 去掉为空的参数\r\n\t\tif (['', undefined, null].indexOf(value) >= 0) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\t\t// 如果值为数组,另行处理\r\n\t\tif (value.constructor === Array) {\r\n\t\t\t// e.g. {ids: [1, 2, 3]}\r\n\t\t\tswitch (arrayFormat) {\r\n\t\t\t\tcase 'indices':\r\n\t\t\t\t\t// 结果: ids[0]=1&ids[1]=2&ids[2]=3\r\n\t\t\t\t\tfor (let i = 0; i < value.length; i++) {\r\n\t\t\t\t\t\t_result.push(`${key}[${i}]=${value[i]}`)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase 'brackets':\r\n\t\t\t\t\t// 结果: ids[]=1&ids[]=2&ids[]=3\r\n\t\t\t\t\tvalue.forEach((_value) => {\r\n\t\t\t\t\t\t_result.push(`${key}[]=${_value}`)\r\n\t\t\t\t\t})\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase 'repeat':\r\n\t\t\t\t\t// 结果: ids=1&ids=2&ids=3\r\n\t\t\t\t\tvalue.forEach((_value) => {\r\n\t\t\t\t\t\t_result.push(`${key}=${_value}`)\r\n\t\t\t\t\t})\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase 'comma':\r\n\t\t\t\t\t// 结果: ids=1,2,3\r\n\t\t\t\t\tlet commaStr = ''\r\n\t\t\t\t\tvalue.forEach((_value) => {\r\n\t\t\t\t\t\tcommaStr += (commaStr ? ',' : '') + _value\r\n\t\t\t\t\t})\r\n\t\t\t\t\t_result.push(`${key}=${commaStr}`)\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tvalue.forEach((_value) => {\r\n\t\t\t\t\t\t_result.push(`${key}[]=${_value}`)\r\n\t\t\t\t\t})\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t_result.push(`${key}=${value}`)\r\n\t\t}\r\n\t}\r\n\treturn _result.length ? prefix + _result.join('&') : ''\r\n}\r\n\r\n/**\r\n * 显示消息提示框\r\n * @param {String} title 提示的内容,长度与 icon 取值有关。\r\n * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000\r\n */\r\nfunction toast(title, duration = 2000) {\r\n\tuni.showToast({\r\n\t\ttitle: String(title),\r\n\t\ticon: 'none',\r\n\t\tduration\r\n\t})\r\n}\r\n\r\n/**\r\n * @description 根据主题type值,获取对应的图标\r\n * @param {String} type 主题名称,primary|info|error|warning|success\r\n * @param {boolean} fill 是否使用fill填充实体的图标\r\n */\r\nfunction type2icon(type = 'success', fill = false) {\r\n\t// 如果非预置值,默认为success\r\n\tif (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'\r\n\tlet iconName = ''\r\n\t// 目前(2019-12-12),info和primary使用同一个图标\r\n\tswitch (type) {\r\n\t\tcase 'primary':\r\n\t\t\ticonName = 'info-circle'\r\n\t\t\tbreak\r\n\t\tcase 'info':\r\n\t\t\ticonName = 'info-circle'\r\n\t\t\tbreak\r\n\t\tcase 'error':\r\n\t\t\ticonName = 'close-circle'\r\n\t\t\tbreak\r\n\t\tcase 'warning':\r\n\t\t\ticonName = 'error-circle'\r\n\t\t\tbreak\r\n\t\tcase 'success':\r\n\t\t\ticonName = 'checkmark-circle'\r\n\t\t\tbreak\r\n\t\tdefault:\r\n\t\t\ticonName = 'checkmark-circle'\r\n\t}\r\n\t// 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的\r\n\tif (fill) iconName += '-fill'\r\n\treturn iconName\r\n}\r\n\r\n/**\r\n * @description 数字格式化\r\n * @param {number|string} number 要格式化的数字\r\n * @param {number} decimals 保留几位小数\r\n * @param {string} decimalPoint 小数点符号\r\n * @param {string} thousandsSeparator 千分位符号\r\n * @returns {string} 格式化后的数字\r\n */\r\nfunction priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {\r\n\tnumber = (`${number}`).replace(/[^0-9+-Ee.]/g, '')\r\n\tconst n = !isFinite(+number) ? 0 : +number\r\n\tconst prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)\r\n\tconst sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator\r\n\tconst dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint\r\n\tlet s = ''\r\n\r\n\ts = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')\r\n\tconst re = /(-?\\d+)(\\d{3})/\r\n\twhile (re.test(s[0])) {\r\n\t\ts[0] = s[0].replace(re, `$1${sep}$2`)\r\n\t}\r\n\t\r\n\tif ((s[1] || '').length < prec) {\r\n\t\ts[1] = s[1] || ''\r\n\t\ts[1] += new Array(prec - s[1].length + 1).join('0')\r\n\t}\r\n\treturn s.join(dec)\r\n}\r\n\r\n/**\r\n * @description 获取duration值\r\n * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位\r\n * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画\r\n * @param {String|number} value 比如: \"1s\"|\"100ms\"|1|100\r\n * @param {boolean} unit 提示: 如果是false 默认返回number\r\n * @return {string|number} \r\n */\r\nfunction getDuration(value, unit = true) {\r\n\tconst valueNum = parseInt(value)\r\n\tif (unit) {\r\n\t\tif (/s$/.test(value)) return value\r\n\t\treturn value > 30 ? `${value}ms` : `${value}s`\r\n\t}\r\n\tif (/ms$/.test(value)) return valueNum\r\n\tif (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000\r\n\treturn valueNum\r\n}\r\n\r\n/**\r\n * @description 日期的月或日补零操作\r\n * @param {String} value 需要补零的值\r\n */\r\nfunction padZero(value) {\r\n\treturn `00${value}`.slice(-2)\r\n}\r\n\r\n/**\r\n * @description 在u-form的子组件内容发生变化,或者失去焦点时,尝试通知u-form执行校验方法\r\n * @param {*} instance\r\n * @param {*} event\r\n */\r\nfunction formValidate(instance, event) {\r\n\tconst formItem = uni.$u.$parent.call(instance, 'u-form-item')\r\n\tconst form = uni.$u.$parent.call(instance, 'u-form')\r\n\t// 如果发生变化的input或者textarea等,其父组件中有u-form-item或者u-form等,就执行form的validate方法\r\n\t// 同时将form-item的pros传递给form,让其进行精确对象验证\r\n\tif (formItem && form) {\r\n\t\tform.validateField(formItem.prop, () => {}, event)\r\n\t}\r\n}\r\n\r\n/**\r\n * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式\r\n * @param {object} obj 对象\r\n * @param {string} key 需要获取的属性字段\r\n * @returns {*}\r\n */\r\nfunction getProperty(obj, key) {\r\n\tif (!obj) {\r\n\t\treturn\r\n\t}\r\n\tif (typeof key !== 'string' || key === '') {\r\n\t\treturn ''\r\n\t}\r\n\tif (key.indexOf('.') !== -1) {\r\n\t\tconst keys = key.split('.')\r\n\t\tlet firstObj = obj[keys[0]] || {}\r\n\r\n\t\tfor (let i = 1; i < keys.length; i++) {\r\n\t\t\tif (firstObj) {\r\n\t\t\t\tfirstObj = firstObj[keys[i]]\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn firstObj\r\n\t}\r\n\treturn obj[key]\r\n}\r\n\r\n/**\r\n * @description 设置对象的属性值,如果'a.b.c'的形式进行设置\r\n * @param {object} obj 对象\r\n * @param {string} key 需要设置的属性\r\n * @param {string} value 设置的值\r\n */\r\nfunction setProperty(obj, key, value) {\r\n\tif (!obj) {\r\n\t\treturn\r\n\t}\r\n\t// 递归赋值\r\n\tconst inFn = function(_obj, keys, v) {\r\n\t\t// 最后一个属性key\r\n\t\tif (keys.length === 1) {\r\n\t\t\t_obj[keys[0]] = v\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// 0~length-1个key\r\n\t\twhile (keys.length > 1) {\r\n\t\t\tconst k = keys[0]\r\n\t\t\tif (!_obj[k] || (typeof _obj[k] !== 'object')) {\r\n\t\t\t\t_obj[k] = {}\r\n\t\t\t}\r\n\t\t\tconst key = keys.shift()\r\n\t\t\t// 自调用判断是否存在属性,不存在则自动创建对象\r\n\t\t\tinFn(_obj[k], keys, v)\r\n\t\t}\r\n\t}\r\n\r\n\tif (typeof key !== 'string' || key === '') {\r\n\r\n\t} else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作\r\n\t\tconst keys = key.split('.')\r\n\t\tinFn(obj, keys, value)\r\n\t} else {\r\n\t\tobj[key] = value\r\n\t}\r\n}\r\n\r\n/**\r\n * @description 获取当前页面路径\r\n */\r\nfunction page() {\r\n\tconst pages = getCurrentPages()\r\n\t// 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组\r\n\treturn `/${pages[pages.length - 1]?.route ?? ''}`\r\n}\r\n\r\n/**\r\n * @description 获取当前路由栈实例数组\r\n */\r\nfunction pages() {\r\n\tconst pages = getCurrentPages()\r\n\treturn pages\r\n}\r\n\r\n/**\r\n * @description 修改uView内置属性值\r\n * @param {object} props 修改内置props属性\r\n * @param {object} config 修改内置config属性\r\n * @param {object} color 修改内置color属性\r\n * @param {object} zIndex 修改内置zIndex属性\r\n */\r\nfunction setConfig({\r\n\tprops = {},\r\n\tconfig = {},\r\n\tcolor = {},\r\n\tzIndex = {}\r\n}) {\r\n\tconst {\r\n\t\tdeepMerge,\r\n\t} = uni.$u\r\n\tuni.$u.config = deepMerge(uni.$u.config, config)\r\n\tuni.$u.props = deepMerge(uni.$u.props, props)\r\n\tuni.$u.color = deepMerge(uni.$u.color, color)\r\n\tuni.$u.zIndex = deepMerge(uni.$u.zIndex, zIndex)\r\n}\r\n\r\nexport default {\r\n\trange,\r\n\tgetPx,\r\n\tsleep,\r\n\tos,\r\n\tsys,\r\n\trandom,\r\n\tguid,\r\n\t$parent,\r\n\taddStyle,\r\n\taddUnit,\r\n\tdeepClone,\r\n\tdeepMerge,\r\n\terror,\r\n\trandomArray,\r\n\ttimeFormat,\r\n\ttimeFrom,\r\n\ttrim,\r\n\tqueryParams,\r\n\ttoast,\r\n\ttype2icon,\r\n\tpriceFormat,\r\n\tgetDuration,\r\n\tpadZero,\r\n\tformValidate,\r\n\tgetProperty,\r\n\tsetProperty,\r\n\tpage,\r\n\tpages,\r\n\tsetConfig\r\n}\r\n","let _boundaryCheckingState = true; // 是否进行越界检查的全局开关\r\n\r\n/**\r\n * 把错误的数据转正\r\n * @private\r\n * @example strip(0.09999999999999998)=0.1\r\n */\r\nfunction strip(num, precision = 15) {\r\n return +parseFloat(Number(num).toPrecision(precision));\r\n}\r\n\r\n/**\r\n * Return digits length of a number\r\n * @private\r\n * @param {*number} num Input number\r\n */\r\nfunction digitLength(num) {\r\n // Get digit length of e\r\n const eSplit = num.toString().split(/[eE]/);\r\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\r\n return len > 0 ? len : 0;\r\n}\r\n\r\n/**\r\n * 把小数转成整数,如果是小数则放大成整数\r\n * @private\r\n * @param {*number} num 输入数\r\n */\r\nfunction float2Fixed(num) {\r\n if (num.toString().indexOf('e') === -1) {\r\n return Number(num.toString().replace('.', ''));\r\n }\r\n const dLen = digitLength(num);\r\n return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);\r\n}\r\n\r\n/**\r\n * 检测数字是否越界,如果越界给出提示\r\n * @private\r\n * @param {*number} num 输入数\r\n */\r\nfunction checkBoundary(num) {\r\n if (_boundaryCheckingState) {\r\n if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {\r\n console.warn(`${num} 超出了精度限制,结果可能不正确`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 把递归操作扁平迭代化\r\n * @param {number[]} arr 要操作的数字数组\r\n * @param {function} operation 迭代操作\r\n * @private\r\n */\r\nfunction iteratorOperation(arr, operation) {\r\n const [num1, num2, ...others] = arr;\r\n let res = operation(num1, num2);\r\n\r\n others.forEach((num) => {\r\n res = operation(res, num);\r\n });\r\n\r\n return res;\r\n}\r\n\r\n/**\r\n * 高精度乘法\r\n * @export\r\n */\r\nexport function times(...nums) {\r\n if (nums.length > 2) {\r\n return iteratorOperation(nums, times);\r\n }\r\n\r\n const [num1, num2] = nums;\r\n const num1Changed = float2Fixed(num1);\r\n const num2Changed = float2Fixed(num2);\r\n const baseNum = digitLength(num1) + digitLength(num2);\r\n const leftValue = num1Changed * num2Changed;\r\n\r\n checkBoundary(leftValue);\r\n\r\n return leftValue / Math.pow(10, baseNum);\r\n}\r\n\r\n/**\r\n * 高精度加法\r\n * @export\r\n */\r\nexport function plus(...nums) {\r\n if (nums.length > 2) {\r\n return iteratorOperation(nums, plus);\r\n }\r\n\r\n const [num1, num2] = nums;\r\n // 取最大的小数位\r\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n // 把小数都转为整数然后再计算\r\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\r\n}\r\n\r\n/**\r\n * 高精度减法\r\n * @export\r\n */\r\nexport function minus(...nums) {\r\n if (nums.length > 2) {\r\n return iteratorOperation(nums, minus);\r\n }\r\n\r\n const [num1, num2] = nums;\r\n const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\r\n}\r\n\r\n/**\r\n * 高精度除法\r\n * @export\r\n */\r\nexport function divide(...nums) {\r\n if (nums.length > 2) {\r\n return iteratorOperation(nums, divide);\r\n }\r\n\r\n const [num1, num2] = nums;\r\n const num1Changed = float2Fixed(num1);\r\n const num2Changed = float2Fixed(num2);\r\n checkBoundary(num1Changed);\r\n checkBoundary(num2Changed);\r\n // 重要,这里必须用strip进行修正\r\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\r\n}\r\n\r\n/**\r\n * 四舍五入\r\n * @export\r\n */\r\nexport function round(num, ratio) {\r\n const base = Math.pow(10, ratio);\r\n let result = divide(Math.round(Math.abs(times(num, base))), base);\r\n if (num < 0 && result !== 0) {\r\n result = times(result, -1);\r\n }\r\n // 位数不足则补0\r\n return result;\r\n}\r\n\r\n/**\r\n * 是否进行边界检查,默认开启\r\n * @param flag 标记开关,true 为开启,false 为关闭,默认为 true\r\n * @export\r\n */\r\nexport function enableBoundaryChecking(flag = true) {\r\n _boundaryCheckingState = flag;\r\n}\r\n\r\n\r\nexport default {\r\n times,\r\n plus,\r\n minus,\r\n divide,\r\n round,\r\n enableBoundaryChecking,\r\n};\r\n\r\n","var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArray = require(\"./iterableToArray.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n}\nmodule.exports = _toArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// 此版本发布于2022-06-17\r\nconst version = '2.0.33'\r\n\r\n// 开发环境才提示,生产环境不会提示\r\nexport default {\r\n v: version,\r\n version,\r\n // 主题名称\r\n type: [\r\n 'primary',\r\n 'success',\r\n 'info',\r\n 'error',\r\n 'warning'\r\n ],\r\n // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持\r\n color: {\r\n 'u-primary': '#2979ff',\r\n 'u-warning': '#ff9900',\r\n 'u-success': '#19be6b',\r\n 'u-error': '#fa3534',\r\n 'u-info': '#909399',\r\n 'u-main-color': '#303133',\r\n 'u-content-color': '#606266',\r\n 'u-tips-color': '#909399',\r\n 'u-light-color': '#c0c4cc'\r\n },\r\n // 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx\r\n unit: 'px'\r\n}\r\n","/**\r\n * 此文件的作用为统一配置所有组件的props参数\r\n * 借此用户可以全局覆盖组件的props默认值\r\n * 无需在每个引入组件的页面中都配置一次\r\n */\r\nimport config from './config'\r\n\r\nimport actionSheet from './props/actionSheet.js'\r\nimport album from './props/album.js'\r\nimport alert from './props/alert.js'\r\nimport avatar from './props/avatar'\r\nimport avatarGroup from './props/avatarGroup'\r\nimport backtop from './props/backtop'\r\nimport badge from './props/badge'\r\nimport button from './props/button'\r\nimport calendar from './props/calendar'\r\nimport carKeyboard from './props/carKeyboard'\r\nimport cell from './props/cell'\r\nimport cellGroup from './props/cellGroup'\r\nimport checkbox from './props/checkbox'\r\nimport checkboxGroup from './props/checkboxGroup'\r\nimport circleProgress from './props/circleProgress'\r\nimport code from './props/code'\r\nimport codeInput from './props/codeInput'\r\nimport col from './props/col'\r\nimport collapse from './props/collapse'\r\nimport collapseItem from './props/collapseItem'\r\nimport columnNotice from './props/columnNotice'\r\nimport countDown from './props/countDown'\r\nimport countTo from './props/countTo'\r\nimport datetimePicker from './props/datetimePicker'\r\nimport divider from './props/divider'\r\nimport empty from './props/empty'\r\nimport form from './props/form'\r\nimport formItem from './props/formItem'\r\nimport gap from './props/gap'\r\nimport grid from './props/grid'\r\nimport gridItem from './props/gridItem'\r\nimport icon from './props/icon'\r\nimport image from './props/image'\r\nimport indexAnchor from './props/indexAnchor'\r\nimport indexList from './props/indexList'\r\nimport input from './props/input'\r\nimport keyboard from './props/keyboard'\r\nimport line from './props/line'\r\nimport lineProgress from './props/lineProgress'\r\nimport link from './props/link'\r\nimport list from './props/list'\r\nimport listItem from './props/listItem'\r\nimport loadingIcon from './props/loadingIcon'\r\nimport loadingPage from './props/loadingPage'\r\nimport loadmore from './props/loadmore'\r\nimport modal from './props/modal'\r\nimport navbar from './props/navbar'\r\nimport noNetwork from './props/noNetwork'\r\nimport noticeBar from './props/noticeBar'\r\nimport notify from './props/notify'\r\nimport numberBox from './props/numberBox'\r\nimport numberKeyboard from './props/numberKeyboard'\r\nimport overlay from './props/overlay'\r\nimport parse from './props/parse'\r\nimport picker from './props/picker'\r\nimport popup from './props/popup'\r\nimport radio from './props/radio'\r\nimport radioGroup from './props/radioGroup'\r\nimport rate from './props/rate'\r\nimport readMore from './props/readMore'\r\nimport row from './props/row'\r\nimport rowNotice from './props/rowNotice'\r\nimport scrollList from './props/scrollList'\r\nimport search from './props/search'\r\nimport section from './props/section'\r\nimport skeleton from './props/skeleton'\r\nimport slider from './props/slider'\r\nimport statusBar from './props/statusBar'\r\nimport steps from './props/steps'\r\nimport stepsItem from './props/stepsItem'\r\nimport sticky from './props/sticky'\r\nimport subsection from './props/subsection'\r\nimport swipeAction from './props/swipeAction'\r\nimport swipeActionItem from './props/swipeActionItem'\r\nimport swiper from './props/swiper'\r\nimport swipterIndicator from './props/swipterIndicator'\r\nimport _switch from './props/switch'\r\nimport tabbar from './props/tabbar'\r\nimport tabbarItem from './props/tabbarItem'\r\nimport tabs from './props/tabs'\r\nimport tag from './props/tag'\r\nimport text from './props/text'\r\nimport textarea from './props/textarea'\r\nimport toast from './props/toast'\r\nimport toolbar from './props/toolbar'\r\nimport tooltip from './props/tooltip'\r\nimport transition from './props/transition'\r\nimport upload from './props/upload'\r\n\r\nconst {\r\n color\r\n} = config\r\n\r\nexport default {\r\n ...actionSheet,\r\n ...album,\r\n ...alert,\r\n ...avatar,\r\n ...avatarGroup,\r\n ...backtop,\r\n ...badge,\r\n ...button,\r\n ...calendar,\r\n ...carKeyboard,\r\n ...cell,\r\n ...cellGroup,\r\n ...checkbox,\r\n ...checkboxGroup,\r\n ...circleProgress,\r\n ...code,\r\n ...codeInput,\r\n ...col,\r\n ...collapse,\r\n ...collapseItem,\r\n ...columnNotice,\r\n ...countDown,\r\n ...countTo,\r\n ...datetimePicker,\r\n ...divider,\r\n ...empty,\r\n ...form,\r\n ...formItem,\r\n ...gap,\r\n ...grid,\r\n ...gridItem,\r\n ...icon,\r\n ...image,\r\n ...indexAnchor,\r\n ...indexList,\r\n ...input,\r\n ...keyboard,\r\n ...line,\r\n ...lineProgress,\r\n ...link,\r\n ...list,\r\n ...listItem,\r\n ...loadingIcon,\r\n ...loadingPage,\r\n ...loadmore,\r\n ...modal,\r\n ...navbar,\r\n ...noNetwork,\r\n ...noticeBar,\r\n ...notify,\r\n ...numberBox,\r\n ...numberKeyboard,\r\n ...overlay,\r\n ...parse,\r\n ...picker,\r\n ...popup,\r\n ...radio,\r\n ...radioGroup,\r\n ...rate,\r\n ...readMore,\r\n ...row,\r\n ...rowNotice,\r\n ...scrollList,\r\n ...search,\r\n ...section,\r\n ...skeleton,\r\n ...slider,\r\n ...statusBar,\r\n ...steps,\r\n ...stepsItem,\r\n ...sticky,\r\n ...subsection,\r\n ...swipeAction,\r\n ...swipeActionItem,\r\n ...swiper,\r\n ...swipterIndicator,\r\n ..._switch,\r\n ...tabbar,\r\n ...tabbarItem,\r\n ...tabs,\r\n ...tag,\r\n ...text,\r\n ...textarea,\r\n ...toast,\r\n ...toolbar,\r\n ...tooltip,\r\n ...transition,\r\n ...upload\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:44:35\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/actionSheet.js\r\n */\r\nexport default {\r\n // action-sheet组件\r\n actionSheet: {\r\n show: false,\r\n title: '',\r\n description: '',\r\n actions: () => [],\r\n index: '',\r\n cancelText: '',\r\n closeOnClickAction: true,\r\n safeAreaInsetBottom: true,\r\n openType: '',\r\n closeOnClickOverlay: true,\r\n round: 0\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:47:24\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/album.js\r\n */\r\nexport default {\r\n // album 组件\r\n album: {\r\n urls: () => [],\r\n keyName: '',\r\n singleSize: 180,\r\n multipleSize: 70,\r\n space: 6,\r\n singleMode: 'scaleToFill',\r\n multipleMode: 'aspectFill',\r\n maxCount: 9,\r\n previewFullImage: true,\r\n rowCount: 3,\r\n showMore: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:48:53\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/alert.js\r\n */\r\nexport default {\r\n // alert警告组件\r\n alert: {\r\n title: '',\r\n type: 'warning',\r\n description: '',\r\n closable: false,\r\n showIcon: false,\r\n effect: 'light',\r\n center: false,\r\n fontSize: 14\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:49:22\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatar.js\r\n */\r\nexport default {\r\n // avatar 组件\r\n avatar: {\r\n src: '',\r\n shape: 'circle',\r\n size: 40,\r\n mode: 'scaleToFill',\r\n text: '',\r\n bgColor: '#c0c4cc',\r\n color: '#ffffff',\r\n fontSize: 18,\r\n icon: '',\r\n mpAvatar: false,\r\n randomBgColor: false,\r\n defaultUrl: '',\r\n colorIndex: '',\r\n name: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:49:55\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatarGroup.js\r\n */\r\nexport default {\r\n // avatarGroup 组件\r\n avatarGroup: {\r\n urls: () => [],\r\n maxCount: 5,\r\n shape: 'circle',\r\n mode: 'scaleToFill',\r\n showMore: true,\r\n size: 40,\r\n keyName: '',\r\n gap: 0.5,\r\n\t\textraValue: 0\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:50:18\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/backtop.js\r\n */\r\nexport default {\r\n // backtop组件\r\n backtop: {\r\n mode: 'circle',\r\n icon: 'arrow-upward',\r\n text: '',\r\n duration: 100,\r\n scrollTop: 0,\r\n top: 400,\r\n bottom: 100,\r\n right: 20,\r\n zIndex: 9,\r\n iconStyle: () => ({\r\n color: '#909399',\r\n fontSize: '19px'\r\n })\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-23 19:51:50\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/badge.js\r\n */\r\nexport default {\r\n // 徽标数组件\r\n badge: {\r\n isDot: false,\r\n value: '',\r\n show: true,\r\n max: 999,\r\n type: 'error',\r\n showZero: false,\r\n bgColor: null,\r\n color: null,\r\n shape: 'circle',\r\n numberType: 'overflow',\r\n offset: () => [],\r\n inverted: false,\r\n absolute: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:51:27\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/button.js\r\n */\r\nexport default {\r\n // button组件\r\n button: {\r\n hairline: false,\r\n type: 'info',\r\n size: 'normal',\r\n shape: 'square',\r\n plain: false,\r\n disabled: false,\r\n loading: false,\r\n loadingText: '',\r\n loadingMode: 'spinner',\r\n loadingSize: 15,\r\n openType: '',\r\n formType: '',\r\n appParameter: '',\r\n hoverStopPropagation: true,\r\n lang: 'en',\r\n sessionFrom: '',\r\n sendMessageTitle: '',\r\n sendMessagePath: '',\r\n sendMessageImg: '',\r\n showMessageCard: false,\r\n dataName: '',\r\n throttleTime: 0,\r\n hoverStartTime: 0,\r\n hoverStayTime: 200,\r\n text: '',\r\n icon: '',\r\n iconColor: '',\r\n color: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:52:43\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/calendar.js\r\n */\r\nexport default {\r\n // calendar 组件\r\n calendar: {\r\n title: '日期选择',\r\n showTitle: true,\r\n showSubtitle: true,\r\n mode: 'single',\r\n startText: '开始',\r\n endText: '结束',\r\n customList: () => [],\r\n color: '#3c9cff',\r\n minDate: 0,\r\n maxDate: 0,\r\n defaultDate: null,\r\n maxCount: Number.MAX_SAFE_INTEGER, // Infinity\r\n rowHeight: 56,\r\n formatter: null,\r\n showLunar: false,\r\n showMark: true,\r\n confirmText: '确定',\r\n confirmDisabledText: '确定',\r\n show: false,\r\n closeOnClickOverlay: false,\r\n readonly: false,\r\n showConfirm: true,\r\n maxRange: Number.MAX_SAFE_INTEGER, // Infinity\r\n rangePrompt: '',\r\n showRangePrompt: true,\r\n allowSameDay: false,\r\n\t\tround: 0,\r\n\t\tmonthNum: 3\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:53:20\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/carKeyboard.js\r\n */\r\nexport default {\r\n // 车牌号键盘\r\n carKeyboard: {\r\n random: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-23 20:53:09\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/cell.js\r\n */\r\nexport default {\r\n\t// cell组件的props\r\n\tcell: {\r\n\t\tcustomClass: '',\r\n\t\ttitle: '',\r\n\t\tlabel: '',\r\n\t\tvalue: '',\r\n\t\ticon: '',\r\n\t\tdisabled: false,\r\n\t\tborder: true,\r\n\t\tcenter: false,\r\n\t\turl: '',\r\n\t\tlinkType: 'navigateTo',\r\n\t\tclickable: false,\r\n\t\tisLink: false,\r\n\t\trequired: false,\r\n\t\tarrowDirection: '',\r\n\t\ticonStyle: {},\r\n\t\trightIconStyle: {},\r\n\t\trightIcon: 'arrow-right',\r\n\t\ttitleStyle: {},\r\n\t\tsize: '',\r\n\t\tstop: true,\r\n\t\tname: ''\r\n\t}\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:54:16\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/cellGroup.js\r\n */\r\nexport default {\r\n // cell-group组件的props\r\n cellGroup: {\r\n title: '',\r\n border: true,\r\n customStyle: {}\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-23 21:06:59\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkbox.js\r\n */\r\nexport default {\r\n // checkbox组件\r\n checkbox: {\r\n name: '',\r\n shape: '',\r\n size: '',\r\n checkbox: false,\r\n disabled: '',\r\n activeColor: '',\r\n inactiveColor: '',\r\n iconSize: '',\r\n iconColor: '',\r\n label: '',\r\n labelSize: '',\r\n labelColor: '',\r\n labelDisabled: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:54:47\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkboxGroup.js\r\n */\r\nexport default {\r\n // checkbox-group组件\r\n checkboxGroup: {\r\n name: '',\r\n value: () => [],\r\n shape: 'square',\r\n disabled: false,\r\n activeColor: '#2979ff',\r\n inactiveColor: '#c8c9cc',\r\n size: 18,\r\n placement: 'row',\r\n labelSize: 14,\r\n labelColor: '#303133',\r\n labelDisabled: false,\r\n iconColor: '#ffffff',\r\n iconSize: 12,\r\n iconPlacement: 'left',\r\n borderBottom: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:55:02\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/circleProgress.js\r\n */\r\nexport default {\r\n // circleProgress 组件\r\n circleProgress: {\r\n percentage: 30\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:55:27\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/code.js\r\n */\r\n\r\nexport default {\r\n // code 组件\r\n code: {\r\n seconds: 60,\r\n startText: '获取验证码',\r\n changeText: 'X秒重新获取',\r\n endText: '重新获取',\r\n keepRunning: false,\r\n uniqueKey: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:55:58\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/codeInput.js\r\n */\r\nexport default {\r\n // codeInput 组件\r\n codeInput: {\r\n\t\tadjustPosition: true,\r\n maxlength: 6,\r\n dot: false,\r\n mode: 'box',\r\n hairline: false,\r\n space: 10,\r\n value: '',\r\n focus: false,\r\n bold: false,\r\n color: '#606266',\r\n fontSize: 18,\r\n size: 35,\r\n disabledKeyboard: false,\r\n borderColor: '#c9cacc',\r\n\t\tdisabledDot: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:56:12\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/col.js\r\n */\r\nexport default {\r\n // col 组件\r\n col: {\r\n span: 12,\r\n offset: 0,\r\n justify: 'start',\r\n align: 'stretch',\r\n textAlign: 'left'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:56:30\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapse.js\r\n */\r\nexport default {\r\n // collapse 组件\r\n collapse: {\r\n value: null,\r\n accordion: false,\r\n border: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:56:42\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapseItem.js\r\n */\r\nexport default {\r\n // collapseItem 组件\r\n collapseItem: {\r\n title: '',\r\n value: '',\r\n label: '',\r\n disabled: false,\r\n isLink: true,\r\n clickable: true,\r\n border: true,\r\n align: 'left',\r\n name: '',\r\n icon: '',\r\n duration: 300\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:57:16\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/columnNotice.js\r\n */\r\nexport default {\r\n // columnNotice 组件\r\n columnNotice: {\r\n text: '',\r\n icon: 'volume',\r\n mode: '',\r\n color: '#f9ae3d',\r\n bgColor: '#fdf6ec',\r\n fontSize: 14,\r\n speed: 80,\r\n step: false,\r\n duration: 1500,\r\n disableTouch: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:11:29\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/countDown.js\r\n */\r\nexport default {\r\n // u-count-down 计时器组件\r\n countDown: {\r\n time: 0,\r\n format: 'HH:mm:ss',\r\n autoStart: true,\r\n millisecond: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:57:32\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/countTo.js\r\n */\r\nexport default {\r\n // countTo 组件\r\n countTo: {\r\n startVal: 0,\r\n endVal: 0,\r\n duration: 2000,\r\n autoplay: true,\r\n decimals: 0,\r\n useEasing: true,\r\n decimal: '.',\r\n color: '#606266',\r\n fontSize: 22,\r\n bold: false,\r\n separator: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:57:48\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/datetimePicker.js\r\n */\r\nexport default {\r\n // datetimePicker 组件\r\n datetimePicker: {\r\n show: false,\r\n showToolbar: true,\r\n value: '',\r\n title: '',\r\n mode: 'datetime',\r\n maxDate: new Date(new Date().getFullYear() + 10, 0, 1).getTime(),\r\n minDate: new Date(new Date().getFullYear() - 10, 0, 1).getTime(),\r\n minHour: 0,\r\n maxHour: 23,\r\n minMinute: 0,\r\n maxMinute: 59,\r\n filter: null,\r\n formatter: null,\r\n loading: false,\r\n itemHeight: 44,\r\n cancelText: '取消',\r\n confirmText: '确认',\r\n cancelColor: '#909193',\r\n confirmColor: '#3c9cff',\r\n visibleItemCount: 5,\r\n closeOnClickOverlay: false,\r\n defaultIndex: () => []\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:58:03\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/divider.js\r\n */\r\nexport default {\r\n // divider组件\r\n divider: {\r\n dashed: false,\r\n hairline: true,\r\n dot: false,\r\n textPosition: 'center',\r\n text: '',\r\n textSize: 14,\r\n textColor: '#909399',\r\n lineColor: '#dcdfe6'\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:03:27\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/empty.js\r\n */\r\nexport default {\r\n // empty组件\r\n empty: {\r\n icon: '',\r\n text: '',\r\n textColor: '#c0c4cc',\r\n textSize: 14,\r\n iconColor: '#c0c4cc',\r\n iconSize: 90,\r\n mode: 'data',\r\n width: 160,\r\n height: 160,\r\n show: true,\r\n marginTop: 0\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:03:49\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/form.js\r\n */\r\nexport default {\r\n // form 组件\r\n form: {\r\n model: () => ({}),\r\n rules: () => ({}),\r\n errorType: 'message',\r\n borderBottom: true,\r\n labelPosition: 'left',\r\n labelWidth: 45,\r\n labelAlign: 'left',\r\n labelStyle: () => ({})\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:04:32\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/formItem.js\r\n */\r\nexport default {\r\n // formItem 组件\r\n formItem: {\r\n label: '',\r\n prop: '',\r\n borderBottom: '',\r\n labelWidth: '',\r\n rightIcon: '',\r\n leftIcon: '',\r\n required: false,\r\n leftIconStyle: '',\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:05:25\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/gap.js\r\n */\r\nexport default {\r\n // gap组件\r\n gap: {\r\n bgColor: 'transparent',\r\n height: 20,\r\n marginTop: 0,\r\n marginBottom: 0,\r\n customStyle: {}\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:05:57\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/grid.js\r\n */\r\nexport default {\r\n // grid组件\r\n grid: {\r\n col: 3,\r\n border: false,\r\n align: 'left'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:06:13\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/gridItem.js\r\n */\r\nexport default {\r\n // grid-item组件\r\n gridItem: {\r\n name: null,\r\n bgColor: 'transparent'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 18:00:14\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/icon.js\r\n */\r\nimport config from '../config'\r\n\r\nconst {\r\n color\r\n} = config\r\nexport default {\r\n // icon组件\r\n icon: {\r\n name: '',\r\n color: color['u-content-color'],\r\n size: '16px',\r\n bold: false,\r\n index: '',\r\n hoverClass: '',\r\n customPrefix: 'uicon',\r\n label: '',\r\n labelPos: 'right',\r\n labelSize: '15px',\r\n labelColor: color['u-content-color'],\r\n space: '3px',\r\n imgMode: '',\r\n width: '',\r\n height: '',\r\n top: 0,\r\n stop: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:01:51\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/image.js\r\n */\r\nexport default {\r\n // image组件\r\n image: {\r\n src: '',\r\n mode: 'aspectFill',\r\n width: '300',\r\n height: '225',\r\n shape: 'square',\r\n radius: 0,\r\n lazyLoad: true,\r\n showMenuByLongpress: true,\r\n loadingIcon: 'photo',\r\n errorIcon: 'error-circle',\r\n showLoading: true,\r\n showError: true,\r\n fade: true,\r\n webp: false,\r\n duration: 500,\r\n bgColor: '#f3f4f6'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:13:15\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexAnchor.js\r\n */\r\nexport default {\r\n // indexAnchor 组件\r\n indexAnchor: {\r\n text: '',\r\n color: '#606266',\r\n size: 14,\r\n bgColor: '#dedede',\r\n height: 32\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:13:35\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexList.js\r\n */\r\nexport default {\r\n // indexList 组件\r\n indexList: {\r\n inactiveColor: '#606266',\r\n activeColor: '#5677fc',\r\n indexList: () => [],\r\n sticky: true,\r\n customNavHeight: 0\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:13:55\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/input.js\r\n */\r\nexport default {\r\n\t// index 组件\r\n\tinput: {\r\n\t\tvalue: '',\r\n\t\ttype: 'text',\r\n\t\tfixed: false,\r\n\t\tdisabled: false,\r\n\t\tdisabledColor: '#f5f7fa',\r\n\t\tclearable: false,\r\n\t\tpassword: false,\r\n\t\tmaxlength: -1,\r\n\t\tplaceholder: null,\r\n\t\tplaceholderClass: 'input-placeholder',\r\n\t\tplaceholderStyle: 'color: #c0c4cc',\r\n\t\tshowWordLimit: false,\r\n\t\tconfirmType: 'done',\r\n\t\tconfirmHold: false,\r\n\t\tholdKeyboard: false,\r\n\t\tfocus: false,\r\n\t\tautoBlur: false,\r\n\t\tdisableDefaultPadding: false,\r\n\t\tcursor: -1,\r\n\t\tcursorSpacing: 30,\r\n\t\tselectionStart: -1,\r\n\t\tselectionEnd: -1,\r\n\t\tadjustPosition: true,\r\n\t\tinputAlign: 'left',\r\n\t\tfontSize: '15px',\r\n\t\tcolor: '#303133',\r\n\t\tprefixIcon: '',\r\n\t\tprefixIconStyle: '',\r\n\t\tsuffixIcon: '',\r\n\t\tsuffixIconStyle: '',\r\n\t\tborder: 'surround',\r\n\t\treadonly: false,\r\n\t\tshape: 'square',\r\n\t\tformatter: null\r\n\t}\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:07:49\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/keyboard.js\r\n */\r\nexport default {\r\n // 键盘组件\r\n keyboard: {\r\n mode: 'number',\r\n dotDisabled: false,\r\n tooltip: true,\r\n showTips: true,\r\n tips: '',\r\n showCancel: true,\r\n showConfirm: true,\r\n random: false,\r\n safeAreaInsetBottom: true,\r\n closeOnClickOverlay: true,\r\n show: false,\r\n overlay: true,\r\n zIndex: 10075,\r\n cancelText: '取消',\r\n confirmText: '确定',\r\n autoChange: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:04:49\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/line.js\r\n */\r\nexport default {\r\n // line组件\r\n line: {\r\n color: '#d6d7d9',\r\n length: '100%',\r\n direction: 'row',\r\n hairline: true,\r\n margin: 0,\r\n dashed: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:14:11\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/lineProgress.js\r\n */\r\nexport default {\r\n // lineProgress 组件\r\n lineProgress: {\r\n activeColor: '#19be6b',\r\n inactiveColor: '#ececec',\r\n percentage: 0,\r\n showText: true,\r\n height: 12\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:45:36\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/link.js\r\n */\r\nimport config from '../config'\r\n\r\nconst {\r\n color\r\n} = config\r\nexport default {\r\n // link超链接组件props参数\r\n link: {\r\n color: color['u-primary'],\r\n fontSize: 15,\r\n underLine: false,\r\n href: '',\r\n mpTips: '链接已复制,请在浏览器打开',\r\n lineColor: '',\r\n text: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:14:53\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/list.js\r\n */\r\nexport default {\r\n // list 组件\r\n list: {\r\n showScrollbar: false,\r\n lowerThreshold: 50,\r\n upperThreshold: 0,\r\n scrollTop: 0,\r\n offsetAccuracy: 10,\r\n enableFlex: false,\r\n pagingEnabled: false,\r\n scrollable: true,\r\n scrollIntoView: '',\r\n scrollWithAnimation: false,\r\n enableBackToTop: false,\r\n height: 0,\r\n width: 0,\r\n preLoadScreen: 1\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:15:40\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/listItem.js\r\n */\r\nexport default {\r\n // listItem 组件\r\n listItem: {\r\n anchor: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:45:47\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingIcon.js\r\n */\r\nimport config from '../config'\r\n\r\nconst {\r\n color\r\n} = config\r\nexport default {\r\n // loading-icon加载中图标组件\r\n loadingIcon: {\r\n show: true,\r\n color: color['u-tips-color'],\r\n textColor: color['u-tips-color'],\r\n vertical: false,\r\n mode: 'spinner',\r\n size: 24,\r\n textSize: 15,\r\n text: '',\r\n timingFunction: 'ease-in-out',\r\n duration: 1200,\r\n inactiveColor: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:00:23\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingPage.js\r\n */\r\nexport default {\r\n // loading-page组件\r\n loadingPage: {\r\n loadingText: '正在加载',\r\n image: '',\r\n loadingMode: 'circle',\r\n loading: false,\r\n bgColor: '#ffffff',\r\n color: '#C8C8C8',\r\n fontSize: 19,\r\n iconSize: 28,\r\n loadingColor: '#C8C8C8'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:15:26\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadmore.js\r\n */\r\nexport default {\r\n // loadmore 组件\r\n loadmore: {\r\n status: 'loadmore',\r\n bgColor: 'transparent',\r\n icon: true,\r\n fontSize: 14,\r\n\t\ticonSize: 17,\r\n color: '#606266',\r\n loadingIcon: 'spinner',\r\n loadmoreText: '加载更多',\r\n loadingText: '正在加载...',\r\n nomoreText: '没有更多了',\r\n isDot: false,\r\n iconColor: '#b7b7b7',\r\n marginTop: 10,\r\n marginBottom: 10,\r\n height: 'auto',\r\n line: false,\r\n\t\tlineColor: '#E6E8EB',\r\n\t\tdashed: false,\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:15:59\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/modal.js\r\n */\r\nexport default {\r\n // modal 组件\r\n modal: {\r\n show: false,\r\n title: '',\r\n content: '',\r\n confirmText: '确认',\r\n cancelText: '取消',\r\n showConfirmButton: true,\r\n showCancelButton: false,\r\n confirmColor: '#2979ff',\r\n cancelColor: '#606266',\r\n buttonReverse: false,\r\n zoom: true,\r\n asyncClose: false,\r\n closeOnClickOverlay: false,\r\n negativeTop: 0,\r\n width: '650rpx',\r\n confirmButtonShape: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:16:18\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/navbar.js\r\n */\r\nimport color from '../color'\r\nexport default {\r\n // navbar 组件\r\n navbar: {\r\n safeAreaInsetTop: true,\r\n placeholder: false,\r\n fixed: true,\r\n border: false,\r\n leftIcon: 'arrow-left',\r\n leftText: '',\r\n rightText: '',\r\n rightIcon: '',\r\n title: '',\r\n bgColor: '#ffffff',\r\n titleWidth: '400rpx',\r\n height: '44px',\r\n\t\tleftIconSize: 20,\r\n\t\tleftIconColor: color.mainColor,\r\n\t\tautoBack: false,\r\n\t\ttitleStyle: ''\r\n }\r\n\r\n}\r\n","// 为了让用户能够自定义主题,会逐步弃用此文件,各颜色通过css提供\r\n// 为了给某些特殊场景使用和向后兼容,无需删除此文件(2020-06-20)\r\nconst color = {\r\n primary: '#3c9cff',\r\n info: '#909399',\r\n default: '#909399',\r\n warning: '#f9ae3d',\r\n error: '#f56c6c',\r\n success: '#5ac725',\r\n mainColor: '#303133',\r\n contentColor: '#606266',\r\n tipsColor: '#909399',\r\n lightColor: '#c0c4cc',\r\n borderColor: '#e4e7ed'\r\n}\r\n\r\nexport default color\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:16:39\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/noNetwork.js\r\n */\r\nexport default {\r\n // noNetwork\r\n noNetwork: {\r\n tips: '哎呀,网络信号丢失',\r\n zIndex: '',\r\n image: 'data:image/png;base64,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'\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:17:13\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/noticeBar.js\r\n */\r\nexport default {\r\n // noticeBar\r\n noticeBar: {\r\n text: () => [],\r\n direction: 'row',\r\n step: false,\r\n icon: 'volume',\r\n mode: '',\r\n color: '#f9ae3d',\r\n bgColor: '#fdf6ec',\r\n speed: 80,\r\n fontSize: 14,\r\n duration: 2000,\r\n disableTouch: true,\r\n url: '',\r\n linkType: 'navigateTo'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:10:21\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/notify.js\r\n */\r\nexport default {\r\n // notify组件\r\n notify: {\r\n top: 0,\r\n type: 'primary',\r\n color: '#ffffff',\r\n bgColor: '',\r\n message: '',\r\n duration: 3000,\r\n fontSize: 15,\r\n safeAreaInsetTop: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:11:46\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberBox.js\r\n */\r\nexport default {\r\n // 步进器组件\r\n numberBox: {\r\n name: '',\r\n value: 0,\r\n min: 1,\r\n max: Number.MAX_SAFE_INTEGER,\r\n step: 1,\r\n integer: false,\r\n disabled: false,\r\n disabledInput: false,\r\n asyncChange: false,\r\n inputWidth: 35,\r\n showMinus: true,\r\n showPlus: true,\r\n decimalLength: null,\r\n longPress: true,\r\n color: '#323233',\r\n buttonSize: 30,\r\n bgColor: '#EBECEE',\r\n cursorSpacing: 100,\r\n disableMinus: false,\r\n disablePlus: false,\r\n iconStyle: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:08:05\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberKeyboard.js\r\n */\r\nexport default {\r\n // 数字键盘\r\n numberKeyboard: {\r\n mode: 'number',\r\n dotDisabled: false,\r\n random: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:06:50\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/overlay.js\r\n */\r\nexport default {\r\n // overlay组件\r\n overlay: {\r\n show: false,\r\n zIndex: 10070,\r\n duration: 300,\r\n opacity: 0.5\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:17:33\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/parse.js\r\n */\r\nexport default {\r\n // parse\r\n parse: {\r\n copyLink: true,\r\n errorImg: '',\r\n lazyLoad: false,\r\n loadingImg: '',\r\n pauseVideo: true,\r\n previewImg: true,\r\n setTitle: true,\r\n showImgMenu: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:18:20\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/picker.js\r\n */\r\nexport default {\r\n // picker\r\n picker: {\r\n show: false,\r\n showToolbar: true,\r\n title: '',\r\n columns: () => [],\r\n loading: false,\r\n itemHeight: 44,\r\n cancelText: '取消',\r\n confirmText: '确定',\r\n cancelColor: '#909193',\r\n confirmColor: '#3c9cff',\r\n visibleItemCount: 5,\r\n keyName: 'text',\r\n closeOnClickOverlay: false,\r\n defaultIndex: () => [],\r\n\t\timmediateChange: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:06:33\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/popup.js\r\n */\r\nexport default {\r\n // popup组件\r\n popup: {\r\n show: false,\r\n overlay: true,\r\n mode: 'bottom',\r\n duration: 300,\r\n closeable: false,\r\n overlayStyle: () => {},\r\n closeOnClickOverlay: true,\r\n zIndex: 10075,\r\n safeAreaInsetBottom: true,\r\n safeAreaInsetTop: false,\r\n closeIconPos: 'top-right',\r\n round: 0,\r\n zoom: true,\r\n bgColor: '',\r\n overlayOpacity: 0.5\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:02:34\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/radio.js\r\n */\r\nexport default {\r\n // radio组件\r\n radio: {\r\n name: '',\r\n shape: '',\r\n disabled: '',\r\n labelDisabled: '',\r\n activeColor: '',\r\n inactiveColor: '',\r\n iconSize: '',\r\n labelSize: '',\r\n label: '',\r\n labelColor: '',\r\n size: '',\r\n iconColor: '',\r\n placement: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:03:12\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/radioGroup.js\r\n */\r\nexport default {\r\n // radio-group组件\r\n radioGroup: {\r\n value: '',\r\n disabled: false,\r\n shape: 'circle',\r\n activeColor: '#2979ff',\r\n inactiveColor: '#c8c9cc',\r\n name: '',\r\n size: 18,\r\n placement: 'row',\r\n label: '',\r\n labelColor: '#303133',\r\n labelSize: 14,\r\n labelDisabled: false,\r\n iconColor: '#ffffff',\r\n iconSize: 12,\r\n borderBottom: false,\r\n iconPlacement: 'left'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:05:09\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/rate.js\r\n */\r\nexport default {\r\n // rate组件\r\n rate: {\r\n value: 1,\r\n count: 5,\r\n disabled: false,\r\n size: 18,\r\n inactiveColor: '#b2b2b2',\r\n activeColor: '#FA3534',\r\n gutter: 4,\r\n minCount: 1,\r\n allowHalf: false,\r\n activeIcon: 'star-fill',\r\n inactiveIcon: 'star',\r\n touchable: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:18:41\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/readMore.js\r\n */\r\nexport default {\r\n // readMore\r\n readMore: {\r\n showHeight: 400,\r\n toggle: false,\r\n closeText: '展开阅读全文',\r\n openText: '收起',\r\n color: '#2979ff',\r\n fontSize: 14,\r\n textIndent: '2em',\r\n name: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:18:58\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/row.js\r\n */\r\nexport default {\r\n // row\r\n row: {\r\n gutter: 0,\r\n justify: 'start',\r\n align: 'center'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:19:13\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/rowNotice.js\r\n */\r\nexport default {\r\n // rowNotice\r\n rowNotice: {\r\n text: '',\r\n icon: 'volume',\r\n mode: '',\r\n color: '#f9ae3d',\r\n bgColor: '#fdf6ec',\r\n fontSize: 14,\r\n speed: 80\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:19:28\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/scrollList.js\r\n */\r\nexport default {\r\n // scrollList\r\n scrollList: {\r\n indicatorWidth: 50,\r\n indicatorBarWidth: 20,\r\n indicator: true,\r\n indicatorColor: '#f2f2f2',\r\n indicatorActiveColor: '#3c9cff',\r\n indicatorStyle: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:19:45\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/search.js\r\n */\r\nexport default {\r\n // search\r\n search: {\r\n shape: 'round',\r\n bgColor: '#f2f2f2',\r\n placeholder: '请输入关键字',\r\n clearabled: true,\r\n focus: false,\r\n showAction: true,\r\n actionStyle: () => ({}),\r\n actionText: '搜索',\r\n inputAlign: 'left',\r\n inputStyle: () => ({}),\r\n disabled: false,\r\n borderColor: 'transparent',\r\n searchIconColor: '#909399',\r\n searchIconSize: 22,\r\n color: '#606266',\r\n placeholderColor: '#909399',\r\n searchIcon: 'search',\r\n margin: '0',\r\n animation: false,\r\n value: '',\r\n maxlength: '-1',\r\n height: 32,\r\n label: null\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:07:33\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/section.js\r\n */\r\nexport default {\r\n // u-section组件\r\n section: {\r\n title: '',\r\n subTitle: '更多',\r\n right: true,\r\n fontSize: 15,\r\n bold: true,\r\n color: '#303133',\r\n subColor: '#909399',\r\n showLine: true,\r\n lineColor: '',\r\n arrow: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:20:14\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/skeleton.js\r\n */\r\nexport default {\r\n // skeleton\r\n skeleton: {\r\n loading: true,\r\n animate: true,\r\n rows: 0,\r\n rowsWidth: '100%',\r\n rowsHeight: 18,\r\n title: true,\r\n titleWidth: '50%',\r\n titleHeight: 18,\r\n avatar: false,\r\n avatarSize: 32,\r\n avatarShape: 'circle'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:08:25\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/slider.js\r\n */\r\nexport default {\r\n // slider组件\r\n slider: {\r\n value: 0,\r\n blockSize: 18,\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n activeColor: '#2979ff',\r\n inactiveColor: '#c0c4cc',\r\n blockColor: '#ffffff',\r\n showValue: false,\r\n\t\tdisabled:false,\r\n blockStyle: () => {}\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:20:39\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/statusBar.js\r\n */\r\nexport default {\r\n // statusBar\r\n statusBar: {\r\n bgColor: 'transparent'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:12:37\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/steps.js\r\n */\r\nexport default {\r\n // steps组件\r\n steps: {\r\n direction: 'row',\r\n current: 0,\r\n activeColor: '#3c9cff',\r\n inactiveColor: '#969799',\r\n activeIcon: '',\r\n inactiveIcon: '',\r\n dot: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:12:55\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/stepsItem.js\r\n */\r\nexport default {\r\n // steps-item组件\r\n stepsItem: {\r\n title: '',\r\n desc: '',\r\n iconSize: 17,\r\n error: false\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:01:30\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/sticky.js\r\n */\r\nexport default {\r\n // sticky组件\r\n sticky: {\r\n offsetTop: 0,\r\n customNavHeight: 0,\r\n disabled: false,\r\n bgColor: 'transparent',\r\n zIndex: '',\r\n index: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:12:20\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/subsection.js\r\n */\r\nexport default {\r\n // subsection组件\r\n subsection: {\r\n list: [],\r\n current: 0,\r\n activeColor: '#3c9cff',\r\n inactiveColor: '#303133',\r\n mode: 'button',\r\n fontSize: 12,\r\n bold: true,\r\n bgColor: '#eeeeef',\r\n\t\tkeyName: 'name'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:00:42\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/swipeAction.js\r\n */\r\nexport default {\r\n // swipe-action组件\r\n swipeAction: {\r\n autoClose: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:01:13\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/swipeActionItem.js\r\n */\r\nexport default {\r\n // swipeActionItem 组件\r\n swipeActionItem: {\r\n show: false,\r\n name: '',\r\n disabled: false,\r\n threshold: 20,\r\n autoClose: true,\r\n options: [],\r\n duration: 300\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:21:38\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/swiper.js\r\n */\r\nexport default {\r\n // swiper 组件\r\n swiper: {\r\n list: () => [],\r\n indicator: false,\r\n indicatorActiveColor: '#FFFFFF',\r\n indicatorInactiveColor: 'rgba(255, 255, 255, 0.35)',\r\n indicatorStyle: '',\r\n indicatorMode: 'line',\r\n autoplay: true,\r\n current: 0,\r\n currentItemId: '',\r\n interval: 3000,\r\n duration: 300,\r\n circular: false,\r\n previousMargin: 0,\r\n nextMargin: 0,\r\n acceleration: false,\r\n displayMultipleItems: 1,\r\n easingFunction: 'default',\r\n keyName: 'url',\r\n imgMode: 'aspectFill',\r\n height: 130,\r\n bgColor: '#f3f4f6',\r\n radius: 4,\r\n loading: false,\r\n showTitle: false\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:22:07\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/swiperIndicator.js\r\n */\r\nexport default {\r\n // swiperIndicator 组件\r\n swiperIndicator: {\r\n length: 0,\r\n current: 0,\r\n indicatorActiveColor: '',\r\n indicatorInactiveColor: '',\r\n\t\tindicatorMode: 'line'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:22:24\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/switch.js\r\n */\r\nexport default {\r\n // switch\r\n switch: {\r\n loading: false,\r\n disabled: false,\r\n size: 25,\r\n activeColor: '#2979ff',\r\n inactiveColor: '#ffffff',\r\n value: false,\r\n activeValue: true,\r\n inactiveValue: false,\r\n asyncChange: false,\r\n space: 0\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:22:40\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabbar.js\r\n */\r\nexport default {\r\n // tabbar\r\n tabbar: {\r\n value: null,\r\n safeAreaInsetBottom: true,\r\n border: true,\r\n zIndex: 1,\r\n activeColor: '#1989fa',\r\n inactiveColor: '#7d7e80',\r\n fixed: true,\r\n placeholder: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:22:55\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabbarItem.js\r\n */\r\nexport default {\r\n //\r\n tabbarItem: {\r\n name: null,\r\n icon: '',\r\n badge: null,\r\n dot: false,\r\n text: '',\r\n badgeStyle: 'top: 6px;right:2px;'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:23:14\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabs.js\r\n */\r\nexport default {\r\n //\r\n tabs: {\r\n duration: 300,\r\n list: () => [],\r\n lineColor: '#3c9cff',\r\n activeStyle: () => ({\r\n color: '#303133'\r\n }),\r\n inactiveStyle: () => ({\r\n color: '#606266'\r\n }),\r\n lineWidth: 20,\r\n lineHeight: 3,\r\n lineBgSize: 'cover',\r\n itemStyle: () => ({\r\n height: '44px'\r\n }),\r\n scrollable: true,\r\n\t\tcurrent: 0,\r\n\t\tkeyName: 'name'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:23:37\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/tag.js\r\n */\r\nexport default {\r\n // tag 组件\r\n tag: {\r\n type: 'primary',\r\n disabled: false,\r\n size: 'medium',\r\n shape: 'square',\r\n text: '',\r\n bgColor: '',\r\n color: '',\r\n borderColor: '',\r\n closeColor: '#C6C7CB',\r\n name: '',\r\n plainFill: false,\r\n plain: false,\r\n closable: false,\r\n show: true,\r\n icon: ''\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:23:58\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/text.js\r\n */\r\nexport default {\r\n // text 组件\r\n text: {\r\n type: '',\r\n show: true,\r\n text: '',\r\n prefixIcon: '',\r\n suffixIcon: '',\r\n mode: '',\r\n href: '',\r\n format: '',\r\n call: false,\r\n openType: '',\r\n bold: false,\r\n block: false,\r\n lines: '',\r\n color: '#303133',\r\n size: 15,\r\n iconStyle: () => ({\r\n fontSize: '15px'\r\n }),\r\n decoration: 'none',\r\n margin: 0,\r\n lineHeight: '',\r\n align: 'left',\r\n wordWrap: 'normal'\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:24:32\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/textarea.js\r\n */\r\nexport default {\r\n\t// textarea 组件\r\n\ttextarea: {\r\n\t\tvalue: '',\r\n\t\tplaceholder: '',\r\n\t\tplaceholderClass: 'textarea-placeholder',\r\n\t\tplaceholderStyle: 'color: #c0c4cc',\r\n\t\theight: 70,\r\n\t\tconfirmType: '',\r\n\t\tdisabled: false,\r\n\t\tcount: false,\r\n\t\tfocus: false,\r\n\t\tautoHeight: false,\r\n\t\tfixed: false,\r\n\t\tcursorSpacing: 0,\r\n\t\tcursor: '',\r\n\t\tshowConfirmBar: true,\r\n\t\tselectionStart: -1,\r\n\t\tselectionEnd: -1,\r\n\t\tadjustPosition: true,\r\n\t\tdisableDefaultPadding: false,\r\n\t\tholdKeyboard: false,\r\n\t\tmaxlength: 140,\r\n\t\tborder: 'surround',\r\n\t\tformatter: null\r\n\t}\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:07:07\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/toast.js\r\n */\r\nexport default {\r\n // toast组件\r\n toast: {\r\n zIndex: 10090,\r\n loading: false,\r\n text: '',\r\n icon: '',\r\n type: '',\r\n loadingMode: '',\r\n show: '',\r\n overlay: false,\r\n position: 'center',\r\n params: () => {},\r\n duration: 2000,\r\n isTab: false,\r\n url: '',\r\n callback: null,\r\n back: false\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:24:55\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/toolbar.js\r\n */\r\nexport default {\r\n // toolbar 组件\r\n toolbar: {\r\n show: true,\r\n cancelText: '取消',\r\n confirmText: '确认',\r\n cancelColor: '#909193',\r\n confirmColor: '#3c9cff',\r\n title: ''\r\n }\r\n\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:25:14\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/tooltip.js\r\n */\r\nexport default {\r\n // tooltip 组件\r\n tooltip: {\r\n text: '',\r\n copyText: '',\r\n size: 14,\r\n color: '#606266',\r\n bgColor: 'transparent',\r\n direction: 'top',\r\n zIndex: 10071,\r\n showCopy: true,\r\n buttons: () => [],\r\n overlay: true,\r\n showToast: true\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 16:59:00\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/transition.js\r\n */\r\nexport default {\r\n // transition动画组件的props\r\n transition: {\r\n show: false,\r\n mode: 'fade',\r\n duration: '300',\r\n timingFunction: 'ease-out'\r\n }\r\n}\r\n","/*\r\n * @Author : LQ\r\n * @Description :\r\n * @version : 1.0\r\n * @Date : 2021-08-20 16:44:21\r\n * @LastAuthor : LQ\r\n * @lastTime : 2021-08-20 17:09:50\r\n * @FilePath : /u-view2.0/uview-ui/libs/config/props/upload.js\r\n */\r\nexport default {\r\n\t// upload组件\r\n\tupload: {\r\n\t\taccept: 'image',\r\n\t\tcapture: () => ['album', 'camera'],\r\n\t\tcompressed: true,\r\n\t\tcamera: 'back',\r\n\t\tmaxDuration: 60,\r\n\t\tuploadIcon: 'camera-fill',\r\n\t\tuploadIconColor: '#D3D4D6',\r\n\t\tuseBeforeRead: false,\r\n\t\tpreviewFullImage: true,\r\n\t\tmaxCount: 52,\r\n\t\tdisabled: false,\r\n\t\timageMode: 'aspectFill',\r\n\t\tname: '',\r\n\t\tsizeType: () => ['original', 'compressed'],\r\n\t\tmultiple: false,\r\n\t\tdeletable: true,\r\n\t\tmaxSize: Number.MAX_VALUE,\r\n\t\tfileList: () => [],\r\n\t\tuploadText: '',\r\n\t\twidth: 80,\r\n\t\theight: 80,\r\n\t\tpreviewImage: true\r\n\t}\r\n}\r\n","// uniapp在H5中各API的z-index值如下:\r\n/**\r\n * actionsheet: 999\r\n * modal: 999\r\n * navigate: 998\r\n * tabbar: 998\r\n * toast: 999\r\n */\r\n\r\nexport default {\r\n toast: 10090,\r\n noNetwork: 10080,\r\n // popup包含popup,actionsheet,keyboard,picker的值\r\n popup: 10075,\r\n mask: 10070,\r\n navbar: 980,\r\n topTips: 975,\r\n sticky: 970,\r\n indexListSticky: 965\r\n}\r\n","/**\r\n * 注意:\r\n * 此部分内容,在vue-cli模式下,需要在vue.config.js加入如下内容才有效:\r\n * module.exports = {\r\n * transpileDependencies: ['uview-v2']\r\n * }\r\n */\r\n\r\nlet platform = 'none'\r\n\r\n\r\n\r\n\r\n\r\n\r\nplatform = 'vue2'\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nplatform = 'weixin'\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nplatform = 'mp'\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport default platform\r\n","\r\n// 混淆函数库\r\nimport mixin from './tool/mixin/mixin.js'\r\n\r\n\r\nimport dayjs from './tool/function/dayjs/index'\r\nimport util from './tool/function/util'\r\n\r\n// 生成全局唯一guid字符串\r\nimport guid from './tool/function/guid.js'\r\n// 延迟函数\r\nimport sleep from './tool/function/sleep.js'\r\n// 打乱数组的顺序\r\nimport randomArray from './tool/function/randomArray.js'\r\n// 对象和数组的深度克隆\r\nimport deepClone from './tool/function/deepClone.js'\r\n// 对象深度拷贝\r\nimport deepMerge from './tool/function/deepMerge.js'\r\n\r\n\r\n// 规则检验\r\nimport test from './tool/function/test.js'\r\n// 随机数\r\nimport random from './tool/function/random.js'\r\n// 去除空格\r\nimport trim from './tool/function/trim.js'\r\n// toast提示,对uni.showToast的封装\r\nimport toast from './tool/function/toast.js'\r\n// 获取父组件参数\r\nimport getParent from './tool/function/getParent.js'\r\n// -----自定获取组件上的属性。\r\nimport getParentAttr from './tool/function/getParentAttr.js'\r\n// -----自定获取单个父组件\r\nimport getParentAls from './tool/function/getParentAls.js'\r\n// 上传文件库\r\nimport upload from './tool/function/upload.js'\r\n// 预览文件\r\nimport preview from './tool/function/preview.js'\r\n\r\n// obj转字样式style符串。 // -----自定\r\nimport {objToString} from './tool/function/objToString.js'\r\n// 日历库\r\nimport calendar from './tool/function/calendar.js'\r\n\r\nimport HandwritingSelf from './tool/function/signBoard.js'\r\n//抽奖模型。\r\nimport choujiang from './tool/function/choujianggailv.js'\r\n\r\n\r\n// 配置信息\r\nimport config from './tool/config/config.js'\r\nimport store from './tool/store/tm-vuetify' \r\nimport vx from './tool/function/vuex.js' \r\nimport theme from './tool/function/theme.js' \r\nimport request from './tool/request/index' \r\n\r\n\r\nconst $tm = {\r\n\t\r\n\tsleep,\r\n\trequest,\r\n\tobjToString,\r\n\tdayjs:dayjs.dayjs,\r\n\tguid,\r\n\tupload,\r\n\tpreview,\r\n\trandomArray,\r\n\ttest,\r\n\trandom,\r\n\tdeepClone,\r\n\tdeepMerge,\r\n\tgetParent,\r\n\tgetParentAttr,\r\n\tgetParentAls,\r\n\ttrim,\r\n\ttoast,\r\n\tconfig, \r\n\tcalendar,\r\n\tHandwritingSelf,\r\n\tchoujiang,\r\n\tvx:new vx(store),\r\n\ttheme,\r\n\tu: util,\r\n\r\n}\r\n\r\n\r\n\r\nuni.$tm = $tm\r\nconst install = Vue => {\r\n\tVue.mixin(mixin) \r\n\tVue.prototype.$tm = {...$tm}\r\n\t\r\n\t// Vue.prototype.$store = store\r\n\t\r\n}\r\n\r\nexport default {\r\n\tinstall\r\n}","import sharebywx from \"../function/wxshare.js\"\r\nmodule.exports = {\r\n\t...sharebywx.sharebywx,\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\ttmVueTifly_pages: '',\r\n\t\t}\r\n\t},\r\n\tcreated() {\r\n\t\tthis.setVueTiflyThemeBlack();\r\n\t},\r\n\tonShow() {\r\n\t\tlet urls = getCurrentPages();\r\n\t\tif(urls.length>0){\r\n\t\t\tlet url = urls[urls.length-1].$page.fullPath\r\n\t\t\tif(url[0]!='/') url = '/'+url;\r\n\t\t\turl = url.split('?')[0];\r\n\t\t\tuni.$tm.vx.commit('setPageNow', url)\r\n\t\t}\r\n\t\tthis.setVueTiflyThemeBlack();\r\n\t},\r\n\tonLoad() {\r\n\t\t// this.$tm.vx.commit('setWxShare',{title:'hhhhh'})\r\n\t},\r\n\t\r\n\tmethods: {\r\n\t\tsetVueTiflyThemeBlack() {\r\n\t\t\tlet vueTifly_black = this.$tm.vx.state().tmVuetify.black\r\n\t\t\tif (vueTifly_black === true) {\r\n\t\t\t\tuni.setTabBarStyle({\r\n\t\t\t\t\tbackgroundColor: \"#212121\"\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tuni.setTabBarStyle({\r\n\t\t\t\t\tbackgroundColor: \"#FFFFFF\"\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\t// ...mapMutations(['setTmVuetifyColor', 'setTmVuetifyBlack']),\r\n\t\t// 检测提供的字符串是否是颜色值还是颜色主题。true,表示颜色主题名称。否则为false.\r\n\t\t$TestColor(color) {\r\n\t\t\tif (typeof color !== 'string') return false;\r\n\r\n\t\t\tif (color.indexOf('rgb') > -1 || color.indexOf('rgba') > -1 || color.indexOf('#') > -1) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttheme: false,\r\n\t\t\t\t\tcolor: color\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttheme: true,\r\n\t\t\t\t\tcolor: color\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 检查给定的值。如果是带有vw,vh,rem,em,upx,rpx,%则返回.如果是px,或者45数字,则转换为upx单位的数值。\r\n\t\t$TestUnit(n) {\r\n\t\t\tif (typeof n !== 'string' && typeof n !== 'number') return 0;\r\n\t\t\tif (typeof n === 'number') return {\r\n\t\t\t\ttype: 'number',\r\n\t\t\t\tvalue: uni.upx2px(n)\r\n\t\t\t};\r\n\t\t\tlet reg = /(vw|vh|rem|em|\\%|upx|rpx|auto|px)/g;\r\n\r\n\t\t\tif (reg.test(n)) {\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: 'string',\r\n\t\t\t\t\tvalue: n\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tlet num = parseFloat(n);\r\n\t\t\tif (isNaN(n)) return 0;\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'number',\r\n\t\t\t\tvalue: uni.upx2px(n)\r\n\t\t\t};\r\n\r\n\t\t},\r\n\t\t$Querey(clsaaName, t, ycnum = 50,isAll) {\r\n\r\n\t\t\treturn new Promise((rs, rj) => {\r\n\r\n\t\t\t\tif(isAll==true){\r\n\t\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\tuni.$tm.sleep(ycnum).then(r=>{\r\n\t\t\t\t\t\tuni.createSelectorQuery().in(t ? t : this).selectAll(clsaaName)\r\n\t\t\t\t\t\t\t.boundingClientRect().exec(\r\n\t\t\t\t\t\t\t\tfunction(res) {\r\n\t\t\t\t\t\t\t\t\trs(res)\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t}else{\r\n\t\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\tuni.$tm.sleep(ycnum).then(r=>{\r\n\t\t\t\t\t\tuni.createSelectorQuery().in(t ? t : this).select(clsaaName)\r\n\t\t\t\t\t\t\t.boundingClientRect().exec(\r\n\t\t\t\t\t\t\t\tfunction(res) {\r\n\t\t\t\t\t\t\t\t\trs(res)\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t}\r\n\t\t\t\t// console.log(ycnum);\r\n\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t},\r\n\tonPageScroll(e) {\r\n\t\t/**\r\n\t\t * 此全局注册用于在组件顶部,监听下拉状况以解决渐变透明的功能。\r\n\t\t * 组件:tm-menubars能用到。\r\n\t\t */\r\n\t\tuni.$emit('onPageScroll', e)\r\n\t},\r\n\tonReachBottom() {\r\n\r\n\t},\r\n\tbeforeDestroy() {\r\n\r\n\t}\r\n}\r\n","import util from './util';\r\n\r\n/**\r\n * 微信小程序分享功能。\r\n */\r\nvar cfg = function(){\r\n \r\n let config = {\r\n ...(this.$tm.vx.store.state.tmVuetify.wxshareConfig_miniMp || {})\r\n };\r\n if (typeof config.query !== 'object') config.query = {};\r\n //获取当前路径。\r\n if(!config.path){\r\n let cur = getCurrentPages();\r\n config.path = cur[cur.length-1].route;\r\n\r\n config.path = (config.path[0]=='/'?'' : '/') + config.path;\r\n config.copyLink = config.path;\r\n \r\n }\r\n // util.httpUrlAddKey\r\n let query = ''\r\n for (const key in config.query) {\r\n if (config.hasOwnProperty.call(config.query, key)) {\r\n const element = config.query[key];\r\n query = util.httpUrlAddKey(query,key,element)\r\n }\r\n }\r\n config.copyLink = config.path = config.path+query;\r\n config.query = query;\r\n \r\n return config;\r\n\r\n\r\n}\r\nvar sharebywx = {\r\n onShareAppMessage() {\r\n let cg = cfg.call(this)||{};\r\n \r\n return { ...cg}\r\n },\r\n onShareTimeline() {\r\n let cg = cfg.call(this) || {};\r\n \r\n return { ...cg }\r\n }\r\n}\r\n\r\n\r\nexport default { sharebywx }\r\n","\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * 预览图片。\r\n @param {Object} url 必填 当前预览的图片链接。\r\n @param {Object} list 可以是url数组,也可以是对象,数据比如:[\"http:url\"] or [{url:\"https:url\",...}]\r\n @param {Object} rangKey 如果list是对象数组,需要提供url字段。\r\n */\r\nimport { previewImg } from \"./preview.js\"\r\n\r\n/**\r\n* 数据分组\r\n* @param {Array} oArr - 原数组列表\r\n* @param {Number} length - 单个数组长度\r\n* @return {Array} arr - 分组后的新数组\r\n*/\r\nfunction splitData(oArr = [], length = 1) {\r\n\tlet arr = [];\r\n\tlet minArr = [];\r\n\toArr.forEach(c => {\r\n\t\tif (minArr.length === length) {\r\n\t\t\tminArr = [];\r\n\t\t}\r\n\t\tif (minArr.length === 0) {\r\n\t\t\tarr.push(minArr);\r\n\t\t}\r\n\t\tminArr.push(c);\r\n\t});\r\n\r\n\treturn arr;\r\n}\r\n\r\n/**\r\n* 剩余时间格式化\r\n* @param {Number} t - 剩余多少秒\r\n* @return {Object} format - 格式后的天时分秒对象\r\n*/\r\nfunction timeMuch(t) {\r\n\tlet format = {\r\n\t\td: '00',\r\n\t\th: '00',\r\n\t\tm: '00',\r\n\t\ts: '00'\r\n\t};\r\n\tif (t > 0) {\r\n\t\tlet d = Math.floor(t / 86400);\r\n\t\tlet h = Math.floor((t / 3600) % 24);\r\n\t\tlet m = Math.floor((t / 60) % 60);\r\n\t\tlet s = Math.floor(t % 60);\r\n\t\tformat.d = d < 10 ? '0' + d : d;\r\n\t\tformat.h = h < 10 ? '0' + h : h;\r\n\t\tformat.m = m < 10 ? '0' + m : m;\r\n\t\tformat.s = s < 10 ? '0' + s : s;\r\n\t}\r\n\treturn format;\r\n}\r\n/**\r\n* 打电话\r\n* @param {String} phoneNumber - 数字字符串\r\n* @return {Promise}\r\n*/\r\nfunction callPhone(phoneNumber = '') {\r\n\tlet num = phoneNumber.toString()\r\n\treturn new Promise((rs,rj)=>{\r\n\t\tuni.makePhoneCall({\r\n\t\t\tphoneNumber: num,\r\n\t\t\tsuccess:()=> rs(),\r\n\t\t\tfail:(err)=> rj(err)\r\n\t\t});\r\n\t})\r\n}\r\n\r\n/**\r\n * 调起客户端相机扫码。\r\n * @param {Boolean} onlyFromCamera true 是否只允许相机扫码识别\r\n * @param {Array} scanType ['barCode', 'qrCode', 'datamatrix','datamatrix']\r\n * @returns Promise 成功返回相关数据结构\r\n */\r\nfunction scanCode(onlyFromCamera = true, scanType = ['barCode', 'qrCode', 'datamatrix','datamatrix']){\r\n\r\n\r\n\r\n\treturn new Promise((rs,rj)=>{\r\n\t\tuni.scanCode({\r\n\t\t\tonlyFromCamera: onlyFromCamera,\r\n\t\t\tscanType: scanType,\r\n\t\t\tsuccess: (res) => rs(res),\r\n\t\t\tfail:(error)=>rj(error)\r\n\t\t});\r\n\t})\r\n}\r\n\r\n/**\r\n * 设置剪切板内容。\r\n * @param {String} data \r\n * @returns Promise true/false\r\n */\r\nfunction setClipboardData(data){\r\n\r\n\r\n\treturn new Promise((rs,rj)=>{\r\n\t\tuni.setClipboardData({\r\n\t\t\tdata: data,\r\n\t\t\tsuccess:()=>rs(true),\r\n\t\t\tfail:(error)=>rj(error)\r\n\t\t});\r\n\t})\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n}\r\n/**\r\n * 获取剪切板内容\r\n * @returns Promise 剪切板内容\r\n */\r\nfunction getClipboardData(){\r\n\r\n\treturn new Promise((rs, rj) => {\r\n\t\tuni.getClipboardData({\r\n\t\t\tsuccess: (res) => rs(res.data),\r\n\t\t\tfail: (error) => rj(error)\r\n\t\t});\r\n\t})\r\n\r\n\r\n\r\n\r\n}\r\n\r\n/**\r\n * 设置cookie数据\r\n * @param {String} key 键值\r\n * @param {String} data 值\r\n * @returns Boolean\r\n */\r\nfunction setCookie(key, data) {\r\n\ttry {\r\n\t\tuni.setStorageSync(key, data);\r\n\t\treturn true;\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}\r\n/**\r\n * 删除一个本地cookie\r\n * @param {String} key 键值\r\n * @returns Boolean\r\n */\r\nfunction delCookie(key) {\r\n\ttry {\r\n\t\tuni.removeStorageSync(key);\r\n\t\treturn true;\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/**\r\n * 获取一个cookie数据\r\n * 如果存入的是对象,返回的也是对象。如果是string返回的也是字符串。\r\n * @param {String} key 键\r\n * @returns json/string\r\n */\r\nfunction getCookie(key) {\r\n\ttry {\r\n\t\tconst value = uni.getStorageSync(key);\r\n\t\ttry {\r\n\t\t\tlet val = JSON.parse(value)\r\n\t\t\treturn val;\r\n\t\t} catch (e) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\treturn undefined;\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * 向地址连接追加参数。\r\n * @param {string} uri 网址\r\n * @param {string} key 字段\r\n * @param {string} value 字段值\r\n * @returns \r\n */\r\nfunction httpUrlAddKey(uri, key, value) {\r\n\tif (!value) {\r\n\t\treturn uri;\r\n\t}\r\n\tvar re = new RegExp(\"([?&])\" + key + \"=.*?(&|$)\", \"i\");\r\n\tvar separator = uri.indexOf(\"?\") !== -1 ? \"&\" : \"?\";\r\n\tif (uri.match(re)) {\r\n\t\treturn uri.replace(re, \"$1\" + key + \"=\" + value + \"$2\");\r\n\t} else {\r\n\t\treturn uri + separator + key + \"=\" + value;\r\n\t}\r\n}\r\n\r\nexport default {\r\n\tpreviewImg,//预览图片。\r\n\tsplitData,//数据分组\r\n\ttimeMuch,//剩余时间格式化\r\n\tcallPhone,//打电话\r\n\tscanCode,//调起客户端相机扫码。\r\n\tsetClipboardData, //设置剪切板内容。\r\n\tgetClipboardData,//获取剪切板内容\r\n\tsetCookie,//设置cookie数据\r\n\tdelCookie,//删除一个本地cookie\r\n\tgetCookie,//获取一个cookie数据\r\n\thttpUrlAddKey,//向地址连接追加参数\r\n}\r\n","/**\r\n * 上传文件。\r\n * 作者:tmzdy\r\n * 时间:2021年7月28日,9:14:53\r\n * 联系:zhongjihan@sina.com\r\n * 预览图片。\r\n * @param {Object} url 必填 当前预览的图片链接。\r\n * @param {Object} list 可以是url数组,也可以是对象,数据比如:[\"http:url\"] or [{url:\"https:url\",...}]\r\n * @param {Object} rangKey 如果list是对象数组,需要提供url字段。\r\n */\r\nfunction previewImg(url,list,rangKey){\r\n\t\r\n\tif(!url){\r\n\t\tuni.$tm.toast(\"参数有误\");\r\n\t\treturn;\r\n\t}\r\n\t\r\n\tif(arguments.length==1){\r\n\t\tuni.previewImage({\r\n\t\t\tcurrent:url,\r\n\t\t\turls:list?list:[url]\r\n\t\t})\r\n\t}else if(arguments.length===3){\r\n\t\t\r\n\t\tif(typeof list[0] === 'object' && typeof list[0] !== 'undefined'){\r\n\t\t\t\r\n\t\t\tlet urls = [];\r\n\t\t\tlist.forEach(item=>{\r\n\t\t\t\turls.push(item[rangKey]);\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\tuni.previewImage({\r\n\t\t\t\tcurrent:url,\r\n\t\t\t\turls:urls,\r\n\t\t\t\tfail: (er) => {\r\n\t\t\t\t\tconsole.warn(er)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}else if(typeof list[0] === 'string'){\r\n\t\t\tuni.previewImage({\r\n\t\t\t\tcurrent:url,\r\n\t\t\t\turls:list\r\n\t\t\t})\r\n\t\t}\r\n\t}else{\r\n\t\tuni.$tm.toast(\"参数有误\");\r\n\t}\r\n\t\r\n\t\r\n\t\r\n}\r\n\r\nexport default previewImg","var pc = require('./zh-cn.min')\r\nvar relativeTime = require('./relativeTime.min')\r\nvar isBetween = require('./isBetween.min')\r\nvar toObject = require('./toObject.min')\r\nvar dayjs = require('./dayjs.min')\r\ndayjs.locale(pc)\r\n// dayjs.locale('zh-cn')\r\ndayjs.extend(relativeTime)\r\ndayjs.extend(isBetween)\r\ndayjs.extend(toObject)\r\n\r\nexport default {dayjs};","/**\r\n * Skipped minification because the original files appears to be already minified.\r\n * Original file: /npm/dayjs@1.10.7/locale/zh-cn.js\r\n *\r\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\r\n */\r\n!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"./dayjs.min.js\")):\"function\"==typeof define&&define.amd?define(require(\"./dayjs.min.js\"),_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=_(e),d={name:\"zh-cn\",weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期六\".split(\"_\"),weekdaysShort:\"周日_周一_周二_周三_周四_周五_周六\".split(\"_\"),weekdaysMin:\"日_一_二_三_四_五_六\".split(\"_\"),months:\"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),ordinal:function(e,_){switch(_){case\"W\":return e+\"周\";default:return e+\"日\"}},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"YYYY/MM/DD\",LL:\"YYYY年M月D日\",LLL:\"YYYY年M月D日Ah点mm分\",LLLL:\"YYYY年M月D日ddddAh点mm分\",l:\"YYYY/M/D\",ll:\"YYYY年M月D日\",lll:\"YYYY年M月D日 HH:mm\",llll:\"YYYY年M月D日dddd HH:mm\"},relativeTime:{future:\"%s后\",past:\"%s前\",s:\"几秒\",m:\"1 分钟\",mm:\"%d 分钟\",h:\"1 小时\",hh:\"%d 小时\",d:\"1 天\",dd:\"%d 天\",M:\"1 个月\",MM:\"%d 个月\",y:\"1 年\",yy:\"%d 年\"},meridiem:function(e,_){var t=100*e+_;return t<600?\"凌晨\":t<900?\"早上\":t<1100?\"上午\":t<1300?\"中午\":t<1800?\"下午\":\"晚上\"}};return t.default.locale(d,null,!0),d}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",f=\"month\",h=\"quarter\",c=\"year\",d=\"date\",$=\"Invalid Date\",l=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},g={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),a=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return\"function\"==typeof M?M(a):M.replace(\"%s\",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}}));","/**\r\n * Skipped minification because the original files appears to be already minified.\r\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\r\n */\r\n!function(e,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isBetween=i()}(this,(function(){\"use strict\";return function(e,i,t){i.prototype.isBetween=function(e,i,s,f){var n=t(e),o=t(i),r=\"(\"===(f=f||\"()\")[0],u=\")\"===f[1];return(r?this.isAfter(n,s):!this.isBefore(n,s))&&(u?this.isBefore(o,s):!this.isAfter(o,s))||(r?this.isBefore(n,s):!this.isAfter(n,s))&&(u?this.isAfter(o,s):!this.isBefore(o,s))}}}));","/**\r\n * Skipped minification because the original files appears to be already minified.\r\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\r\n */\r\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_toObject=e()}(this,(function(){\"use strict\";return function(t,e){e.prototype.toObject=function(){return{years:this.$y,months:this.$M,date:this.$D,hours:this.$H,minutes:this.$m,seconds:this.$s,milliseconds:this.$ms}}}}));","/**\r\n * 本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85\r\n * 全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier) \r\n * 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题\r\n * 最可能的情况是左滑删除item或者对某条信息流\"不喜欢\"并去掉它的时候,会导致组件内的数据可能出现错乱\r\n * v-for的时候,推荐使用后端返回的id而不是循环的index\r\n * @param {Number} len uuid的长度\r\n * @param {Boolean} firstU 将返回的首字母置为\"u\"\r\n * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制\r\n */\r\nfunction guid(len = 32, firstU = true, radix = null) {\r\n\tlet chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\r\n\tlet uuid = [];\r\n\tradix = radix || chars.length;\r\n\r\n\tif (len) {\r\n\t\t// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位\r\n\t\tfor (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];\r\n\t} else {\r\n\t\tlet r;\r\n\t\t// rfc4122标准要求返回的uuid中,某些位为固定的字符\r\n\t\tuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\r\n\t\tuuid[14] = '4';\r\n\r\n\t\tfor (let i = 0; i < 36; i++) {\r\n\t\t\tif (!uuid[i]) {\r\n\t\t\t\tr = 0 | Math.random() * 16;\r\n\t\t\t\tuuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class\r\n\tif (firstU) {\r\n\t\tuuid.shift();\r\n\t\treturn 'u' + uuid.join('');\r\n\t} else {\r\n\t\treturn uuid.join('');\r\n\t}\r\n}\r\n\r\nexport default guid;\r\n","/**\r\n * 作者:tmzdy\r\n * 延时操作\r\n * @param {Number} wait = [500] 延时\r\n */\r\nfunction sleep(wait=500){\r\n\tlet timid = null;\r\n\tif(wait==0) return Promise.resolve(true)\r\n\tclearTimeout(timid);\r\n\treturn new Promise((res,rej)=>{\r\n\t\ttimid = setTimeout(function() {\r\n\t\t\tres();\r\n\t\t}, wait);\r\n\t})\r\n}\r\n\r\nexport default sleep;","// 打乱数组\r\nfunction randomArray(array = []) {\r\n\t// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0\r\n\treturn array.sort(() => Math.random() - 0.5);\r\n}\r\n\r\nexport default randomArray\r\n","// 此库来自 https://www.uviewui.com/js/intro.html\r\n// 判断arr是否为一个数组,返回一个bool值\r\nfunction isArray (arr) {\r\n return Object.prototype.toString.call(arr) === '[object Array]';\r\n}\r\n\r\n// 深度克隆\r\nfunction deepClone (obj) {\r\n\t// 对常见的“非”值,直接返回原来值\r\n\tif([null, undefined, NaN, false].includes(obj)) return obj;\r\n if(typeof obj !== \"object\" && typeof obj !== 'function') {\r\n\t\t//原始类型直接返回\r\n return obj;\r\n }\r\n var o = isArray(obj) ? [] : {};\r\n for(let i in obj) {\r\n if(obj.hasOwnProperty(i)){\r\n o[i] = typeof obj[i] === \"object\" ? deepClone(obj[i]) : obj[i];\r\n }\r\n }\r\n return o;\r\n}\r\n\r\nexport default deepClone;\r\n","// 此库来自 https://www.uviewui.com/js/intro.html\r\nimport deepClone from \"./deepClone\";\r\n\r\n// JS对象深度合并\r\nfunction deepMerge(target = {}, source = {}) {\r\n\ttarget = deepClone(target);\r\n\tif (typeof target !== 'object' || typeof source !== 'object') return false;\r\n\tfor (var prop in source) {\r\n\t\tif (!source.hasOwnProperty(prop)) continue;\r\n\t\tif (prop in target) {\r\n\t\t\tif (typeof target[prop] !== 'object') {\r\n\t\t\t\ttarget[prop] = source[prop];\r\n\t\t\t} else {\r\n\t\t\t\tif (typeof source[prop] !== 'object') {\r\n\t\t\t\t\ttarget[prop] = source[prop];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (target[prop].concat && source[prop].concat) {\r\n\t\t\t\t\t\ttarget[prop] = target[prop].concat(source[prop]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttarget[prop] = deepMerge(target[prop], source[prop]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttarget[prop] = source[prop];\r\n\t\t}\r\n\t}\r\n\treturn target;\r\n}\r\n\r\nexport default deepMerge;","\r\n\r\n/**\r\n * 验证电子邮箱格式\r\n */\r\nfunction email(value) {\r\n\treturn /\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*/.test(value);\r\n}\r\n\r\n/**\r\n * 验证手机格式\r\n */\r\nfunction mobile(value) {\r\n\treturn /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证URL格式\r\n */\r\nfunction url(value) {\r\n\treturn /^https?:\\/\\/(([a-zA-Z0-9_-])+(\\.)?)*(:\\d+)?(\\/((\\.)?(\\?)?=?&?[a-zA-Z0-9_-](\\?)?)*)*$/i.test(value)\r\n}\r\n\r\n/**\r\n * 验证日期格式\r\n */\r\nfunction date(value) {\r\n\treturn /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证身份证号码\r\n */\r\nfunction idCard(value) {\r\n\treturn /^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/.test(\r\n\t\tvalue)\r\n}\r\n\r\n/**\r\n * 是否车牌号\r\n */\r\nfunction carNo(value) {\r\n\t// 新能源车牌\r\n\tconst xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;\r\n\t// 旧车牌\r\n\tconst creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;\r\n\tif (value.length === 7) {\r\n\t\treturn creg.test(value);\r\n\t} else if (value.length === 8) {\r\n\t\treturn xreg.test(value);\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/**\r\n * 中文\r\n */\r\nfunction chinese(value) {\r\n\tlet reg = /^[\\u4e00-\\u9fa5]+$/gi;\r\n\treturn reg.test(value);\r\n}\r\n\r\n/**\r\n * 只能输入字母\r\n */\r\nfunction letter(value) {\r\n\treturn /^[a-zA-Z]*$/.test(value);\r\n}\r\n\r\n/**\r\n * 只能是字母或者数字\r\n */\r\nfunction enOrNum(value) {\r\n\t//英文或者数字\r\n\tlet reg = /^[0-9a-zA-Z]*$/g;\r\n\treturn reg.test(value);\r\n}\r\n\r\n/**\r\n * 是否json字符串\r\n */\r\nfunction jsonString(value) {\r\n\tif (typeof value == 'string') {\r\n\t\ttry {\r\n\t\t\tvar obj = JSON.parse(value);\r\n\t\t\tif (typeof obj == 'object' && obj) {\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n\r\n/**\r\n * 是否对象\r\n */\r\nfunction object(value) {\r\n\treturn Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\n/**\r\n * 检查对象或者数组的值, true表示通过,没有空;false表示有空值。\r\n * @param {Object} obj 对象\r\n * @param {Array} filter 需要排除的字段以数组提供。 对象\r\n */\r\nfunction checkObject(obj,filter=[]){\r\n\tlet istrue = true;\r\n\tfunction testObjec(obj){\r\n\t\tif(typeof obj !=='object' || Array.isArray(obj) || obj==null ){\r\n\t\t\tistrue = false;\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor(let item in obj){\r\n\t\t\tif(filter.indexOf(item)===-1){\r\n\t\t\t\tif(typeof obj[item] ==='undefined' || obj[item] === null ){\r\n\t\t\t\t\t\r\n\t\t\t\t\tistrue = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof obj[item] === 'object'){\r\n\t\t\t\t\tif(Array.isArray(obj[item])){\r\n\t\t\t\t\t\tif(obj[item].length==0){\r\n\t\t\t\t\t\t\tistrue = false;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\ttestObjec(obj[item]);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}else if(typeof obj[item] === 'string'){\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(!uni.$tm.trim(obj[item])){\r\n\t\t\t\t\t\tistrue = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t}\r\n\ttestObjec(obj);\r\n\treturn istrue;\r\n}\r\n//中国邮政编码\r\nfunction chinaPost(value) {\r\n\treturn /[1-9]\\d{5}(?!\\d)/.test(value)\r\n}\r\n//中国银行卡号\r\nfunction bankCard(value) {\r\n\tlet p = /^([1-9]{1})(\\d{15}|\\d{16}|\\d{18})$/;\r\n\tlet str = value.replace(/\\s+/g, \"\");\r\n\treturn p.test(str);\r\n}\r\n//密码验证,只能字母字符和数字\r\n//默认6位\r\nfunction password(value,len=6) {\r\n\tlet p = new RegExp(`^[\\w+|\\-|+\\*\\.\\`!@#\\$%\\^\\&\\(\\)\\_\\+\\,\\///]{`+len+`,}$`)\r\n\treturn p.test(value);\r\n}\r\n//密码验证,只能字母字符和数字\r\n//默认6位\r\n//并且,大小写字母和数字必须至少要有1位。\r\nfunction password2(value,len=6) {\r\n\tlet p = new RegExp(`^[\\w+|\\-|+\\*\\.\\`!@#\\$%\\^\\&\\(\\)\\_\\+\\,\\///]{`+len+`,}$`)\r\n\tif(!p.test(value)) return false;\r\n\tif(!/[a-z]{1,}/.test(value)) return false;\r\n\tif(!/[A-Z]{1,}/.test(value)) return false;\r\n\tif(!/[0-9]{1,}/.test(value)) return false;\r\n\treturn true;\r\n}\r\n \r\nexport default {\r\n\temail,\r\n\tmobile,\r\n\turl,\r\n\tdate,\r\n\tidCard,\r\n\tcarNo,\r\n\tchinese,\r\n\tletter,\r\n\tenOrNum,\r\n\tjsonString,\r\n\tobject,\r\n\tcheckObject,\r\n\tchinaPost,\r\n\tpassword,\r\n\tpassword2,\r\n\tbankCard\r\n}\r\n","function random(min, max) {\r\n\tif (min >= 0 && max > 0 && max >= min) {\r\n\t\tlet gab = max - min + 1;\r\n\t\treturn Math.floor(Math.random() * gab + min);\r\n\t} else {\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default random;\r\n","function trim(str, pos = 'both') {\r\n\tif (pos == 'both') {\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, \"\");\r\n\t} else if (pos == \"left\") {\r\n\t\treturn str.replace(/^\\s*/, '');\r\n\t} else if (pos == 'right') {\r\n\t\treturn str.replace(/(\\s*$)/g, \"\");\r\n\t} else if (pos == 'all') {\r\n\t\treturn str.replace(/\\s+/g, \"\");\r\n\t} else {\r\n\t\treturn str;\r\n\t}\r\n}\r\n\r\nexport default trim\r\n","function toast(title, duration = 1500) {\r\n\tuni.showToast({\r\n\t\ttitle: title,\r\n\t\ticon: 'none',\r\n\t\tduration: duration\r\n\t})\r\n}\r\n\r\nexport default toast\r\n","// 此库来自 https://www.uviewui.com/js/intro.html\r\n// 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法\r\n// this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx\r\nexport default function getParent(name, keys) {\r\n\tlet parent = this.$parent;\r\n\t// 通过while历遍,这里主要是为了H5需要多层解析的问题\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options?.name !== name) {\r\n\t\t\t// 如果组件的name不相等,继续上一级寻找\r\n\t\t\tparent = parent.$parent;\r\n\t\t} else {\r\n\t\t\tlet data = {};\r\n\t\t\t// 判断keys是否数组,如果传过来的是一个数组,那么直接使用数组元素值当做键值去父组件寻找\r\n\t\t\tif(Array.isArray(keys)) {\r\n\t\t\t\tkeys.map(val => {\r\n\t\t\t\t\tdata[val] = parent[val] ? parent[val] : '';\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// 历遍传过来的对象参数\r\n\t\t\t\tfor(let i in keys) {\r\n\t\t\t\t\t// 如果子组件有此值则用,无此值则用父组件的值\r\n\t\t\t\t\t// 判断是否空数组,如果是,则用父组件的值,否则用子组件的值\r\n\t\t\t\t\tif(Array.isArray(keys[i])) {\r\n\t\t\t\t\t\tif(keys[i].length) {\r\n\t\t\t\t\t\t\tdata[i] = keys[i];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdata[i] = parent[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if(keys[i].constructor === Object) {\r\n\t\t\t\t\t\t// 判断是否对象,如果是对象,且有属性,那么使用子组件的值,否则使用父组件的值\r\n\t\t\t\t\t\tif(Object.keys(keys[i]).length) {\r\n\t\t\t\t\t\t\tdata[i] = keys[i];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdata[i] = parent[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 只要子组件有传值,即使是false值,也是“传值”了,也需要覆盖父组件的同名参数\r\n\t\t\t\t\t\tdata[i] = (keys[i] || keys[i] === false) ? keys[i] : parent[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {};\r\n}","// 使用时,node = this.$parent;\r\nexport default function getParentAttr(name, keys,node) {\r\n\t\r\n\tlet parent = node;\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options?.name !== name) {\r\n\t\t\t// 如果组件的name不相等,继续上一级寻找\r\n\t\t\tparent = parent.$parent;\r\n\t\t} else {\r\n\t\t\t\r\n\t\t\treturn parent[keys];\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n\r\n\t\r\n}","// 使用时,node = this.$parent;\r\n// 根据给定的父组件名,寻找它的上一级。\r\nexport default function getParentAls(name,node) {\r\n\t\r\n\tlet parent = node;\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options?.name !== name) {\r\n\t\t\t// 如果组件的name不相等,继续上一级寻找\r\n\t\t\tparent = parent.$parent;\r\n\t\t} else {\r\n\t\t\t\r\n\t\t\treturn parent;\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n\r\n\t\r\n}","import guid from './guid';\r\n/**\r\n * 上传文件。\r\n * 作者:tmzdy\r\n * 时间:2021年7月28日,9:14:53\r\n * 联系:zhongjihan@sina.com\r\n * @param {Function} chooesefile -- 选择图片上传\r\n * @param {Function} selected -- 选择图片成功后触发。返回选择后的图片。\r\n * @param {Function} addfile -- 动态加入预上传的文件。\r\n * @param {Function} progress -- 进度。\r\n * @param {Function} fail -- 失败。\r\n * @param {Function} success -- 成功。\r\n * @param {Function} complete -- 完成。\r\n * @param {Function} start -- 开始上传。\r\n * @param {Function} stop -- 停止上传。\r\n */\r\nclass uploadfile {\r\n\tfilelist = [];\r\n\tisStop = false;\r\n\tindex = 0;\r\n\tconstructor({maxfile,uploadUrl,opts,responseStu,file_list,isAuto}) {\r\n\t\tlet arg = {\r\n\t\t\tmaxfile:9,\r\n\t\t\tuploadUrl:'',\r\n\t\t\tfile_list:[],\r\n\t\t\tisAuto:true,\r\n\t\t\topts:{},\r\n\t\t\tmaxsize:10*1024*1024,\r\n\t\t\tcode:0,//定义成功的标志码\r\n\t\t\ttype:'image',//文件选择的类型\r\n\t\t\textension:['*'],//后缀过滤。\r\n\t\t\tresponseStu:{\r\n\t\t\t\t\t\tcode:'code',//服务器返回的码的字段名称\r\n\t\t\t\t\t\tdata:'data',//服务上传成功后返回 的数据字段名称\r\n\t\t\t\t\t\tmsg:'msg'//服务器响应信息的字段名称。\r\n\t\t\t\t\t},\r\n\t\t\t...(arguments[0]??{})};\r\n\t\tlet ots = {\r\n\t\t\t\tname:'file',header:{}\r\n\t\t\t}//配置{name: 'file', // 上传时的文件key名。默认file,header: {}, // 上传的头部参数。}\r\n\t this.config={\r\n\t\t\tmaxfile:arg.maxfile,\r\n\t\t\tuploadUrl:arg.uploadUrl,\r\n\t\t\topts:{...ots,...arg.opts},\r\n\t\t\tfile_list:arg.file_list,//默认提供的图片.\r\n\t\t\tmaxsize:arg.maxsize,\r\n\t\t\tcode:arg.code,\r\n\t\t\tisAuto:arg.isAuto,//自动上传\r\n\t\t\ttype:arg.type,//文件选择的类型\r\n\t\t\textension:arg.extension,//后缀过滤。\r\n\t\t\tresponseStu:{...arg.responseStu,...(responseStu||{})}\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * 成功后返回选择后的图片列表。\r\n\t */\r\n\tasync chooesefile(){\r\n\t\tlet t = this;\r\n\t\treturn new Promise((rs,rj)=>{\r\n\r\n\t\t\tuni.chooseImage({\r\n\t\t\t\tcount:t.config.maxfile,\r\n\t\t\t\ttype:t.config.type,\r\n\t\t\t\textension:t.config.extension,\r\n\t\t\t\tfail: (e) => {\r\n\t\t\t\t\tconsole.error(e);\r\n\t\t\t\t\tuni.$tm.toast(\"已取消选择\");\r\n\t\t\t\t\trj(e);\r\n\t\t\t\t},\r\n\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\tconsole.log(res);\r\n\t\t\t\t\tif(res.tempFilePaths.length==0){\r\n\t\t\t\t\t\tuni.$tm.toast(\"未选择\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(res);\r\n\t\t\t\t\tlet imgarray = res.tempFilePaths;\r\n\t\t\t\t\tlet fielist = res.tempFiles;\r\n\t\t\t\t\tlet jgsk = [];\r\n\t\t\t\t\t//0待上传,1上传中,2上传失败,3上传成功。4超过大小限制\r\n\t\t\t\t\timgarray.forEach((item,index)=>{\r\n\t\t\t\t\t\tlet isMaxsize = fielist[index].size>t.config.maxsize?true:false;\r\n\t\t\t\t\t\tjgsk.push({\r\n\t\t\t\t\t\t\turl:item,\r\n\t\t\t\t\t\t\tstatus:isMaxsize?'超过大小':\"待上传\",\r\n\t\t\t\t\t\t\tprogress:isMaxsize?100:0,\r\n\t\t\t\t\t\t\tfileId:guid(),\r\n\t\t\t\t\t\t\tstatusCode:isMaxsize?4:0,\r\n\t\t\t\t\t\t\tdata:null,//上传成功后的回调数据。\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\tt.filelist.push(...jgsk)\r\n\r\n\t\t\t\t\tt.selected(t.filelist);\r\n\t\t\t\t\tif(t.config.isAuto){\r\n\t\t\t\t\t\tt.start();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\trs(t.filelist)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t})\r\n\t}\r\n\tasync chooseMPH5weixinFile(){\r\n\t\tlet t = this;\r\n\t\treturn new Promise((rs,rj)=>{\r\n\t\t\tvar fs = uni.chooseFile;\r\n\r\n\t\t\tfs = uni.chooseMessageFile;\r\n\r\n\t\t\tvar config = {\r\n\t\t\t\tcount:t.config.maxfile,\r\n\t\t\t\ttype:t.config.type,\r\n\t\t\t\textension:t.config.extension,\r\n\t\t\t}\r\n\t\t\tif(!t.config.extension||!Array.isArray(t.config.extension)||t.config.extension?.length==0){\r\n\t\t\t\tdelete config.extension\r\n\t\t\t}\r\n\t\t\tfs({\r\n\t\t\t\t...config,\r\n\t\t\t\tfail: (e) => {\r\n\t\t\t\t\tconsole.error(e);\r\n\t\t\t\t\tuni.$tm.toast(\"已取消选择\");\r\n\t\t\t\t\trj(e);\r\n\t\t\t\t},\r\n\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\tif(res.tempFiles.length==0){\r\n\t\t\t\t\t\tuni.$tm.toast(\"未选择\");\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet fielist = res.tempFiles;\r\n\t\t\t\t\tlet jgsk = [];\r\n\t\t\t\t\t//0待上传,1上传中,2上传失败,3上传成功。4超过大小限制\r\n\t\t\t\t\tfielist.forEach((item,index)=>{\r\n\t\t\t\t\t\tlet isMaxsize = fielist[index].size>t.config.maxsize?true:false;\r\n\t\t\t\t\t\tlet ftype = item.name||\"\"\r\n\t\t\t\t\t\tif(ftype){\r\n\t\t\t\t\t\t\tftype = ftype.substr(ftype.lastIndexOf(\".\")+1).toLocaleLowerCase();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tjgsk.push({\r\n\t\t\t\t\t\t\turl:item.path,\r\n\t\t\t\t\t\t\tname:item.name||'默认文件名称',\r\n\t\t\t\t\t\t\ttype:ftype,\r\n\t\t\t\t\t\t\tstatus:isMaxsize?'超过大小':\"待上传\",\r\n\t\t\t\t\t\t\tprogress:isMaxsize?100:0,\r\n\t\t\t\t\t\t\tfileId:guid(),\r\n\t\t\t\t\t\t\tstatusCode:isMaxsize?4:0,\r\n\t\t\t\t\t\t\tdata:null,//上传成功后的回调数据。\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\tt.filelist.push(...jgsk)\r\n\r\n\t\t\t\t\tt.selected(t.filelist);\r\n\t\t\t\t\tif(t.config.isAuto){\r\n\t\t\t\t\t\tt.start();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\trs(t.filelist)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t})\r\n\t}\r\n\tsetConfig({maxfile,uploadUrl,opts,file_list,isAuto,responseStu}){\r\n\t\tlet arg = arguments.length==0?{}:arguments[0];\r\n\t\tthis.config={...this.config,...arg}\r\n\t}\r\n\t// 动态加入预上传的文件。\r\n\t/**\r\n\t * 动态加入文件\r\n\t * @param {Object} filelist\r\n\t */\r\n\taddfile(filelist){\r\n\t\tif(typeof filelist !=='object'&&!Array.isArray(filelist)) return;\r\n\t\tthis.filelist.push(...filelist)\r\n\t}\r\n\t// 选择图片成功后触发。返回选择后的图片。\r\n\tselected(filelist){}\r\n\t// 进度。\r\n\tprogress(item){}\r\n\t// 失败\r\n\tfail(item){}\r\n\t// 成功\r\n\tsuccess(item){}\r\n\t// 完成。\r\n\tcomplete (filelist){}\r\n\t// 开始上传。\r\n\tstart(){\r\n\t\tif(this.filelist.length<=0){\r\n\t\t\tuni.$tm.toast(\"未选择图片\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet t = this;\r\n\t\t// t重新开始上传从头开始。\r\n\t\tthis.index = 0;\r\n\t\tthis.isStop = false;\r\n\t\tfunction startupload(){\r\n\t\t\tif(t.isStop) return;\r\n\t\t\tlet item = t.filelist[t.index];\r\n\t\t\tif(!item || typeof item === 'undefined'){\r\n\t\t\t\t// 文件不存在。直接结束。\r\n\t\t\t\tt.complete(t.filelist);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif(item.statusCode==3||item.statusCode==1||item.statusCode==4){\r\n\t\t\t\t// 直接跳过。至下一个文件。\r\n\t\t\t\tt.index++;\r\n\t\t\t\tstartupload();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst upObj = uni.uploadFile({\r\n\t\t\t\turl:t.config.uploadUrl,\r\n\t\t\t\tname:t.config.opts?.name??'file',\r\n\t\t\t\theader:t.config.opts?.header??{},\r\n\t\t\t\tfilePath:item.url,\r\n\t\t\t\tformData:{file_name:item.name},\r\n\t\t\t\tsuccess:(res)=>{\r\n\t\t\t\t\tif(res.statusCode !=200){\r\n\t\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t\tuni.$tm.toast(String(res.statusCode))\r\n\t\t\t\t\t\tt.fail(item)\r\n\t\t\t\t\t\tt.index++;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet jsd={};\r\n\t\t\t\t\tlet isOk = true;\r\n\t\t\t\t\t// 是否从服务器返回的是json。如果不是则表示fasle为string.\r\n\t\t\t\t\tlet isJsonCallbackData = true;\r\n\r\n\t\t\t\t\ttry{\r\n\t\t\t\t\t\tjsd = JSON.parse(res.data);\r\n\t\t\t\t\t}catch(e){\r\n\t\t\t\t\t\tisJsonCallbackData=false;\r\n\t\t\t\t\t\tjsd = res.data;\r\n\t\t\t\t\t\titem.data = res.data;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(isJsonCallbackData){\r\n\t\t\t\t\t\ttry{\r\n\t\t\t\t\t\t\titem.data = jsd[t.config.responseStu.data];\r\n\t\t\t\t\t\t\tif(typeof item.data == 'object'){\r\n\t\t\t\t\t\t\t\titem.data['name'] = item.name;\r\n\t\t\t\t\t\t\t\titem.data['id'] = item['id']||\"\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlet itecode = jsd[t.config.responseStu.code]\r\n\t\t\t\t\t\t\tif(itecode!==t.config.code){\r\n\t\t\t\t\t\t\t\tisOk = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}catch(e){\r\n\t\t\t\t\t\t\tisOk = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif(!isOk){\r\n\t\t\t\t\t\tuni.$tm.toast(jsd[t.config.responseStu.msg]||\"失败\")\r\n\t\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t\tt.fail(item)\r\n\t\t\t\t\t\tt.index++;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 上传成功。\r\n\t\t\t\t\titem.statusCode = 3;\r\n\t\t\t\t\titem.status = \"上传成功\";\r\n\t\t\t\t\tuni.$tm.toast(\"上传成功\")\r\n\t\t\t\t\t// t.filelist[t.index] = item;\r\n\t\t\t\t\t// t.filelist.splice(t.index,1,item)\r\n\r\n\t\t\t\t\tt.success(item)\r\n\r\n\t\t\t\t},\r\n\t\t\t\tfail:(res)=>{\r\n\r\n\t\t\t\t\tuni.$tm.toast(res.errMsg)\r\n\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t// t.filelist[t.index] = item;\r\n\t\t\t\t\tt.fail(item)\r\n\t\t\t\t\tt.index++;\r\n\t\t\t\t},\r\n\t\t\t\tcomplete:(res)=>{\r\n\t\t\t\t\t// 直接下一个文件。\r\n\r\n\t\t\t\t\tstartupload();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tif(upObj){\r\n\t\t\t\tupObj.onProgressUpdate((res)=>{\r\n\t\t\t\t\tt.filelist[t.index].statusCode = 1;\r\n\t\t\t\t\tt.filelist[t.index].status = \"上传中\";\r\n\t\t\t\t\tt.filelist[t.index].progress = res.progress;\r\n\t\t\t\t\t// t.filelist[t.index] = item;\r\n\t\t\t\t\tt.progress(item)\r\n\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\tstartupload();\r\n\t}\r\n\t// 停止上传\r\n\tstop(){\r\n\t\tthis.isStop = true;\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * 上传文件。\r\n * 作者:tmzdy\r\n * 时间:2021年7月28日,9:14:53\r\n * 联系:zhongjihan@sina.com\r\n * 选择图片上传,相册或者拍照。\r\n * @param {Number} maxfile 最大上传的文件数量,默认为 9 ;\r\n * @param {String} uploadUrl -- \"\"\r\n * @param {Object} opts -- {}\r\n * @param {Function} progress {} --上传中调用\r\n * @param {Function} success {} --上传成功才会调用。\r\n * @param {Function} selected {} --选完图片待上传调用。\r\n * @param {Function} fail {} --上传失败时调用,返回文件相关\r\n * @param {Function} complete {} -- 完成上传时触发,失败与成功都触发。\r\n */\r\nfunction chooseImgUpload(maxfile=9,uploadUrl=\"\",opts={},progress,success,selected,fail,complete){\r\n\tuni.chooseImage({\r\n\t\tcount:maxfile,\r\n\t\tfail: (e) => {\r\n\t\t\tuni.$tm.toast(\"用户取消选择图片\");\r\n\t\t},\r\n\t\tsuccess: (res) => {\r\n\r\n\t\t\tif(res.tempFilePaths.length==0){\r\n\t\t\t\tuni.$tm.toast(\"未选择图片\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet imgarray = res.tempFilePaths;\r\n\t\t\tlet jgsk = [];\r\n\t\t\t//0待上传,1上传中,2上传失败,3上传成功。\r\n\t\t\timgarray.forEach((item,index)=>{\r\n\t\t\t\tjgsk.push({\r\n\t\t\t\t\turl:item,\r\n\t\t\t\t\tstatus:\"待上传\",\r\n\t\t\t\t\tprogress:0,\r\n\t\t\t\t\tfileId:guid(),\r\n\t\t\t\t\tstatusCode:0,\r\n\t\t\t\t\tdata:null,//上传成功后的回调数据。\r\n\t\t\t\t})\r\n\t\t\t})\r\n\t\t\tif(selected){\r\n\t\t\t\tselected(jgsk);\r\n\t\t\t}\r\n\r\n\t\t\tlet index = 0;\r\n\t\t\tfunction startupload(){\r\n\t\t\t\tlet item = jgsk[index];\r\n\t\t\t\tif(!item){\r\n\t\t\t\t\t// 文件不存在。直接结束。\r\n\t\t\t\t\tif(complete){\r\n\t\t\t\t\t\tcomplete(jgsk);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif(item.statusCode==2||item.statusCode==1){\r\n\t\t\t\t\t// 直接跳过。至下一个文件。\r\n\t\t\t\t\tindex++;\r\n\t\t\t\t\tstartupload();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst upObj = uni.uploadFile({\r\n\t\t\t\t\turl:uploadUrl,\r\n\t\t\t\t\tname:opts?.name??'file',\r\n\t\t\t\t\theader:opts?.header??{},\r\n\t\t\t\t\tfilePath:item.url,\r\n\t\t\t\t\tsuccess:(res)=>{\r\n\t\t\t\t\t\tif(res.statusCode !=200){\r\n\t\t\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t\t\tuni.$tm.toast(res.errMsg)\r\n\t\t\t\t\t\t\tif(fail){\r\n\t\t\t\t\t\t\t\tfail(item)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttry{\r\n\t\t\t\t\t\t\titem.data = JSON.parse(res.data).data;\r\n\t\t\t\t\t\t}catch(e){\r\n\t\t\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t\t\tuni.$tm.toast(res.errMsg)\r\n\t\t\t\t\t\t\tif(fail){\r\n\t\t\t\t\t\t\t\tfail(item)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// 上传成功。\r\n\t\t\t\t\t\titem.statusCode = 3;\r\n\t\t\t\t\t\titem.status = \"上传成功\";\r\n\t\t\t\t\t\titem.data = JSON.parse(res.data).data;\r\n\t\t\t\t\t\tuni.$tm.toast(\"上传成功\")\r\n\t\t\t\t\t\tif(success){\r\n\t\t\t\t\t\t\tsuccess(item)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t},\r\n\t\t\t\t\tfail:(res)=>{\r\n\r\n\t\t\t\t\t\tuni.$tm.toast(res.errMsg)\r\n\t\t\t\t\t\titem.statusCode = 2;\r\n\t\t\t\t\t\titem.status = \"上传失败\";\r\n\t\t\t\t\t\tif(fail){\r\n\t\t\t\t\t\t\tfail(item)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcomplete:(res)=>{\r\n\t\t\t\t\t\t// 直接下一个文件。\r\n\t\t\t\t\t\tindex++;\r\n\t\t\t\t\t\tstartupload();\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tif(upObj){\r\n\t\t\t\t\tupObj.onProgressUpdate((res)=>{\r\n\t\t\t\t\t\titem.statusCode = 1;\r\n\t\t\t\t\t\titem.status = \"上传中\";\r\n\t\t\t\t\t\titem.progress = res.progress\r\n\t\t\t\t\t\tif(progress){\r\n\t\t\t\t\t\t\tprogress(item)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\tstartupload();\r\n\t\t}\r\n\t})\r\n}\r\n\r\nexport default {\r\n\tchooseImgUpload,uploadfile\r\n}\r\n","// 把对象转换为string,提供对象 和 分割符。\r\nfunction objToString(obj, split=';') {\r\n if(typeof obj !==\"object\") return '';\r\n let a='';\r\n for(let i in obj){\r\n\t a+=i+':'+obj[i]+split;\r\n }\r\n return a;\r\n}\r\n\r\nmodule.exports.objToString = objToString;\r\n","/**\r\n * 日历库\r\n * 作者:tmzdy\r\n * 时间:2021-7-27\r\n * 联系:zhongjihan@sina.com\r\n */\r\nclass calendar{\r\n\tvalue= new Date();\r\n\tnow_day_month = new Date();\r\n\tstart_time = new Date(1900,0,1)\r\n\tend_time = new Date(2100,11,31)\r\n\ttxtdateArray = [];\r\n\t/**\r\n\t * value:初始化时间\r\n\t * start:开始始间 ,提供了后,会在返回的日历上标记每个日期是否是在start 和 end之间。\r\n\t * end:结束时间 \r\n\t */\r\n\tconstructor({value,start,end}) {\r\n\t\tif(arguments.length===1){\r\n\t\t\tlet arg = arguments[0]\r\n\t\t\t\r\n\t\t\tif(arg?.value){\r\n\t\t\t\tvalue = value.replace(/-/g,'/');\r\n\t\t\t\tlet dobj = new Date(value);\r\n\t\t\t\tthis.value = new Date(dobj.getFullYear(),dobj.getMonth(),dobj.getDate());\r\n\t\t\t\t\r\n\t\t\t\tthis.now_day_month = this.value;\r\n\t\t\t}\r\n\t\t\tif(arg?.start){\r\n\t\t\t\tlet sv = start;\r\n\t\t\t\tif(typeof sv ==='string'){\r\n\t\t\t\t\tsv = new Date(sv.replace(/-/g,'/'))\r\n\t\t\t\t}else if(typeof sv === 'object'){\r\n\t\t\t\t\tsv = new Date(sv)\r\n\t\t\t\t}\r\n\t\t\t\tthis.start_time = sv;\r\n\t\t\t}\r\n\t\t\tif(arg?.end){\r\n\t\t\t\tlet sv = end;\r\n\t\t\t\tif(typeof sv ==='string'){\r\n\t\t\t\t\tsv = new Date(sv.replace(/-/g,'/'))\r\n\t\t\t\t}else if(typeof sv === 'object'){\r\n\t\t\t\t\tsv = new Date(sv)\r\n\t\t\t\t}\r\n\t\t\t\tthis.end_time = sv;\r\n\t\t\t}\r\n\t\t}\r\n\t \r\n\t}\r\n\t/**\r\n\t* 日期转化为字符串, 4位年+2位月+2位日\r\n\t*/\r\n\tgetDateStr(date) {\r\n\t var _year = date.getFullYear();\r\n\t var _month = date.getMonth(); // 月从0开始计数\r\n\t var _d = date.getDate();\r\n\t \r\n\t _month = (_month > 9) ? (\"\" + _month) : (\"0\" + _month);\r\n\t _d = (_d > 9) ? (\"\" + _d) : (\"0\" + _d);\r\n\t return _year + _month + _d;\r\n\t}\r\n\t// 设置当前计算的日历的时间 。格式为时间 格式。\r\n\tsetValue(value){\r\n\t\tif(value){\r\n\t\t\tlet dobj = new Date();\r\n\t\t\tif(typeof value === 'object'){\r\n\t\t\t\tdobj = new Date(value);\r\n\t\t\t}else{\r\n\t\t\t\tvalue = value.replace(/-/g,'/');\r\n\t\t\t\tdobj = new Date(value);\r\n\t\t\t}\r\n\r\n\t\t\tthis.value = new Date(dobj.getFullYear(),dobj.getMonth(),dobj.getDate());\r\n\t\t\tthis.now_day_month = this.value;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\t// 未设置\r\n\tsetStart(start){\r\n\t\tlet sv = start;\r\n\t\tif(typeof sv ==='string'){\r\n\t\t\tsv = new Date(sv.replace(/-/g,'/'))\r\n\t\t}else if(typeof sv === 'object'){\r\n\t\t\tsv = new Date(sv)\r\n\t\t}\r\n\t\t\r\n\t\tthis.start_time = sv;\r\n\t\treturn this;\r\n\t}\r\n\tsetEnd(end){\r\n\t\tlet sv = end;\r\n\t\tif(typeof sv ==='string'){\r\n\t\t\tsv = new Date(sv.replace(/-/g,'/'))\r\n\t\t}else if(typeof sv === 'object'){\r\n\t\t\tsv = new Date(sv)\r\n\t\t}\r\n\t\t\r\n\t\tthis.end_time = sv;\r\n\t\t\r\n\t\treturn this;\r\n\t}\r\n\t// 设置文本数据。携带在对象 中。\r\n\tsetTimeArrayText(textArray){\r\n\t\tif(!Array.isArray(textArray)) return;\r\n\t\t/**\r\n\t\t * textArray\r\n\t\t * {date:\"2021-7-1\",text:\"你好\"}\r\n\t\t */\r\n\t\tthis.txtdateArray = textArray;\r\n\t\treturn this;\r\n\t}\r\n\t\r\n\tmonthDay(year, month) {\r\n\t var date = new Date(year, month, 1, 0, 0, 0)\r\n\t var yesterDay = new Date(date - 1000)\r\n\t return yesterDay.getDate()\r\n\t}\r\n\tnongli(year,month,day){\r\n\t\tconst calendarobj = {\r\n\t\t gregorianYear: null, //公历年\r\n\t\t gregorianMonth: null, //公历月\r\n\t\t gregorianDay: null, //公历日\r\n\t\t weekday: null, //星期\r\n\t\t hours: null,\r\n\t\t minutes: null,\r\n\t\t seconds: null,\r\n\t\t\r\n\t\t lunarYear: null, //农历年\r\n\t\t lunarMonth: null, //农历月\r\n\t\t lunarDay: null, //农历日\r\n\t\t\r\n\t\t lunarYearCn: '', //农历天干地支纪年\r\n\t\t lunarMonthCn: '', //农历中文月\r\n\t\t lunarDayCn: '', //农历中文日\r\n\t\t zodiacYear: '', //农历生肖年\r\n\t\t\r\n\t\t solarTerm: '', //节气\r\n\t\t gregorianFestival: '', //公历节日\r\n\t\t lunarFestival: '' //农历节日\r\n\t\t}\r\n\t\t\r\n\t\tlet lunarInfo = [\r\n\t\t 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,\r\n\t\t 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,\r\n\t\t 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,\r\n\t\t 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,\r\n\t\t 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,\r\n\t\t 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,\r\n\t\t 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,\r\n\t\t 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,\r\n\t\t 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,\r\n\t\t 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,\r\n\t\t 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,\r\n\t\t 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,\r\n\t\t 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,\r\n\t\t 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,\r\n\t\t 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0]\r\n\t\t\r\n\t\tlet zodiacs = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']\r\n\t\tlet Gan = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']\r\n\t\tlet Zhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']\r\n\t\tlet weekday = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']\r\n\t\tlet now = new Date()\r\n\t\t\r\n\t\t//用于计算农历年月日的数据\r\n\t\tlet GY = year\r\n\t\tlet GM = month\r\n\t\tlet GD = day\r\n\t\t\r\n\t\t\r\n\t\t//==== 传入 offset 传回干支, 0=甲子\r\n\t\tfunction cyclical(num) {\r\n\t\t return(Gan[num % 10] + Zhi[num % 12])\r\n\t\t}\r\n\t\t\r\n\t\t//==== 传回农历 year年的总天数\r\n\t\tfunction lYearDays(year) {\r\n\t\t let i, sum = 348\r\n\t\t for(i = 0x8000; i > 0x8; i >>= 1) {\r\n\t\t sum += (lunarInfo[year - 1900] & i) ? 1: 0\r\n\t\t }\r\n\t\t return(sum + leapDays(year))\r\n\t\t}\r\n\t\t\r\n\t\t//==== 传回农历 year年闰月的天数\r\n\t\tfunction leapDays(year) {\r\n\t\t if(leapMonth(year)) {\r\n\t\t return((lunarInfo[year-1900] & 0x10000)? 30: 29)\r\n\t\t }\r\n\t\t else {\r\n\t\t return 0\r\n\t\t }\r\n\t\t}\r\n\t\t\r\n\t\t//==== 传回农历 year年闰哪个月 1-12 , 没闰传回 0\r\n\t\tfunction leapMonth(year) {\r\n\t\t return(lunarInfo[year - 1900] & 0xf)\r\n\t\t}\r\n\t\t\r\n\t\t//==== 传回农历 year年month月的总天数\r\n\t\tfunction monthDays(year, month) {\r\n\t\t return( (lunarInfo[year - 1900] & (0x10000 >> month))? 30: 29 )\r\n\t\t}\r\n\t\t\r\n\t\t//==== 算出农历, 传入日期对象, 传回农历日期对象\r\n\t\t// 该对象属性有 农历年year 农历月month 农历日day 是否闰年isLeap yearCyl dayCyl monCyl\r\n\t\tfunction Lunar(objDate) {\r\n\t\t let i, temp = 0\r\n\t\t let baseDate = new Date(1900,0,31)\r\n\t\t let offset = Math.floor((objDate - baseDate)/86400000)\r\n\t\t\r\n\t\t let dayCyl = offset + 40\r\n\t\t let monCyl = 14\r\n\t\t\r\n\t\t for(i = 1900; i < 2050 && offset > 0; i++) {\r\n\t\t temp = lYearDays(i)\r\n\t\t offset -= temp\r\n\t\t monCyl += 12\r\n\t\t }\r\n\t\t if(offset < 0) {\r\n\t\t offset += temp;\r\n\t\t i--;\r\n\t\t monCyl -= 12\r\n\t\t }\r\n\t\t //农历年\r\n\t\t let year = i\r\n\t\t let yearCyl = i-1864\r\n\t\t\r\n\t\t let leap = leapMonth(i) //闰哪个月\r\n\t\t let isLeap = false //是否闰年\r\n\t\t\r\n\t\t for(i=1; i<13 && offset>0; i++) {\r\n\t\t //闰月\r\n\t\t if(leap>0 && i === (leap+1) && isLeap === false) {\r\n\t\t --i; isLeap = true; temp = leapDays(year);\r\n\t\t }\r\n\t\t else {\r\n\t\t temp = monthDays(year, i);\r\n\t\t }\r\n\t\t\r\n\t\t //解除闰月\r\n\t\t if(isLeap === true && i === (leap + 1)) {\r\n\t\t isLeap = false\r\n\t\t }\r\n\t\t\r\n\t\t offset -= temp\r\n\t\t if(isLeap === false) {\r\n\t\t monCyl ++\r\n\t\t }\r\n\t\t }\r\n\t\t\r\n\t\t if(offset === 0 && leap>0 && i===leap+1)\r\n\t\t if(isLeap) {\r\n\t\t isLeap = false\r\n\t\t }\r\n\t\t else {\r\n\t\t isLeap = true\r\n\t\t --i\r\n\t\t --monCyl\r\n\t\t }\r\n\t\t\r\n\t\t if(offset<0){\r\n\t\t offset += temp\r\n\t\t --i\r\n\t\t --monCyl\r\n\t\t }\r\n\t\t //农历月\r\n\t\t let month = i\r\n\t\t //农历日\r\n\t\t let day = offset + 1\r\n\t\t\r\n\t\t return {\r\n\t\t year: year,\r\n\t\t month: month,\r\n\t\t day: day,\r\n\t\t isLeap: isLeap,\r\n\t\t leap: leap,\r\n\t\t yearCyl: yearCyl,\r\n\t\t dayCyl: dayCyl,\r\n\t\t monCyl: monCyl\r\n\t\t }\r\n\t\t}\r\n\t\t\r\n\t\t//==== 中文日期 m为传入月份,d为传入日期\r\n\t\tfunction cDay(m, d){\r\n\t\t let nStr1 = ['日', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\r\n\t\t let nStr2 = ['初', '十', '廿', '卅', '']\r\n\t\t //农历中文月\r\n\t\t let lunarMonthCn\r\n\t\t //农历中文日\r\n\t\t let lunarDayCn\r\n\t\t if (m > 10){\r\n\t\t lunarMonthCn = '十' + nStr1[m - 10]\r\n\t\t } else {\r\n\t\t lunarMonthCn = nStr1[m]\r\n\t\t }\r\n\t\t lunarMonthCn += '月'\r\n\t\t\r\n\t\t switch (d) {\r\n\t\t case 10: lunarDayCn = '初十'; break;\r\n\t\t case 20: lunarDayCn = '二十'; break;\r\n\t\t case 30: lunarDayCn = '三十'; break;\r\n\t\t default: lunarDayCn = nStr2[Math.floor(d/10)] + nStr1[d % 10]\r\n\t\t }\r\n\t\t return {\r\n\t\t lunarMonthCn: lunarMonthCn,\r\n\t\t lunarDayCn: lunarDayCn\r\n\t\t }\r\n\t\t}\r\n\t\t\r\n\t\t//节气\r\n\t\tfunction getSolarTerm() {\r\n\t\t let sTermInfo = [\r\n\t\t 0, 21208, 42467, 63836, 85337, 107014,\r\n\t\t 128867, 150921, 173149, 195551, 218072, 240693,\r\n\t\t 263343, 285989, 308563, 331033, 353350, 375494,\r\n\t\t 397447, 419210, 440795, 462224, 483532, 504758\r\n\t\t ]\r\n\t\t let solarTerm = [\r\n\t\t '小寒', '大寒', '立春', '雨水', '惊蛰', '春分',\r\n\t\t '清明', '谷雨', '立夏', '小满', '芒种', '夏至',\r\n\t\t '小暑', '大暑', '立秋', '处暑', '白露', '秋分',\r\n\t\t '寒露', '霜降', '立冬', '小雪', '大雪', '冬至'\r\n\t\t ]\r\n\t\t\r\n\t\t let solarTerms = ''\r\n\t\t let tmp1 = new Date(\r\n\t\t (31556925974.7 * (GY - 1900) + sTermInfo[(GM-1) * 2 + 1] * 60000) + Date.UTC(1900,0,6,2,5)\r\n\t\t )\r\n\t\t let tmp2 = tmp1.getUTCDate()\r\n\t\t if (tmp2 === GD) solarTerms = solarTerm[(GM-1) * 2 + 1]\r\n\t\t tmp1 = new Date(\r\n\t\t (31556925974.7 * (GY - 1900) + sTermInfo[(GM-1) * 2] * 60000) + Date.UTC(1900,0,6,2,5)\r\n\t\t )\r\n\t\t tmp2= tmp1.getUTCDate()\r\n\t\t if (tmp2 === GD) solarTerms = solarTerm[(GM-1) * 2]\r\n\t\t\r\n\t\t return solarTerms\r\n\t\t}\r\n\t\t\r\n\t\t//==== 中文日期 m为传入月份,d为传入日期\r\n\t\tfunction cDay(m ,d ){\r\n\t\t let nStr1 = ['日', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']\r\n\t\t let nStr2 = ['初', '十', '廿', '卅', '']\r\n\t\t //农历中文月\r\n\t\t let lunarMonthCn\r\n\t\t //农历中文日\r\n\t\t let lunarDayCn\r\n\t\t if (m > 10){\r\n\t\t lunarMonthCn = '十' + nStr1[m - 10]\r\n\t\t } else {\r\n\t\t lunarMonthCn = nStr1[m]\r\n\t\t }\r\n\t\t lunarMonthCn += '月'\r\n\t\t\r\n\t\t switch (d) {\r\n\t\t case 10: lunarDayCn = '初十'; break;\r\n\t\t case 20: lunarDayCn = '二十'; break;\r\n\t\t case 30: lunarDayCn = '三十'; break;\r\n\t\t default: lunarDayCn = nStr2[Math.floor(d/10)] + nStr1[d % 10]\r\n\t\t }\r\n\t\t return {\r\n\t\t lunarMonthCn: lunarMonthCn,\r\n\t\t lunarDayCn: lunarDayCn\r\n\t\t }\r\n\t\t}\r\n\t\t//去掉时分秒的日期\r\n\t\tlet sDObj = new Date(GY, GM-1, GD);\r\n\t\tlet lDObj = new Lunar(sDObj);\r\n\t\t\r\n\t\t\r\n\t\t//节气\r\n\t\t// calendar.solarTerm = getSolarTerm()\r\n\t\tlet n = cDay(lDObj.month,lDObj.day);\r\n\t\tlet y = cyclical( GY - 1900 + 36);\r\n\t\treturn {\r\n\t\t\tyear:y,\r\n\t\t\tmonth:n.lunarMonthCn,\r\n\t\t\tday:n.lunarDayCn,\r\n\t\t\tshengxiao:zodiacs[(GY - 4) % 12],\r\n\t\t\tjieqi:getSolarTerm()\r\n\t\t};\r\n\t}\r\n\t//下个月,可以一直操作\r\n\tnextMonth(){\r\n\t\tthis.value = new Date(this.value.getFullYear(),this.value.getMonth()+1,1);\r\n\t\treturn this;\r\n\t}\r\n\t//上个月,可以一直操作\r\n\tprevMonth(){\r\n\t\tthis.value = new Date(this.value.getFullYear(),this.value.getMonth()-1,1);\r\n\t\treturn this;\r\n\t}\r\n\t//下一年\r\n\tnexYear(){\r\n\t\tthis.value = new Date(this.value.getFullYear()+1,this.value.getMonth(),this.value.getDate());\r\n\t\treturn this;\r\n\t}\r\n\t//上一年\r\n\tprevYear(){\r\n\t\tthis.value = new Date(this.value.getFullYear()-1,this.value.getMonth(),this.value.getDate());\r\n\t\treturn this;\r\n\t}\r\n\t// 把之前设置的上一年,下一年,上一月下一月等数据清除,恢复 到最原始的月份年份数据。\r\n\tsetInit(){\r\n\t\tthis.value = this.now_day_month;\r\n\t\treturn this;\r\n\t}\r\n\t// 返回初始化时的月份\r\n\tgetNowData(){\r\n\t\t// 当前时间 。\r\n\t\tlet week = [7,1,2,3,4,5,6]\r\n\t\tlet text_week = ['周日','周一','周二','周三','周四','周五','周六']\r\n\t\tlet _thisdateStr = this.now_day_month.toLocaleString();\r\n\t\tlet _thisMothn = this.now_day_month.getMonth();//当前月\r\n\t\tlet _thisDay = this.now_day_month.getDate();//当前日\r\n\t\tlet _thisYear = this.now_day_month.getFullYear();//当前年\r\n\t\tlet _thisWeek = this.now_day_month.getDay();//当前周\r\n\t\tlet _thisMothn_day = new Date(_thisYear,_thisMothn,1) ; ///当月第一天数据。\r\n\t\tlet _thisDayDate = new Date(_thisYear,_thisMothn,_thisDay);\r\n\t\tlet months = [31,this.monthDay(_thisYear,_thisMothn),31,30,31,30,31,31,30,31,30,31];\r\n\t\tlet _thisMothn_lastDay = new Date(_thisYear,_thisMothn,months[_thisMothn]) ; ///当月最后数据。\r\n\t\tlet dateArray = [];//当前日历表数据。\r\n\t\tlet llineDate = [];//行数据。\r\n\t\tlet j=1;\r\n\t\tlet ishs = true //如果第一排没有本月数据需要切换模式。把本月放第一位。\r\n\t\tfor(let i=1 ;i <8;i++){\r\n\t\t\tlet tdy = new Date(_thisYear, _thisMothn, i - 6 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\tif(i==7){\r\n\t\t\t\t\r\n\t\t\t\tlet tf = tdy.getTime()>= _thisMothn_day.getTime() && tdy.getTime() <= _thisMothn_lastDay.getTime() ?true:false;\r\n\t\t\t\tif(!tf){\r\n\t\t\t\t\tishs = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor(let i=1 ;i <43;i++){\r\n\t\t\tvar Day = null;\r\n\t\t\tif(!ishs){\r\n\t\t\t\tDay = new Date(_thisYear, _thisMothn, i + 1 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\t}else{\r\n\t\t\t\tDay = new Date(_thisYear, _thisMothn, i - 6 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\t}\r\n\t\t\tdateArray.push({\r\n\t\t\t\tyear:Day.getFullYear(),//年\r\n\t\t\t\tmonth:Day.getMonth()+1,//月1-12\r\n\t\t\t\tweek:week[Day.getDay()],//周的数字1~7\r\n\t\t\t\tweek_text:text_week[Day.getDay()],//周的中文\r\n\t\t\t\tday:Day.getDate(),//几号\r\n\t\t\t\tprevMoth: Day.getTime() < _thisMothn_day.getTime() ?true:false,//是否是上月。\r\n\t\t\t\tnowMonth: Day.getTime()>= _thisMothn_day.getTime() && Day.getTime() <= _thisMothn_lastDay.getTime() ?true:false,//是否当月\r\n\t\t\t\tnowDay:Day.getTime() == _thisDayDate.getTime() ?true:false,//是否是当天。\r\n\t\t\t\tnowYear:0,//是否当年\r\n\t\t\t\tnextMoth: Day.getTime() > _thisMothn_lastDay.getTime()?true:false,//是否下月\r\n\t\t\t\tbeginEnd: Day.getTime() >= this.start_time.getTime() && Day.getTime() <= this.end_time.getTime()?true:false,//是否在开始和结束区间范围内。\r\n\t\t\t\tnongli:this.nongli(Day.getFullYear(),Day.getMonth()+1,Day.getDate()) \r\n\t\t\t})\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\treturn dateArray;\r\n\t}\r\n\t// 返回当前选中月的日历数组。如果你不设置value和数据getNowData和getData相等。\r\n\t/**\r\n\t * 返回当前月数据。\r\n\t * @return {\r\n\t\t beginEnd: false,//是否在规定范围时间内\r\n\t\t day: 16,//日\r\n\t\t month: 7,//月\r\n\t\t nextMoth: false,//是否下月\r\n\t\t nowDay: false,//是否当天\r\n\t\t nowMonth: true,//是否当月\r\n\t\t prevMoth: false,/是否下月\r\n\t\t week: 5,//周1-7\r\n\t\t week_text: \"周五\",//同上\r\n\t\t year: 2021,//年\r\n\t\t nongli:{ //农历\r\n\t\t\t day: \"初七\",//日\r\n\t\t\t jieqi: \"\",//节气\r\n\t\t\t month: \"六月\",//月\r\n\t\t\t shengxiao: \"牛\",//生肖\r\n\t\t\t year: \"辛丑\" //农历年\r\n\t\t }\r\n\t }\r\n\t */\r\n\tgetData(){\r\n\t\t// 当前时间 。\r\n\t\tlet week = [7,1,2,3,4,5,6]\r\n\t\tlet text_week = ['周日','周一','周二','周三','周四','周五','周六']\r\n\t\tlet _thisdateStr = this.value.toLocaleString();\r\n\t\tlet _thisMothn = this.value.getMonth();//当前月\r\n\t\tlet _thisDay = this.value.getDate();//当前日\r\n\t\tlet _thisYear = this.value.getFullYear();//当前年\r\n\t\tlet _thisWeek = this.value.getDay();//当前周\r\n\t\tlet _thisMothn_day = new Date(_thisYear,_thisMothn,1) ; ///当月第一天数据。\r\n\t\tlet _thisDayDate = new Date(_thisYear,_thisMothn,_thisDay);\r\n\t\tlet months = [31,this.monthDay(_thisYear,_thisMothn),31,30,31,30,31,31,30,31,30,31];\r\n\t\tlet _thisMothn_lastDay = new Date(_thisYear,_thisMothn,months[_thisMothn]) ; ///当月最后数据。\r\n\t\tlet dateArray = [];//当前日历表数据。\r\n\t\tlet llineDate = [];//行数据。\r\n\t\tlet j=1;\r\n\t\tlet ishs = true //如果第一排没有本月数据需要切换模式。把本月放第一位。\r\n\t\tfor(let i=1 ;i <8;i++){\r\n\t\t\tlet tdy = new Date(_thisYear, _thisMothn, i - 6 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\tif(i==7){\r\n\t\t\t\t\r\n\t\t\t\tlet tf = tdy.getTime()>= _thisMothn_day.getTime() && tdy.getTime() <= _thisMothn_lastDay.getTime() ?true:false;\r\n\t\t\t\tif(!tf){\r\n\t\t\t\t\tishs = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\tfor(let i=1 ;i <43;i++){\r\n\t\t\tvar Day = null;\r\n\t\t\tif(!ishs){\r\n\t\t\t\tDay = new Date(_thisYear, _thisMothn, i + 1 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\t}else{\r\n\t\t\t\tDay = new Date(_thisYear, _thisMothn, i - 6 - _thisMothn_day.getDay()); //当前循环日期。\r\n\t\t\t}\r\n\t\t\tlet dstr = Day.getFullYear() + \"-\" + (Day.getMonth()+1) + \"-\" + Day.getDate();\r\n\t\t\tlet TxtIndex = this.txtdateArray.findIndex(item=>{\r\n\t\t\t\r\n\t\t\t\treturn item.date == dstr\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tdateArray.push({\r\n\t\t\t\tyear:Day.getFullYear(),//年\r\n\t\t\t\tmonth:Day.getMonth()+1,//月1-12\r\n\t\t\t\tweek:week[Day.getDay()],//周的数字1~7\r\n\t\t\t\tweek_text:text_week[Day.getDay()],//周的中文\r\n\t\t\t\tday:Day.getDate(),//几号\r\n\t\t\t\tprevMoth: Day.getTime() < _thisMothn_day.getTime() ?true:false,//是否是上月。\r\n\t\t\t\tnowMonth: Day.getTime()>= _thisMothn_day.getTime() && Day.getTime() <= _thisMothn_lastDay.getTime() ?true:false,//是否当月\r\n\t\t\t\tnowDay:Day.getTime() == _thisDayDate.getTime() ?true:false,//是否是当天。\r\n\t\t\t\tnextMoth: Day.getTime() > _thisMothn_lastDay.getTime()?true:false,//是否下月\r\n\t\t\t\tbeginEnd: Day.getTime() >= this.start_time.getTime() && Day.getTime() <= this.end_time.getTime()?true:false,//是否在开始和结束区间范围内。\r\n\t\t\t\tnongli:this.nongli(Day.getFullYear(),Day.getMonth()+1,Day.getDate()),\r\n\t\t\t\ttext:TxtIndex>-1? this.txtdateArray[TxtIndex]['text']:\"\"\r\n\t\t\t})\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\treturn dateArray;\r\n\t}\r\n\r\n\r\n}\r\n\r\nexport default calendar;","\r\n\r\n/**\r\n * 签名版,钢笔效果\r\n * 源参考:https://www.cnblogs.com/fangsmile/p/14324460.html\r\n */\r\n\r\n\r\n\r\nclass Point {\r\n constructor(x, y, time) {\r\n this.x = x;\r\n this.y = y;\r\n this.isControl = false;\r\n this.time = Date.now();\r\n this.lineWidth = 0;\r\n this.isAdd = false;\r\n }\r\n}\r\n\r\nclass Line {\r\n constructor() {\r\n this.points = new Array();\r\n this.changeWidthCount = 0;\r\n this.lineWidth = 10;\r\n }\r\n}\r\nclass HandwritingSelf {\r\n\r\n constructor(canvas,w,h,line_w=8,line_color='#ff0000') {\r\n\t\t\r\n this.canvas = {width:w,height:h};\r\n this.ctx = canvas\r\n\t\tvar context = this.ctx;\r\n\t\tthis.ctx.ellipse = function( x, y, a, b){\r\n\t\t // ----\r\n\t\t}\r\n // this.points = new Array();\r\n this.line = new Line();\r\n this.pointLines = new Array();//Line数组\r\n this.k = 0.5;\r\n this.begin = null;\r\n this.middle = null;\r\n this.end = null;\r\n this.preTime = null;\r\n this.lineWidth = line_w;\r\n this.lineColor = line_color;\r\n this.isDown = false;\r\n }\r\n down(x, y) {\r\n this.isDown = true;\r\n this.line = new Line();\r\n this.line.lineWidth = this.lineWidth;\r\n let currentPoint = new Point(x, y, Date.now());\r\n this.addPoint(currentPoint);\r\n\r\n this.preTime = Date.now();\r\n }\r\n move(x, y) {\r\n // console.log(\"move:\",x,y)\r\n if (this.isDown) {\r\n let currentPoint = new Point(x, y, Date.now())\r\n this.addPoint(currentPoint);\r\n this.draw();\r\n }\r\n }\r\n up(x, y) {\r\n // if (e.touches.length > 0) {\r\n let currentPoint = new Point(x, y, Date.now())\r\n this.addPoint(currentPoint);\r\n // }\r\n this.draw(true);\r\n\r\n this.pointLines.push(this.line);\r\n\r\n this.begin = null;\r\n this.middle = null;\r\n this.end = null;\r\n this.isDown = false;\r\n }\r\n draw(isUp = false) {\r\n // this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.setStrokeStyle(this.lineColor)\r\n\r\n\r\n //绘制不包含this.line的线条\r\n this.pointLines.forEach((line, index) => {\r\n let points = line.points;\r\n this.ctx.beginPath();\r\n this.ctx.ellipse(points[0].x - 1.5, points[0].y, 6, 3, Math.PI / 4, 0, Math.PI * 2);\r\n this.ctx.fill();\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(points[0].x, points[0].y);\r\n let lastW = line.lineWidth;\r\n this.ctx.setLineWidth(line.lineWidth);\r\n this.ctx.setLineJoin(\"round\");\r\n this.ctx.setLineCap( \"round\");\r\n let minLineW = line.lineWidth / 4;\r\n let isChangeW = false;\r\n\r\n let changeWidthCount = line.changeWidthCount;\r\n for (let i = 1; i <= points.length; i++) {\r\n if (i == points.length) {\r\n this.ctx.stroke();\r\n break;\r\n }\r\n if (i > points.length - changeWidthCount) {\r\n if (!isChangeW) {\r\n this.ctx.stroke();//将之前的线条不变的path绘制完\r\n isChangeW = true;\r\n if (i > 1 && points[i - 1].isControl)\r\n continue;\r\n }\r\n let w = (lastW - minLineW) / changeWidthCount * (points.length - i) + minLineW;\r\n points[i - 1].lineWidth = w;\r\n this.ctx.beginPath();//为了开启新的路径 否则每次stroke 都会把之前的路径在描一遍\r\n // this.ctx.strokeStyle = \"rgba(\"+Math.random()*255+\",\"+Math.random()*255+\",\"+Math.random()*255+\",1)\";\r\n this.ctx.setLineWidth(w);\r\n this.ctx.moveTo(points[i - 1].x, points[i - 1].y);//移动到之前的点\r\n this.ctx.lineTo(points[i].x, points[i].y);\r\n this.ctx.stroke();//将之前的线条不变的path绘制完\r\n } else {\r\n if (points[i].isControl && points[i + 1]) {\r\n this.ctx.quadraticCurveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);\r\n } else if (i >= 1 && points[i - 1].isControl) {//上一个是控制点 当前点已经被绘制\r\n } else\r\n this.ctx.lineTo(points[i].x, points[i].y);\r\n }\r\n }\r\n })\r\n\r\n //绘制this.line线条\r\n let points;\r\n if (isUp)\r\n points = this.line.points;\r\n else\r\n points = [...this.line.points];\r\n //当前绘制的线条最后几个补点 贝塞尔方式增加点\r\n let count = 0;\r\n let insertCount = 0;\r\n let i = points.length - 1;\r\n let endPoint = points[i];\r\n let controlPoint;\r\n let startPoint;\r\n while (i >= 0) {\r\n if (points[i].isControl == true) {\r\n controlPoint = points[i];\r\n count++;\r\n } else {\r\n startPoint = points[i];\r\n }\r\n if (startPoint && controlPoint && endPoint) {//使用贝塞尔计算补点\r\n let dis = this.z_distance(startPoint, controlPoint) + this.z_distance(controlPoint, endPoint);\r\n let insertPoints = this.BezierCalculate([startPoint, controlPoint, endPoint], Math.floor(dis / 6) + 1);\r\n insertCount += insertPoints.length;\r\n var index = i;//插入位置\r\n // 把insertPoints 变成一个适合splice的数组(包含splice前2个参数的数组) \r\n insertPoints.unshift(index, 1);\r\n Array.prototype.splice.apply(points, insertPoints);\r\n\r\n //补完点后\r\n endPoint = startPoint;\r\n startPoint = null;\r\n }\r\n if (count >= 6)\r\n break;\r\n i--;\r\n }\r\n //确定最后线宽变化的点数\r\n let changeWidthCount = count + insertCount;\r\n if (isUp)\r\n this.line.changeWidthCount = changeWidthCount;\r\n \r\n //制造椭圆头\r\n this.ctx.fillStyle = \"rgba(255,20,87,1)\"\r\n this.ctx.beginPath();\r\n this.ctx.ellipse(points[0].x - 1.5, points[0].y, 6, 3, Math.PI / 4, 0, Math.PI * 2);\r\n this.ctx.fill();\r\n\t\tthis.ctx.draw(true);\r\n\t\t\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(points[0].x, points[0].y);\r\n let lastW = this.line.lineWidth;\r\n this.ctx.setLineWidth(this.line.lineWidth);\r\n this.ctx.setLineJoin(\"round\");\r\n this.ctx.setLineCap( \"round\");\r\n let minLineW = this.line.lineWidth / 4;\r\n let isChangeW = false;\r\n for (let i = 1; i <= points.length; i++) {\r\n if (i == points.length) {\r\n this.ctx.stroke();\r\n break;\r\n }\r\n //最后的一些点线宽变细\r\n if (i > points.length - changeWidthCount) {\r\n if (!isChangeW) {\r\n this.ctx.stroke();//将之前的线条不变的path绘制完\r\n isChangeW = true;\r\n if (i > 1 && points[i - 1].isControl)\r\n continue;\r\n }\r\n\r\n //计算线宽\r\n let w = (lastW - minLineW) / changeWidthCount * (points.length - i) + minLineW;\r\n points[i - 1].lineWidth = w;\r\n this.ctx.beginPath();//为了开启新的路径 否则每次stroke 都会把之前的路径在描一遍\r\n // this.ctx.strokeStyle = \"rgba(\" + Math.random() * 255 + \",\" + Math.random() * 255 + \",\" + Math.random() * 255 + \",0.5)\";\r\n this.ctx.setLineWidth(w);\r\n this.ctx.moveTo(points[i - 1].x, points[i - 1].y);//移动到之前的点\r\n this.ctx.lineTo(points[i].x, points[i].y);\r\n this.ctx.stroke();//将之前的线条不变的path绘制完\r\n } else {\r\n if (points[i].isControl && points[i + 1]) {\r\n this.ctx.quadraticCurveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);\r\n } else if (i >= 1 && points[i - 1].isControl) {//上一个是控制点 当前点已经被绘制\r\n } else\r\n this.ctx.lineTo(points[i].x, points[i].y);\r\n }\r\n }\r\n\t\tthis.ctx.draw(true);\r\n }\r\n\r\n addPoint(p) {\r\n if (this.line.points.length >= 1) {\r\n let last_point = this.line.points[this.line.points.length - 1]\r\n let distance = this.z_distance(p, last_point);\r\n if (distance < 10) {\r\n return;\r\n }\r\n }\r\n\r\n if (this.line.points.length == 0) {\r\n this.begin = p;\r\n p.isControl = true;\r\n this.pushPoint(p);\r\n } else {\r\n this.middle = p;\r\n let controlPs = this.computeControlPoints(this.k, this.begin, this.middle, null);\r\n this.pushPoint(controlPs.first);\r\n this.pushPoint(p);\r\n p.isControl = true;\r\n\r\n this.begin = this.middle;\r\n }\r\n }\r\n\r\n addOtherPoint(p1, p2, w1, w2) {\r\n\r\n let otherPoints = new Array();\r\n let dis = this.z_distance(p1, p2);\r\n if (dis >= 25) {\r\n otherPoints.push(p1);\r\n let insertPCount = Math.floor(dis / 20);\r\n for (let j = 0; j < insertPCount; j++) {\r\n let insertP = new Point(p1.x + (j + 1) / (insertPCount + 1) * (p2.x - p1.x), p1.y + (j + 1) / (insertPCount + 1) * (p2.y - p1.y))\r\n insertP.isAdd = true;\r\n otherPoints.push(insertP);\r\n }\r\n otherPoints.push(p2);\r\n }\r\n let count = otherPoints.length;\r\n if (count > 0) {\r\n console.log(\"addOtherPoint\")\r\n debugger\r\n let diffW = (w2 - w1) / (count - 1);\r\n for (let i = 1; i < count; i++) {\r\n let w = w1 + diffW * i;\r\n this.ctx.beginPath();\r\n this.ctx.setLineWidth(w);\r\n this.ctx.moveTo(otherPoints[i - 1].x, otherPoints[i - 1].y);\r\n this.ctx.lineTo(otherPoints[i].x, otherPoints[i].y)\r\n this.ctx.stroke();\r\n }\r\n }\r\n return otherPoints\r\n }\r\n pushPoint(p) {\r\n //排除重复点\r\n if (this.line.points.length >= 1 && this.line.points[this.line.points.length - 1].x == p.x && this.line.points[this.line.points.length - 1].y == p.y)\r\n return;\r\n this.line.points.push(p);\r\n }\r\n computeControlPoints(k, begin, middle, end) {\r\n if (k > 0.5 || k <= 0)\r\n return;\r\n\r\n let diff1 = new Point(middle.x - begin.x, middle.y - begin.y)\r\n let diff2 = null;\r\n if (end)\r\n diff2 = new Point(end.x - middle.x, end.y - middle.y)\r\n\r\n // let l1 = (diff1.x ** 2 + diff1.y ** 2) ** (1 / 2)\r\n // let l2 = (diff2.x ** 2 + diff2.y ** 2) ** (1 / 2)\r\n\r\n let first = new Point(middle.x - (k * diff1.x), middle.y - (k * diff1.y))\r\n let second = null;\r\n if (diff2)\r\n second = new Point(middle.x + (k * diff2.x), middle.y + (k * diff2.y))\r\n return { first: first, second: second }\r\n }\r\n // W_current = \r\n // W_previous + min( abs(k*s - W_previous), distance * K_width_unit_change) (k * s-W_previous) >= 0\r\n // W_previous - min( abs(k*s - W_previous), distance * K_width_unit_change) (k * s-W_previous) < 0\r\n // W_current 当前线段的宽度\r\n // W_previous 与当前线条相邻的前一条线段的宽度\r\n // distance \t 当前线条的长度\r\n // w_k \t设定的一个固定阈值,表示:单位距离内, 笔迹的线条宽度可以变化的最大量. \r\n // distance * w_k 即为当前线段的长度内, 笔宽可以相对于前一条线段笔宽的基础上, 最多能够变宽或者可以变窄多少.\r\n z_linewidth(b, e, bwidth, step) {\r\n\r\n if (e.time == b.time)\r\n return bwidth;\r\n\r\n let max_speed = 2.0;\r\n let d = this.z_distance(b, e);\r\n let s = d / (e.time - b.time);//计算速度\r\n console.log(\"s\", e.time - b.time, s)\r\n s = s > max_speed ? max_speed : s;\r\n\r\n // let w = (max_speed - s) / max_speed;\r\n let w = 0.5 / s;\r\n\r\n let max_dif = d * step;\r\n console.log(w, bwidth, max_dif)\r\n if (w < 0.05) w = 0.05;\r\n if (Math.abs(w - bwidth) > max_dif) {\r\n if (w > bwidth)\r\n w = bwidth + max_dif;\r\n else\r\n w = bwidth - max_dif;\r\n }\r\n // printf(\"d:%.4f, time_diff:%lld, speed:%.4f, width:%.4f\\n\", d, e.t-b.t, s, w);\r\n return w;\r\n }\r\n z_distance(b, e) {\r\n return Math.sqrt(Math.pow(e.x - b.x, 2) + Math.pow(e.y - b.y, 2));\r\n }\r\n BezierCalculate(poss, precision) {\r\n\r\n //维度,坐标轴数(二维坐标,三维坐标...)\r\n let dimersion = 2;\r\n\r\n //贝塞尔曲线控制点数(阶数)\r\n let number = poss.length;\r\n\r\n //控制点数不小于 2 ,至少为二维坐标系\r\n if (number < 2 || dimersion < 2)\r\n return null;\r\n\r\n let result = new Array();\r\n\r\n //计算杨辉三角\r\n let mi = new Array();\r\n mi[0] = mi[1] = 1;\r\n for (let i = 3; i <= number; i++) {\r\n\r\n let t = new Array();\r\n for (let j = 0; j < i - 1; j++) {\r\n t[j] = mi[j];\r\n }\r\n\r\n mi[0] = mi[i - 1] = 1;\r\n for (let j = 0; j < i - 2; j++) {\r\n mi[j + 1] = t[j] + t[j + 1];\r\n }\r\n }\r\n\r\n //计算坐标点\r\n for (let i = 0; i < precision; i++) {\r\n let t = i / precision;\r\n let p = new Point(0, 0);\r\n p.isAdd = true;\r\n result.push(p);\r\n for (let j = 0; j < dimersion; j++) {\r\n let temp = 0.0;\r\n for (let k = 0; k < number; k++) {\r\n temp += Math.pow(1 - t, number - k - 1) * (j == 0 ? poss[k].x : poss[k].y) * Math.pow(t, k) * mi[k];\r\n }\r\n j == 0 ? p.x = temp : p.y = temp;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n\r\nexport default HandwritingSelf;","function choujiang(prizes) {\r\n var prizeList = [] //按照权重分解后的奖品数组\r\n prizes.map(function(item){\r\n prizeList.push({\r\n \r\n\t\t\t...item\r\n })\r\n for(var i=0; i< item.gailv; i++) {\r\n prizeList.push({\r\n \r\n ...item\r\n })\r\n }\r\n });\r\n prizeList = reset(prizeList);\r\n // 范围随机数\r\n function randomFrom(lowerValue, upperValue) {\r\n return Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue);\r\n };\r\n // 随机打乱数组\r\n function reset(arr) {\r\n var eachArr = arr.concat([])\r\n var lastArr = []\r\n function deepEach(deepArr) {\r\n if (deepArr.length) {\r\n var randomIndex = randomFrom(0, eachArr.length - 1)\r\n lastArr.push(eachArr[randomIndex])\r\n eachArr.splice(randomIndex, 1)\r\n deepEach(eachArr)\r\n }\r\n }\r\n deepEach(eachArr)\r\n return lastArr\r\n }\r\n this.getResult = function() {\r\n var random = randomFrom(0, prizeList.length - 1);\r\n return prizeList[random]\r\n }\r\n}\r\n\r\nexport default choujiang;","/**\r\n * 创建时间:2021年7月2日11:24:23\r\n * 作者:tmzdy\r\n */\r\nlet ver = '2.0.0';\r\nexport default {\r\n\tv: ver,\r\n\tversion: ver,\r\n\tV:ver,\r\n\tver:ver\r\n}","import Vue from 'vue'\r\nimport Vuex from 'vuex'\r\nVue.use(Vuex)\r\n\r\nlet moduleTrue = {};\r\n// 为了兼容如果用户,不按规范创建,或者不使用vuex时就可略过导入用户的模块。\r\ntry {\r\n\tconst modulesList = require.context('@/store', true, /\\.js$/);\r\n\r\n\tif (typeof modulesList === 'function' && typeof modulesList !== 'undefined') {\r\n\t\t// 加载modules目录下所有文件(分模块)\r\n\t\tconst modules = modulesList.keys().reduce((modules, modulePath) => {\r\n\t\t\tconst moduleName = modulePath.replace(/^\\.\\/(.*)\\.\\w+$/, '$1')\r\n\t\t\tconst value = modulesList(modulePath)\r\n\t\t\tmodules[moduleName] = { namespaced: true, ...value.default }\r\n\t\t\treturn modules\r\n\t\t}, {});\r\n\t\tmoduleTrue = modules;\r\n\t}\r\n\r\n} catch (e) {\r\n\t//TODO handle the exception\r\n\t// console.warn('tmui提醒:用户未使用vuex')\r\n\tconsole.error('如果未使用vuex,不用理会,如果使用了vuex报错请检错误信息:',e);\r\n}\r\nlet pdefault_cookies_color = uni.getStorageSync('setTmVuetifyColor')\r\nlet pdefault_cookies_black = uni.getStorageSync('setTmVuetifyBlack')\r\n\r\n\r\n\r\nconst store = new Vuex.Store({\r\n\tmodules: {\r\n\t\t...moduleTrue\r\n\t},\r\n\tstate: {\r\n\t\ttmVuetify: {\r\n\t\t\tcolor: typeof pdefault_cookies_color === 'string' ? pdefault_cookies_color : '',\r\n\t\t\tblack: typeof pdefault_cookies_black === 'boolean' ? pdefault_cookies_black : false,\r\n\t\t\ttmVueTifly_pages: '',\r\n\t\t\ttmVueTifly_pagesIndex: '',\r\n\t\t\t//这里是微信小程序和微信H5的配置资料。\r\n\t\t\twxshareConfig_miniMp: {\r\n\t\t\t\ttitle: '', \t\t// 分享标题\r\n\t\t\t\tdesc: '', \t\t// 描述\r\n\t\t\t\timageUrl: '', \t\t// 分享图片\r\n\t\t\t\tpath: '', \t\t// 分享路径\r\n\t\t\t\tcopyLink: '', \t// 复制链接\r\n\t\t\t\tquery: {},\t\t// 分享参数\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tgetters: {\r\n\t\t// $tm:state=>{\r\n\t\t// \treturn $tm;\r\n\t\t// }\r\n\t\t\r\n\t},\r\n\tmutations: {\r\n\t\tsetTmVuetifyColor(state, color) {\r\n\t\t\tVue.set(state.tmVuetify, 'color', color)\r\n\t\t},\r\n\t\tsetPageNow(state, url) {\r\n\t\t\tVue.set(state.tmVuetify, 'tmVueTifly_pages', url);\r\n\t\t},\r\n\t\tsetPageNowIndex(state, index) {\r\n\t\t\tVue.set(state.tmVuetify, 'tmVueTifly_pagesIndex', index);\r\n\t\t},\r\n\t\tsetTmVuetifyBlack(state, black) {\r\n\t\t\tVue.set(state.tmVuetify, 'black', black)\r\n\t\t\tif (black === true) {\r\n\t\t\t\tuni.setTabBarStyle({\r\n\t\t\t\t\tbackgroundColor: \"#212121\"\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tuni.setTabBarStyle({\r\n\t\t\t\t\tbackgroundColor: \"#FFFFFF\"\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\tsetWxShare(state, cfg) {\r\n\t\t\t\r\n\t\t\tlet pcf = cfg||{};\r\n\t\t\tif(typeof pcf !=='object' || Array.isArray(cfg)) pcf = {}; \r\n\t\t\tVue.set(state.tmVuetify, 'wxshareConfig_miniMp', { ...state.tmVuetify.wxshareConfig_miniMp,...pcf});\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n})\r\n\r\nexport default store;","/*!\n * vuex v3.6.2\n * (c) 2021 Evan You\n * @license MIT\n */\n'use strict';\n\nfunction applyMixin (Vue) {\n var version = Number(Vue.version.split('.')[0]);\n\n if (version >= 2) {\n Vue.mixin({ beforeCreate: vuexInit });\n } else {\n // override init and inject vuex init procedure\n // for 1.x backwards compatibility.\n var _init = Vue.prototype._init;\n Vue.prototype._init = function (options) {\n if ( options === void 0 ) options = {};\n\n options.init = options.init\n ? [vuexInit].concat(options.init)\n : vuexInit;\n _init.call(this, options);\n };\n }\n\n /**\n * Vuex init hook, injected into each instances init hooks list.\n */\n\n function vuexInit () {\n var options = this.$options;\n // store injection\n if (options.store) {\n this.$store = typeof options.store === 'function'\n ? options.store()\n : options.store;\n } else if (options.parent && options.parent.$store) {\n this.$store = options.parent.$store;\n }\n }\n}\n\nvar target = typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n if (!devtoolHook) { return }\n\n store._devtoolHook = devtoolHook;\n\n devtoolHook.emit('vuex:init', store);\n\n devtoolHook.on('vuex:travel-to-state', function (targetState) {\n store.replaceState(targetState);\n });\n\n store.subscribe(function (mutation, state) {\n devtoolHook.emit('vuex:mutation', mutation, state);\n }, { prepend: true });\n\n store.subscribeAction(function (action, state) {\n devtoolHook.emit('vuex:action', action, state);\n }, { prepend: true });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\nfunction find (list, f) {\n return list.filter(f)[0]\n}\n\n/**\n * Deep copy the given object considering circular structure.\n * This function caches all nested objects and its copies.\n * If it detects circular structure, use cached copy to avoid infinite loop.\n *\n * @param {*} obj\n * @param {Array