(this.nativeLog||function(e){console.log(e)})("START JS FRAMEWORK 0.26.16, Build 2018-06-20 14:57. (Vue: 2.5.13-weex.5, Rax: 0.4.20)");var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";var t,c,r,l;function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e,t){return e(t={exports:{}},t.exports),t.exports}Array.from||(Array.from=(t=Object.prototype.toString,c=function(e){return"function"==typeof e||"[object Function]"===t.call(e)},r=Math.pow(2,53)-1,l=function(e){var t,n=(t=Number(e),isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t);return Math.min(Math.max(n,0),r)},function(e){var t=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var n,r=1<arguments.length?arguments[1]:void 0;if(void 0!==r){if(!c(r))throw new TypeError("Array.from: when provided, the second argument must be a function");2<arguments.length&&(n=arguments[2])}for(var o,i=l(t.length),a=c(this)?Object(new this(i)):new Array(i),s=0;s<i;)o=t[s],a[s]=r?void 0===n?r(o,s):r.call(n,o,s):o,s+=1;return a.length=i,a}));var v=n(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),m=n(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),o=(m.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),y=function(e){if(!o(e))throw TypeError(e+" is not an object!");return e},i=function(e){try{return!!e()}catch(e){return!0}},a=!i(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),s=v.document,u=o(s)&&o(s.createElement),f=function(e){return u?s.createElement(e):{}},p=!a&&!i(function(){return 7!=Object.defineProperty(f("div"),"a",{get:function(){return 7}}).a}),d=Object.defineProperty,h={f:a?Object.defineProperty:function(e,t,n){if(y(e),t=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}(t,!0),y(n),p)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},k=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},S=a?function(e,t,n){return h.f(e,t,k(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},b=0,w=Math.random(),O=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},C=n(function(e){var i=O("src"),t="toString",n=Function[t],a=(""+n).split(t);m.inspectSource=function(e){return n.call(e)},(e.exports=function(e,t,n,r){var o="function"==typeof n;o&&(_(n,"name")||S(n,"name",t)),e[t]!==n&&(o&&(_(n,i)||S(n,i,e[t]?""+e[t]:a.join(String(t)))),e===v?e[t]=n:r?e[t]?e[t]=n:S(e,t,n):(delete e[t],S(e,t,n)))})(Function.prototype,t,function(){return"function"==typeof this&&this[i]||n.call(this)})}),x=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(r,o,e){if(x(r),void 0===o)return r;switch(e){case 1:return function(e){return r.call(o,e)};case 2:return function(e,t){return r.call(o,e,t)};case 3:return function(e,t,n){return r.call(o,e,t,n)}}return function(){return r.apply(o,arguments)}},$="prototype",A=function(e,t,n){var r,o,i,a,s=e&A.F,c=e&A.G,l=e&A.S,u=e&A.P,f=e&A.B,p=c?v:l?v[t]||(v[t]={}):(v[t]||{})[$],d=c?m:m[t]||(m[t]={}),h=d[$]||(d[$]={});for(r in c&&(n=t),n)i=((o=!s&&p&&void 0!==p[r])?p:n)[r],a=f&&o?E(i,v):u&&"function"==typeof i?E(Function.call,i):i,p&&C(p,r,i,e&A.U),d[r]!=i&&S(d,r,a),u&&h[r]!=i&&(h[r]=i)};v.core=m,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;var j,I=A,M={}.toString,T=function(e){return M.call(e).slice(8,-1)},P=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==T(e)?e.split(""):Object(e)},F=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e},N=function(e){return P(F(e))},D=Math.ceil,R=Math.floor,V=function(e){return isNaN(e=+e)?0:(0<e?R:D)(e)},J=Math.min,L=function(e){return 0<e?J(V(e),9007199254740991):0},W=Math.max,q=Math.min,U=n(function(e){var t="__core-js_shared__",n=v[t]||(v[t]={});(e.exports=function(e,t){return n[e]||(n[e]=void 0!==t?t:{})})("versions",[]).push({version:m.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),B=U("keys"),z=function(e){return B[e]||(B[e]=O(e))},H=(j=!1,function(e,t,n){var r,o,i,a=N(e),s=L(a.length),c=(o=s,(r=V(r=n))<0?W(r+o,0):q(r,o));if(j&&t!=t){for(;c<s;)if((i=a[c++])!=i)return!0}else for(;c<s;c++)if((j||c in a)&&a[c]===t)return j||c||0;return!j&&-1}),X=z("IE_PROTO"),G="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),K=Object.keys||function(e){return function(e,t){var n,r=N(e),o=0,i=[];for(n in r)n!=X&&_(r,n)&&i.push(n);for(;t.length>o;)_(r,n=t[o++])&&(~H(i,n)||i.push(n));return i}(e,G)},Z={f:Object.getOwnPropertySymbols},Y={f:{}.propertyIsEnumerable},Q=function(e){return Object(F(e))},ee=Object.assign,te=!ee||i(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=ee({},e)[n]||Object.keys(ee({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Q(e),o=arguments.length,i=1,a=Z.f,s=Y.f;i<o;)for(var c,l=P(n[i++]),u=a?K(l).concat(a(l)):K(l),f=u.length,p=0;p<f;)s.call(l,c=u[p++])&&(r[c]=l[c]);return r}:ee;I(I.S+I.F,"Object",{assign:te});m.Object.assign;Object.setPrototypeOf||(Object.setPrototypeOf=function(t,n){var r;function o(e,t){return r.call(e,t),e}try{(r=t.getOwnPropertyDescriptor(t.prototype,n).set).call({},null)}catch(e){if(t.prototype!=={}[n])return;r=function(e){this[n]=e},o.polyfill=o(o({},null),t.prototype)instanceof t}return o}(Object,"__proto__"));var ne=global.WXEnvironment;ne&&"iOS"===ne.platform&&(global.Promise=void 0);var re=n(function(e){var t=U("wks"),n=v.Symbol,r="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=r&&n[e]||(r?n:O)("Symbol."+e))}).store=t}),oe=re("toStringTag"),ie="Arguments"==T(function(){return arguments}()),ae=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),oe))?n:ie?T(t):"Object"==(r=T(t))&&"function"==typeof t.callee?"Arguments":r},se={};se[re("toStringTag")]="z",se+""!="[object z]"&&C(Object.prototype,"toString",function(){return"[object "+ae(this)+"]"},!0);var ce={},le=a?Object.defineProperties:function(e,t){y(e);for(var n,r=K(t),o=r.length,i=0;i<o;)h.f(e,n=r[i++],t[n]);return e},ue=v.document,fe=ue&&ue.documentElement,pe=z("IE_PROTO"),de=function(){},he="prototype",ve=function(){var e,t=f("iframe"),n=G.length;for(t.style.display="none",fe.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),ve=e.F;n--;)delete ve[he][G[n]];return ve()},me=Object.create||function(e,t){var n;return null!==e?(de[he]=y(e),n=new de,de[he]=null,n[pe]=e):n=ve(),void 0===t?n:le(n,t)},ye=h.f,ge=re("toStringTag"),_e=function(e,t,n){e&&!_(e=n?e:e.prototype,ge)&&ye(e,ge,{configurable:!0,value:t})},be={};S(be,re("iterator"),function(){return this});var we,ke=z("IE_PROTO"),Se=Object.prototype,Oe=Object.getPrototypeOf||function(e){return e=Q(e),_(e,ke)?e[ke]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Se:null},Ce=re("iterator"),xe=!([].keys&&"next"in[].keys()),Ee="values",$e=function(){return this},Ae=function(e,t,n,r,o,i,a){var s,c,l;c=t,l=r,(s=n).prototype=me(be,{next:k(1,l)}),_e(s,c+" Iterator");var u,f,p,d=function(e){if(!xe&&e in y)return y[e];switch(e){case"keys":case Ee:return function(){return new n(this,e)}}return function(){return new n(this,e)}},h=t+" Iterator",v=o==Ee,m=!1,y=e.prototype,g=y[Ce]||y["@@iterator"]||o&&y[o],_=g||d(o),b=o?v?d("entries"):_:void 0,w="Array"==t&&y.entries||g;if(w&&(p=Oe(w.call(new e)))!==Object.prototype&&p.next&&(_e(p,h,!0),"function"!=typeof p[Ce]&&S(p,Ce,$e)),v&&g&&g.name!==Ee&&(m=!0,_=function(){return g.call(this)}),(xe||m||!y[Ce])&&S(y,Ce,_),ce[t]=_,ce[h]=$e,o)if(u={values:v?_:d(Ee),keys:i?_:d("keys"),entries:b},a)for(f in u)f in y||C(y,f,u[f]);else I(I.P+I.F*(xe||m),t,u);return u},je=(we=!0,function(e,t){var n,r,o=String(F(e)),i=V(t),a=o.length;return i<0||a<=i?we?"":void 0:(n=o.charCodeAt(i))<55296||56319<n||i+1===a||(r=o.charCodeAt(i+1))<56320||57343<r?we?o.charAt(i):n:we?o.slice(i,i+2):r-56320+(n-55296<<10)+65536});Ae(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=je(t,n),this._i+=e.length,{value:e,done:!1})});var Ie=re("unscopables"),Me=Array.prototype;null==Me[Ie]&&S(Me,Ie,{});var Te=function(e){Me[Ie][e]=!0},Pe=function(e,t){return{value:t,done:!!e}},Fe=Ae(Array,"Array",function(e,t){this._t=N(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Pe(1)):Pe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");ce.Arguments=ce.Array,Te("keys"),Te("values"),Te("entries");for(var Ne=re("iterator"),De=re("toStringTag"),Re=ce.Array,Ve={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Je=K(Ve),Le=0;Le<Je.length;Le++){var We,qe=Je[Le],Ue=Ve[qe],Be=v[qe],ze=Be&&Be.prototype;if(ze&&(ze[Ne]||S(ze,Ne,Re),ze[De]||S(ze,De,qe),ce[qe]=Re,Ue))for(We in Fe)ze[We]||C(ze,We,Fe[We],!0)}var He,Xe,Ge,Ke=function(t,e,n,r){try{return r?e(y(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&y(o.call(t)),e}},Ze=re("iterator"),Ye=Array.prototype,Qe=re("iterator"),et=m.getIteratorMethod=function(e){if(null!=e)return e[Qe]||e["@@iterator"]||ce[ae(e)]},tt=n(function(e){var d={},h={},t=e.exports=function(e,t,n,r,o){var i,a,s,c,l,u=o?function(){return e}:et(e),f=E(n,r,t?2:1),p=0;if("function"!=typeof u)throw TypeError(e+" is not iterable!");if(void 0===(l=u)||ce.Array!==l&&Ye[Ze]!==l){for(s=u.call(e);!(a=s.next()).done;)if((c=Ke(s,f,a.value,t))===d||c===h)return c}else for(i=L(e.length);p<i;p++)if((c=t?f(y(a=e[p])[0],a[1]):f(e[p]))===d||c===h)return c};t.BREAK=d,t.RETURN=h}),nt=re("species"),rt=v.process,ot=v.setImmediate,it=v.clearImmediate,at=v.MessageChannel,st=v.Dispatch,ct=0,lt={},ut="onreadystatechange",ft=function(){var e=+this;if(lt.hasOwnProperty(e)){var t=lt[e];delete lt[e],t()}},pt=function(e){ft.call(e.data)};ot&&it||(ot=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return lt[++ct]=function(){!function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}e.apply(n,t)}("function"==typeof e?e:Function(e),n)},He(ct),ct},it=function(e){delete lt[e]},"process"==T(rt)?He=function(e){rt.nextTick(E(ft,e,1))}:st&&st.now?He=function(e){st.now(E(ft,e,1))}:at?(Ge=(Xe=new at).port2,Xe.port1.onmessage=pt,He=E(Ge.postMessage,Ge,1)):v.addEventListener&&"function"==typeof postMessage&&!v.importScripts?(He=function(e){v.postMessage(e+"","*")},v.addEventListener("message",pt,!1)):He=ut in f("script")?function(e){fe.appendChild(f("script"))[ut]=function(){fe.removeChild(this),ft.call(e)}}:function(e){setTimeout(E(ft,e,1),0)});var dt={set:ot,clear:it},ht=dt.set,vt=v.MutationObserver||v.WebKitMutationObserver,mt=v.process,yt=v.Promise,gt="process"==T(mt);var _t={f:function(e){return new function(e){var n,r;this.promise=new e(function(e,t){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=e,r=t}),this.resolve=x(n),this.reject=x(r)}(e)}},bt=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},wt=v.navigator,kt=wt&&wt.userAgent||"",St=re("species"),Ot=re("iterator"),Ct=!1;try{[7][Ot]().return=function(){Ct=!0}}catch(e){}var xt,Et,$t,At,jt,It=dt.set,Mt=function(){var n,r,o,e=function(){var e,t;for(gt&&(e=mt.domain)&&e.exit();n;){t=n.fn,n=n.next;try{t()}catch(e){throw n?o():r=void 0,e}}r=void 0,e&&e.enter()};if(gt)o=function(){mt.nextTick(e)};else if(!vt||v.navigator&&v.navigator.standalone)if(yt&&yt.resolve){var t=yt.resolve(void 0);o=function(){t.then(e)}}else o=function(){ht.call(v,e)};else{var i=!0,a=document.createTextNode("");new vt(e).observe(a,{characterData:!0}),o=function(){a.data=i=!i}}return function(e){var t={fn:e,next:void 0};r&&(r.next=t),n||(n=t,o()),r=t}}(),Tt="Promise",Pt=v.TypeError,Ft=v.process,Nt=Ft&&Ft.versions,Dt=Nt&&Nt.v8||"",Rt=v[Tt],Vt="process"==ae(Ft),Jt=function(){},Lt=Et=_t.f,Wt=!!function(){try{var e=Rt.resolve(1),t=(e.constructor={})[re("species")]=function(e){e(Jt,Jt)};return(Vt||"function"==typeof PromiseRejectionEvent)&&e.then(Jt)instanceof t&&0!==Dt.indexOf("6.6")&&-1===kt.indexOf("Chrome/66")}catch(e){}}(),qt=function(e){var t;return!(!o(e)||"function"!=typeof(t=e.then))&&t},Ut=function(u,n){if(!u._n){u._n=!0;var r=u._c;Mt(function(){for(var c=u._v,l=1==u._s,e=0,t=function(e){var t,n,r,o=l?e.ok:e.fail,i=e.resolve,a=e.reject,s=e.domain;try{o?(l||(2==u._h&&Ht(u),u._h=1),!0===o?t=c:(s&&s.enter(),t=o(c),s&&(s.exit(),r=!0)),t===e.promise?a(Pt("Promise-chain cycle")):(n=qt(t))?n.call(t,i,a):i(t)):a(c)}catch(e){s&&!r&&s.exit(),a(e)}};r.length>e;)t(r[e++]);u._c=[],u._n=!1,n&&!u._h&&Bt(u)})}},Bt=function(i){It.call(v,function(){var e,t,n,r=i._v,o=zt(i);if(o&&(e=bt(function(){Vt?Ft.emit("unhandledRejection",r,i):(t=v.onunhandledrejection)?t({promise:i,reason:r}):(n=v.console)&&n.error&&n.error("Unhandled promise rejection",r)}),i._h=Vt||zt(i)?2:1),i._a=void 0,o&&e.e)throw e.v})},zt=function(e){return 1!==e._h&&0===(e._a||e._c).length},Ht=function(t){It.call(v,function(){var e;Vt?Ft.emit("rejectionHandled",t):(e=v.onrejectionhandled)&&e({promise:t,reason:t._v})})},Xt=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Ut(t,!0))},Gt=function(e){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw Pt("Promise can't be resolved itself");(n=qt(e))?Mt(function(){var t={_w:r,_d:!1};try{n.call(e,E(Gt,t,1),E(Xt,t,1))}catch(e){Xt.call(t,e)}}):(r._v=e,r._s=1,Ut(r,!1))}catch(e){Xt.call({_w:r,_d:!1},e)}}};Wt||(Rt=function(e){!function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!")}(this,Rt,Tt,"_h"),x(e),xt.call(this);try{e(E(Gt,this,1),E(Xt,this,1))}catch(e){Xt.call(this,e)}},(xt=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=function(e,t,n){for(var r in t)C(e,r,t[r],n);return e}(Rt.prototype,{then:function(e,t){var n,r,o,i=Lt((n=Rt,void 0===(o=y(this).constructor)||null==(r=y(o)[nt])?n:x(r)));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=Vt?Ft.domain:void 0,this._c.push(i),this._a&&this._a.push(i),this._s&&Ut(this,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),$t=function(){var e=new xt;this.promise=e,this.resolve=E(Gt,e,1),this.reject=E(Xt,e,1)},_t.f=Lt=function(e){return e===Rt||e===At?new $t(e):Et(e)}),I(I.G+I.W+I.F*!Wt,{Promise:Rt}),_e(Rt,Tt),jt=v[Tt],a&&jt&&!jt[St]&&h.f(jt,St,{configurable:!0,get:function(){return this}}),At=m[Tt],I(I.S+I.F*!Wt,Tt,{reject:function(e){var t=Lt(this);return(0,t.reject)(e),t.promise}}),I(I.S+I.F*!Wt,Tt,{resolve:function(e){return function(e,t){if(y(e),o(t)&&t.constructor===e)return t;var n=_t.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),I(I.S+I.F*!(Wt&&function(e,t){if(!t&&!Ct)return!1;var n=!1;try{var r=[7],o=r[Ot]();o.next=function(){return{done:n=!0}},r[Ot]=function(){return o},e(r)}catch(e){}return n}(function(e){Rt.all(e).catch(Jt)})),Tt,{all:function(e){var a=this,t=Lt(a),s=t.resolve,c=t.reject,n=bt(function(){var r=[],o=0,i=1;tt(e,!1,function(e){var t=o++,n=!1;r.push(void 0),i++,a.resolve(e).then(function(e){n||(n=!0,r[t]=e,--i||s(r))},c)}),--i||s(r)});return n.e&&c(n.v),t.promise},race:function(e){var t=this,n=Lt(t),r=n.reject,o=bt(function(){tt(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Kt=["off","error","warn","info","log","debug"],Zt={};global.console;function Yt(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return Zt[t]&&Zt[t][e]}function Qt(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}global.setTimeout;var en=global.setTimeoutNative;function tn(t,n,r){if(t.hasOwnProperty(n)){var e=t[n];Object.defineProperty(t,n,{get:function(){return e},set:function(e){if(this===t)throw Error("Cannot assign to read only property "+n+" of "+r);return Object.defineProperty(this,n,{value:e,writable:!0}),e}})}}!function(){if(void 0===setTimeout&&"function"==typeof en){var n={},r=0;global.setTimeout=function(e,t){n[++r]=e,en(r.toString(),t)},global.setTimeoutCallback=function(e){"function"==typeof n[e]&&(n[e](),delete n[e])}}}(),function(){if(Kt.forEach(function(n){var r=Kt.indexOf(n);Zt[n]={},Kt.forEach(function(e){var t=Kt.indexOf(e);t<=r&&(Zt[n][e]=!0)})}),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("debug")&&global.nativeLog.apply(global,Qt(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("log")&&global.nativeLog.apply(global,Qt(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("info")&&global.nativeLog.apply(global,Qt(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("warn")&&global.nativeLog.apply(global,Qt(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("error")&&global.nativeLog.apply(global,Qt(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,o=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:o},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Yt("error")&&console.__ori__.error.apply(console,e)}}}();var nn={framework:"0.26.16",transformer:">=0.1.5 <0.5"};function rn(e,t,n){return t+"@"+n+"#"+e}var on=function(e){this.instanceId=String(e),this.lastCallbackId=0,this.callbacks={},this.hooks={}};on.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},on.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},on.prototype.registerHook=function(e,t,n,r){var o=rn(e,t,n);this.hooks[o]&&console.warn('[JS Framework] Override an existing component hook "'+o+'".'),this.hooks[o]=r},on.prototype.triggerHook=function(e,t,n,r){var o=rn(e,t,n),i=this.hooks[o];if("function"!=typeof i)return console.error("[JS Framework] Invalid hook function type ("+typeof i+') on "'+o+'".'),null;var a=null;try{a=i.apply(null,r||[])}catch(e){console.error('[JS Framework] Failed to execute the hook function on "'+o+'".')}return a},on.prototype.consume=function(e,t,n){var r=this.callbacks[e];return void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r?r(t):new Error('invalid callback id "'+e+'"')},on.prototype.close=function(){this.callbacks={},this.hooks={}};var an=1;function sn(){return(an++).toString()}function cn(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function ln(e){if("function"!=typeof btoa)return"";var t=Array.prototype.map.call(new Uint8Array(e),function(e){return String.fromCharCode(e)}).join("");return btoa(t)}function un(e){if(!e||"object"!=typeof e)return!0;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}var fn={};function pn(e){return fn[e]}function dn(e){var t=fn[e];return t&&t.taskCenter?t.taskCenter:null}function hn(e,t,n){var r=e.documentElement;if(!(0<r.pureChildren.length||t.parentNode)){var o,i,a=r.children,s=a.indexOf(n);s<0?a.push(t):a.splice(s,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,mn(t,r)):(t.children.forEach(function(e){e.parentNode=t}),vn(e,t),t.docId=e.id,t.ownerDocument=e,mn(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),o=e,i=t.toJSON(),o&&o.taskCenter&&"function"==typeof o.taskCenter.send&&o.taskCenter.send("dom",{action:"createBody"},[i])):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function vn(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function mn(t,e){(t.parentNode=e).docId&&(t.docId=e.docId,t.ownerDocument=e.ownerDocument,(t.ownerDocument.nodeMap[t.nodeId]=t).depth=e.depth+1),t.children.forEach(function(e){mn(e,t)})}function yn(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function gn(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function _n(e,t,n,r){n<0&&(n=0);var o=t[n-1],i=t[n];return t.splice(n,0,e),r&&(o&&(o.nextSibling=e),e.previousSibling=o,(e.nextSibling=i)&&(i.previousSibling=e)),n}function bn(e,t,n,r){var o=t.indexOf(e);if(o<0)return-1;if(r){var i=t[o-1],a=t[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}t.splice(o,1);var s=n;o<=n&&(s=n-1);var c=t[s-1],l=t[s];return t.splice(s,0,e),r&&(c&&(c.nextSibling=e),e.previousSibling=c,(e.nextSibling=l)&&(l.previousSibling=e)),o===s?-1:n}function wn(e,t,n){var r=t.indexOf(e);if(!(r<0)){if(n){var o=t[r-1],i=t[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}t.splice(r,1)}}var kn,Sn=function(){this.nodeId=sn(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};Sn.prototype.destroy=function(){var e=pn(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var On={};var Cn="div",xn=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"];function En(e,t){pn(e).nodeMap[t.nodeId]=t}var $n=function(o){function e(e,t,n){void 0===e&&(e=Cn),o.call(this);var r=On[e];if(r&&!n)return new r(e,t,!0);t=t||{},this.nodeType=1,this.nodeId=sn(),this.ref=this.nodeId,this.type=e,this.attr=t.attr||{},this.style=t.style||{},this.classStyle=t.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return o&&(e.__proto__=o),((e.prototype=Object.create(o&&o.prototype)).constructor=e).prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(bn(e,this.children,this.children.length,!0),1===e.nodeType){var t=bn(e,this.pureChildren,this.pureChildren.length),n=dn(this.docId);if(n&&0<=t)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(mn(e,this),_n(e,this.children,this.children.length,!0),this.docId&&En(this.docId,e),1===e.nodeType){_n(e,this.pureChildren,this.pureChildren.length);var r=dn(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},e.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(bn(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=yn(t),r=bn(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=dn(this.docId);if(o&&0<=r)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(mn(e,this),_n(e,this.children,this.children.indexOf(t),!0),this.docId&&En(this.docId,e),1===e.nodeType){var i=yn(t),a=_n(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=dn(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},e.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(bn(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=bn(e,this.pureChildren,this.pureChildren.indexOf(gn(t))+1),r=dn(this.docId);if(r&&0<=n)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(mn(e,this),_n(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&En(this.docId,e),1===e.nodeType){var o=_n(e,this.pureChildren,this.pureChildren.indexOf(gn(t))+1),i=dn(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},e.prototype.removeChild=function(e,t){if(e.parentNode&&(wn(e,this.children,!0),1===e.nodeType)){wn(e,this.pureChildren);var n=dn(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},e.prototype.clear=function(){var t=dn(this.docId);t&&this.pureChildren.forEach(function(e){t.send("dom",{action:"removeElement"},[e.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},e.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=dn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},e.prototype.setAttrs=function(e,t){if(!un(e)){var n={};for(var r in e)this.attr[r]!==e[r]&&(this.attr[r]=e[r],n[r]=e[r]);if(!un(n)){var o=dn(this.docId);!t&&o&&o.send("dom",{action:"updateAttrs"},[this.ref,n])}}},e.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=dn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},e.prototype.setStyles=function(e,t){if(!un(e)){var n={};for(var r in e)this.style[r]!==e[r]&&(this.style[r]=e[r],n[r]=e[r]);if(!un(n)){var o=dn(this.docId);!t&&o&&o.send("dom",{action:"updateStyle"},[this.ref,n])}}},e.prototype.setClassStyle=function(e){for(var t in this.classStyle)this.classStyle[t]="";Object.assign(this.classStyle,e);var n=dn(this.docId);n&&n.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},e.prototype.addEvent=function(e,t,n){if(this.event||(this.event={}),!this.event[e]){this.event[e]={handler:t,params:n};var r=dn(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,e])}},e.prototype.removeEvent=function(e){if(this.event&&this.event[e]){delete this.event[e];var t=dn(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},e.prototype.fireEvent=function(e,t,n,r){var o=null,i=!1,a=this.event[e];if(a&&t){var s=a.handler;t.stopPropagation=function(){i=!0},o=r&&r.params?s.call.apply(s,[this].concat(r.params,[t])):s.call(this,t)}return!i&&n&&-1!==xn.indexOf(e)&&this.parentNode&&this.parentNode.fireEvent&&(t.currentTarget=this.parentNode,this.parentNode.fireEvent(e,t,n)),o},e.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},e.prototype.toJSON=function(){var e={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},t=[];for(var n in this.event){var r=this.event[n].params;r?t.push({type:n,params:r}):t.push(n)}return t.length&&(e.event=t),this.pureChildren.length&&(e.children=this.pureChildren.map(function(e){return e.toJSON()})),e},e.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(e){return e.toString()}).join("")+"</"+this.type+">"},e}(Sn);kn=$n;var An=function(){},jn=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:String(e)}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new on(e)}),An=t||function(){}};function In(e,t){var n=pn(e);return n?Array.isArray(t)?t.map(function(e){switch(e.method){case"callback":return function(e,t,n,r){return e.taskCenter.callback(t,n,r)}.apply(void 0,[n].concat(e.args));case"fireEventSync":case"fireEvent":return function(e,t,n,r,o,i){var a=e.getRef(t);return a?e.fireEvent(a,n,r,o,i):new Error('invalid element reference "'+t+'"')}.apply(void 0,[n].concat(e.args));case"componentHook":return function(e,t,n,r,o){if(!e||!e.taskCenter)return console.error('[JS Framework] Can\'t find "document" or "taskCenter".'),null;var i=null;try{i=e.taskCenter.triggerHook(t,n,r,o)}catch(e){console.error('[JS Framework] Failed to trigger the "'+n+"@"+r+'" hook on '+t+".")}return i}.apply(void 0,[n].concat(e.args))}}):void 0:new Error("[JS Framework] Failed to receiveTasks, instance ("+e+") is not available.")}jn.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},jn.prototype.registerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).registerHook.apply(e,t)},jn.prototype.triggerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).triggerHook.apply(e,t)},jn.prototype.updateData=function(e,t,n){this.send("module",{module:"dom",method:"updateComponentData"},[e,t,n])},jn.prototype.destroyCallback=function(){return this.callbackManager.close()},jn.prototype.normalize=function(e,t){var n=this;void 0===t&&(t=!1);var r=cn(e);if(e&&e instanceof $n)return e.ref;if(e&&e._isVue&&e.$el instanceof $n)return e.$el.ref;if("Function"===r)return this.callbackManager.add(e).toString();if(t){if("Object"===r){var o={};for(var i in e)o[i]=n.normalize(e[i],!0);return o}if("Array"===r)return e.map(function(e){return n.normalize(e,!0)})}return function(e){var t=cn(e);switch(t){case"Undefined":case"Null":return"";case"RegExp":return e.toString();case"Date":return e.toISOString();case"Number":case"String":case"Boolean":case"Array":case"Object":return e;case"ArrayBuffer":return{"@type":"binary",dataType:t,base64:ln(e)};case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":return{"@type":"binary",dataType:t,base64:ln(e.buffer)};default:return JSON.stringify(e)}}(e)},jn.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,c=t.module,l=t.method;switch(n=n.map(function(e){return o.normalize(e)}),"Object"===cn(r)&&(r=this.normalize(r,!0)),e){case"dom":return this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,l,n,Object.assign({component:a},r));default:return this.moduleHandler(this.instanceId,c,l,n,r)}},jn.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},jn.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},jn.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};var Mn={};function Tn(e){var t=function(t){Mn[t]||(Mn[t]={}),e[t].forEach(function(e){"string"==typeof e?Mn[t][e]=!0:Mn[t][e.name]=e.args})};for(var n in e)t(n)}function Pn(e,t){return"string"==typeof t?!(!Mn[e]||!Mn[e][t]):!!Mn[e]}var Fn={};function Nn(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Fn[e]=!0:"object"==typeof e&&"string"==typeof e.type&&function(o,e){if(e&&e.length){var t=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t}(kn);e.forEach(function(r){t.prototype[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=dn(this.docId);if(n)return n.send("component",{ref:this.ref,component:o,method:r},e)}}),On[o]=t}}((Fn[e.type]=e).type,e.methods))})}function Dn(e){return!!Fn[e]}var Rn=[];function Vn(e,t){Ln(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Rn.push({name:e,options:t}))}function Jn(n){Rn.some(function(e,t){if(e.name===n)return Rn.splice(t,1),!0})}function Ln(e){return t=e,0<=Rn.map(function(e){return e.name}).indexOf(t);var t}var Wn=function(t){function e(e){t.call(this),this.nodeType=8,this.nodeId=sn(),this.ref=this.nodeId,this.type="comment",this.value=e,this.children=[],this.pureChildren=[]}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},e}(Sn);function qn(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}var Un=function(e,t){this.id=e,this.batched=!1,this.updates=[],"function"==typeof t?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:t}):console.error("[JS Runtime] invalid parameter, handler must be a function")};Un.prototype.createFinish=function(e){return(0,this.handler)([qn("createFinish")],e)},Un.prototype.updateFinish=function(e){return(0,this.handler)([qn("updateFinish")],e)},Un.prototype.refreshFinish=function(e){return(0,this.handler)([qn("refreshFinish")],e)},Un.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[qn("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return qn("addElement",[t.ref,e,-1])})),this.addActions(r)},Un.prototype.addElement=function(e,t,n){return 0<=n||(n=-1),this.addActions(qn("addElement",[t,e.toJSON(),n]))},Un.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return qn("removeElement",[e])});return this.addActions(t)}return this.addActions(qn("removeElement",[e]))},Un.prototype.moveElement=function(e,t,n){return this.addActions(qn("moveElement",[e,t,n]))},Un.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(qn("updateAttrs",[e,r]))},Un.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(qn("updateStyle",[e,r]))},Un.prototype.setStyles=function(e,t){return this.addActions(qn("updateStyle",[e,t]))},Un.prototype.addEvent=function(e,t){return this.addActions(qn("addEvent",[e,t]))},Un.prototype.removeEvent=function(e,t){return this.addActions(qn("removeEvent",[e,t]))},Un.prototype.handler=function(e,t){return t&&t()},Un.prototype.addActions=function(e){var t=this.updates,n=this.handler;if(Array.isArray(e)||(e=[e]),!this.batched)return n(e);t.push.apply(t,e)};var Bn={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"};function zn(e,t,n){var r,o=t.module,i=t.method,a=t.args;return r=i,"dom"===o&&Bn[r]&&"function"==typeof global[Bn[r]]?global[Bn[i]].apply(global,[e].concat(a,["-1"])):n(e,[t],"-1")}var Hn=function e(t,n,r){var o,i;t=t?t.toString():"",this.id=t,this.URL=n,i=this,(o=t)&&(fn[o]=i),this.nodeMap={};var a,s,c=e.Listener||Un;this.listener=new c(t,r||(a=t,"function"!=typeof(s=e.handler||global.callNative)&&console.error("[JS Runtime] no default handler"),function(e){Array.isArray(e)||(e=[e]);for(var t=0;t<e.length;t++){var n=zn(a,e[t],s);if(-1===n)return n}})),this.taskCenter=new jn(t,r?function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};Hn.prototype.getRef=function(e){return this.nodeMap[e]},Hn.prototype.open=function(){this.listener.batched=!1},Hn.prototype.close=function(){this.listener.batched=!0},Hn.prototype.createDocumentElement=function(){var n=this;if(!this.documentElement){var e=new $n("document");e.docId=this.id,e.ownerDocument=this,e.role="documentElement",e.depth=0,e.ref="_documentElement",this.nodeMap._documentElement=e,this.documentElement=e,Object.defineProperty(e,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(e){hn(n,e)}}),Object.defineProperty(e,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(e,t){hn(n,e,t)}})}return this.documentElement},Hn.prototype.createBody=function(e,t){this.body||vn(this,new $n(e,t));return this.body},Hn.prototype.createElement=function(e,t){return new $n(e,t)},Hn.prototype.createComment=function(e){return new Wn(e)},Hn.prototype.fireEvent=function(e,t,n,r,o){if(e){(n=n||{}).type=n.type||t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&function(e,t){var n=t.attrs||{};for(var r in n)e.setAttr(r,n[r],!0);var o=t.style||{};for(var i in o)e.setStyle(i,o[i],!0)}(e,r);var i="true"===this.getRef("_root").attr.bubble;return e.fireEvent(t,n,i,o)}},Hn.prototype.destroy=function(){var e;this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,e=this.id,delete fn[e]},Hn.handler=null;var Xn={};function Gn(e){return e["[[CurrentInstanceId]]"]}var Kn,Zn,Yn=function(e,t){var n,r;n=this,r=String(e),Object.defineProperty(n,"[[CurrentInstanceId]]",{value:r}),this.config=t||{},this.document=new Hn(e,this.config.bundleUrl),this.requireModule=this.requireModule.bind(this),this.importScript=this.importScript.bind(this),this.isRegisteredModule=Pn,this.isRegisteredComponent=Dn};Yn.prototype.requireModule=function(s){var c=Gn(this);if(c&&this.document&&this.document.taskCenter){if(Pn(s)){var e=s+"#"+c;if(!Xn[e]){var t=Mn[s],n={},r=function(a){Object.defineProperty(n,a,{enumerable:!0,configurable:!0,get:function(){return n=s,r=a,(o=dn(e=c))&&"function"==typeof o.send?function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return o.send("module",{module:n,method:r},e)}:(console.error("[JS Framework] Failed to find taskCenter ("+e+")."),null);var e,n,r,o},set:function(e){return n=s,r=a,o=e,(i=dn(t=c))&&"function"==typeof i.send?"function"!=typeof o?(console.error("[JS Framework] "+n+"."+r+" must be assigned as a function."),null):function(e){return i.send("module",{module:n,method:r},[e])}:(console.error("[JS Framework] Failed to find taskCenter ("+t+")."),null);var t,n,r,o,i}})};for(var o in t)r(o);Xn[e]=n}return Xn[e]}console.warn('[JS Framework] using unregistered weex module "'+s+'"')}else console.error('[JS Framework] Failed to requireModule("'+s+'"), instance ('+c+") doesn't exist anymore.")},Yn.prototype.supports=function(e){if("string"!=typeof e)return null;var t=e.match(/^@(\w+)\/(\w+)(\.(\w+))?$/i);if(t){var n=t[1],r=t[2],o=t[4];switch(n){case"module":return Pn(r,o);case"component":return Dn(r)}}return null},Yn.prototype.importScript=function(e,r){void 0===r&&(r={});var o=Gn(this),i=dn(o);return new Promise(function(t,n){i&&"function"==typeof i.send||n(new Error('[JS Framework] Failed to import script "'+e+'", no taskCenter ('+o+") matched."));try{i.send("module",{module:"script",method:"importScript"},[e,r],{callback:[function(e){return t(e)},function(e){return n(e)}]})}catch(e){n(e)}})};var Qn=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/;function er(){return"0.26.16"}var tr={};function nr(e){return tr[e]}function rr(e,t,n){void 0===t&&(t={});var r=new Yn(e,t),o=t.bundleType||"Vue";tr[e]=o;var i=Zn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');var a,s,c,l,u=(a=e,s={weex:r,config:t,created:Date.now(),framework:o,bundleType:o},c=Zn,(l=Object.create(null)).service=Object.create(null),Rn.forEach(function(e){var t=e.name,n=e.options.create;if(n)try{var r=n(a,s,c);Object.assign(l.service,r),Object.assign(l,r.instance)}catch(e){console.error("[JS Runtime] Failed to create service "+t+".")}}),delete l.service.instance,Object.freeze(l.service),l);Object.freeze(u);var f=Object.create(null);Object.assign(f,u,{weex:r,getJSFMVersion:er,__WEEX_CALL_JAVASCRIPT__:In,services:u}),Object.freeze(f);var p=Object.assign({},f);return"function"==typeof i.createInstanceContext&&Object.assign(p,i.createInstanceContext(e,f,n)),Object.freeze(p),p}var or={createInstance:function(e,t,n,r){if(tr[e])return new Error('The instance id "'+e+'" has already been used!');var o=function(e){var t=Qn.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}(t);tr[e]=o,(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{})),n.bundleType=o;var i=Zn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');"Weex"===o&&console.error('[JS Framework] COMPATIBILITY WARNING: Weex DSL 1.0 (.we) framework is no longer supported! It will be removed in the next version of WeexSDK, your page would be crash if you still using the ".we" framework. Please upgrade it to Vue.js or Rax.');var a=rr(e,n,r);if("function"==typeof i.createInstance){if("Rax"===o||"Weex"===o){var s=Object.assign({config:n,created:Date.now(),framework:o},a);return i.createInstance(e,t,n,r,s)}return i.createInstance(e,t,n,r,a)}!function(e,t){var n=[],r=[];for(var o in t)n.push(o),r.push(t[o]);var i="\n    (function (global) {\n      "+e+"\n    })(Object.create(this))\n  ";(new(Function.prototype.bind.apply(Function,[null].concat(n,[i])))).apply(void 0,r)}(t,a)},createInstanceContext:rr,getRoot:function(e){var t=pn(e);try{if(t&&t.body)return t.body.toJSON()}catch(e){return void console.error("[JS Framework] Failed to get the virtual dom tree.")}},getJSFMVersion:er,getDocument:pn,registerService:Vn,unregisterService:Jn,callJS:function(e,t){var n=Kn[nr(e)];return n&&"function"==typeof n.receiveTasks?n.receiveTasks(e,t):In(e,t)}};function ir(s){or[s]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n,r=e[0],o=nr(r);if(o&&Kn[o]){var i=(n=Kn[o])[s].apply(n,e),a={framework:o};return"refreshInstance"===s?Rn.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:Zn})}):"destroyInstance"===s&&(Rn.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:Zn})}),delete tr[r]),i}return new Error('[JS Framework] Using invalid instance id "'+r+'" when calling '+s+".")}}function ar(o,i){or[o]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n in"function"==typeof i&&i.apply(void 0,e),Zn.frameworks){var r=Zn.frameworks[n];r&&r[o]&&r[o].apply(r,e)}}}var sr={Document:Hn,Element:$n,Comment:Wn,Listener:Un,TaskCenter:jn,sendTasks:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return"function"==typeof callNative?callNative.apply(void 0,e):(global.callNative||function(){}).apply(void 0,e)}};Hn.handler=sr.sendTasks;var cr={service:{register:Vn,unregister:Jn,has:Ln},freezePrototype:function(){Object.freeze(sr.Comment),Object.freeze(sr.Listener),Object.freeze(sr.Document.prototype),Object.freeze(sr.Comment.prototype),Object.freeze(sr.Listener.prototype)},init:function(e){for(var t in Kn=(Zn=e||{}).frameworks||{},function(){var e={createFinish:global.callCreateFinish,updateFinish:global.callUpdateFinish,refreshFinish:global.callRefreshFinish,createBody:global.callCreateBody,addElement:global.callAddElement,removeElement:global.callRemoveElement,moveElement:global.callMoveElement,updateAttrs:global.callUpdateAttrs,updateStyle:global.callUpdateStyle,addEvent:global.callAddEvent,removeEvent:global.callRemoveEvent},t=jn.prototype,n=function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return An(e,[{module:"dom",method:n,args:t}],"-1")}};for(var r in e)n(r);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return An(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return An(e,[{module:t,method:n,args:r}])}}(),Kn){var n=Kn[t];if("function"==typeof n.init)try{n.init(e)}catch(e){}}return ar("registerComponents",Nn),ar("registerModules",Tn),ar("registerMethods"),["destroyInstance","refreshInstance"].forEach(ir),or},config:sr};function lr(e,t){void 0===t&&(t={}),this.type=e||"message",this.data=t.data||null,this.origin=t.origin||"",this.source=t.source||null,this.ports=t.ports||[],this.target=null,this.timeStamp=Date.now()}var ur={},fr={};function pr(){}pr.prototype.postMessage=function(e){if(this._closed)throw new Error('BroadcastChannel "'+this.name+'" is closed.');var t=ur[this.name];if(t&&t.length)for(var n=0;n<t.length;++n){var r=t[n];r._closed||r===this||"function"==typeof r.onmessage&&r.onmessage(new lr("message",{data:e}))}},pr.prototype.close=function(){var t=this;if(!this._closed&&(this._closed=!0,ur[this.name])){var e=ur[this.name].filter(function(e){return e!==t});e.length?ur[this.name]=e:delete ur[this.name]}};var dr={BroadcastChannel:{create:function(t,e,n){if(fr[t]=[],"function"==typeof global.BroadcastChannel)return{};var r={BroadcastChannel:function(e){Object.defineProperty(this,"name",{configurable:!1,enumerable:!0,writable:!1,value:String(e)}),this._closed=!1,this.onmessage=null,ur[this.name]||(ur[this.name]=[]),ur[this.name].push(this),fr[t].push(this)}};return r.BroadcastChannel.prototype=pr.prototype,{instance:r}},destroy:function(e,t){fr[e].forEach(function(e){return e.close()}),delete fr[e]}}};var hr={},vr={};var mr=Object.freeze({init:function(e){hr.Document=e.Document,hr.Element=e.Element,hr.Comment=e.Comment,hr.sendTasks=e.sendTasks},createInstance:function(t,e,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new hr.Document(t,n.bundleUrl),a={},s={id:t,data:r,document:i,callbacks:a},c=0;i.addCallback=function(e){return a[++c]=e,c},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},vr[t]=s;var l=Object.assign({Document:hr.Document,Element:hr.Element,Comment:hr.Comment,sendTasks:function(e){return hr.sendTasks(t,e,-1)},options:n,document:i},o),u=[],f=[];for(var p in l)u.push(p),f.push(l[p]);return u.push(e),(new(Function.prototype.bind.apply(Function,[null].concat(u)))).apply(void 0,f),hr.sendTasks(t,[{module:"dom",method:"createFinish",args:[]}],-1),s},destroyInstance:function(e){delete vr[e]},getRoot:function(e){return vr[e].document.body.toJSON()},receiveTasks:function(r,e){var o={fireEvent:function(e,t,n,r,o){var i=vr[e].document,a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){return vr[e].document.handleCallback(t,n,r)}};if((vr[r]||{}).document&&Array.isArray(e)){var i=[];return e.forEach(function(e){var t=o[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),i.push(t.apply(void 0,n)))}),i}}}),yr=n(function(e){e.exports=function(e,o){var _=Object.freeze({});function j(e){return null==e}function I(e){return null!=e}function M(e){return!0===e}function T(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function b(e){return null!==e&&"object"==typeof e}var r=Object.prototype.toString;function u(e){return"[object Object]"===r.call(e)}function i(e){var t=parseFloat(String(e));return 0<=t&&Math.floor(t)===t&&isFinite(e)}function t(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function n(e){var t=parseFloat(e);return isNaN(t)?e:t}function s(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}s("slot,component",!0);var c=s("key,ref,slot,slot-scope,is");function l(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var a=Object.prototype.hasOwnProperty;function f(e,t){return a.call(e,t)}function p(t){var n=Object.create(null);return function(e){return n[e]||(n[e]=t(e))}}var d=/-(\w)/g,h=p(function(e){return e.replace(d,function(e,t){return t?t.toUpperCase():""})}),v=p(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),m=/\B([A-Z])/g,w=p(function(e){return e.replace(m,"-$1").toLowerCase()});function y(n,r){function e(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}return e._length=n.length,e}function g(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function N(e,t){for(var n in t)e[n]=t[n];return e}function D(e,t,n){}var k=function(e,t,n){return!1},S=function(e){return e};function O(t,n){if(t===n)return!0;var e=b(t),r=b(n);if(!e||!r)return!e&&!r&&String(t)===String(n);try{var o=Array.isArray(t),i=Array.isArray(n);if(o&&i)return t.length===n.length&&t.every(function(e,t){return O(e,n[t])});if(o||i)return!1;var a=Object.keys(t),s=Object.keys(n);return a.length===s.length&&a.every(function(e){return O(t[e],n[e])})}catch(e){return!1}}function C(e,t){for(var n=0;n<e.length;n++)if(O(e[n],t))return n;return-1}function R(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var P="data-server-rendered",x=["component","directive","filter"],E=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],$={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:k,isReservedAttr:k,isUnknownElement:k,getTagNamespace:D,parsePlatformTagName:S,mustUseProp:k,_lifecycleHooks:E};function A(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var F=/[^\w.$]/;var V,J="__proto__"in{},L="undefined"!=typeof window,W="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,q=W&&WXEnvironment.platform.toLowerCase(),U=L&&window.navigator.userAgent.toLowerCase(),B=(U&&/msie|trident/.test(U),U&&0<U.indexOf("msie 9.0")),z=U&&0<U.indexOf("edge/"),H=(U&&U.indexOf("android"),U&&/iphone|ipad|ipod|ios/.test(U)||"ios"===q),X=(U&&/chrome\/\d+/.test(U),{}.watch);if(L)try{var G={};Object.defineProperty(G,"passive",{get:function(){}}),window.addEventListener("test-passive",null,G)}catch(e){}var K=function(){return void 0===V&&(V=!L&&!W&&void 0!==global&&"server"===global.process.env.VUE_ENV),V},Z=L&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function Y(e){return"function"==typeof e&&/native code/.test(e.toString())}var Q,ee="undefined"!=typeof Symbol&&Y(Symbol)&&"undefined"!=typeof Reflect&&Y(Reflect.ownKeys);Q="undefined"!=typeof Set&&Y(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var te=D,ne=0,re=function(){this.id=ne++,this.subs=[]};re.prototype.addSub=function(e){this.subs.push(e)},re.prototype.removeSub=function(e){l(this.subs,e)},re.prototype.depend=function(){re.target&&re.target.addDep(this)},re.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},re.target=null;var oe=[];var ie=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ae={child:{configurable:!0}};ae.child.get=function(){return this.componentInstance},Object.defineProperties(ie.prototype,ae);var se=function(e){void 0===e&&(e="");var t=new ie;return t.text=e,t.isComment=!0,t};function ce(e){return new ie(void 0,void 0,void 0,String(e))}var le=Array.prototype,ue=Object.create(le);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=le[a];A(ue,a,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r,o=s.apply(this,t),i=this.__ob__;switch(a){case"push":case"unshift":r=t;break;case"splice":r=t.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})});var fe=Object.getOwnPropertyNames(ue),pe={shouldConvert:!0},de=function(e){(this.value=e,this.dep=new re,this.vmCount=0,A(e,"__ob__",this),Array.isArray(e))?((J?he:ve)(e,ue,fe),this.observeArray(e)):this.walk(e)};function he(e,t,n){e.__proto__=t}function ve(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];A(e,i,t[i])}}function me(e,t){var n;if(b(e)&&!(e instanceof ie))return f(e,"__ob__")&&e.__ob__ instanceof de?n=e.__ob__:pe.shouldConvert&&!K()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new de(e)),t&&n&&n.vmCount++,n}function ye(n,e,r,t,o){var i=new re,a=Object.getOwnPropertyDescriptor(n,e);if(!a||!1!==a.configurable){var s=a&&a.get,c=a&&a.set,l=!o&&me(r);Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(n):r;return re.target&&(i.depend(),l&&(l.dep.depend(),Array.isArray(e)&&function e(t){for(var n=void 0,r=0,o=t.length;r<o;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(e))),e},set:function(e){var t=s?s.call(n):r;e===t||e!=e&&t!=t||(c?c.call(n,e):r=e,l=!o&&me(e),i.notify())}})}}function ge(e,t,n){if(Array.isArray(e)&&i(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(ye(r.value,t,n),r.dep.notify(),n):e[t]=n}function _e(e,t){if(Array.isArray(e)&&i(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||f(e,t)&&(delete e[t],n&&n.dep.notify())}}de.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)ye(e,t[n],e[t[n]])},de.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)me(e[t])};var be=$.optionMergeStrategies;function we(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),a=0;a<i.length;a++)r=e[n=i[a]],o=t[n],f(e,n)?u(r)&&u(o)&&we(r,o):ge(e,n,o);return e}function ke(n,r,o){return o?function(){var e="function"==typeof r?r.call(o,o):r,t="function"==typeof n?n.call(o,o):n;return e?we(e,t):t}:r?n?function(){return we("function"==typeof r?r.call(this,this):r,"function"==typeof n?n.call(this,this):n)}:r:n}function Se(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function Oe(e,t,n,r){var o=Object.create(e||null);return t?N(o,t):o}be.data=function(e,t,n){return n?ke(e,t,n):t&&"function"!=typeof t?e:ke(e,t)},E.forEach(function(e){be[e]=Se}),x.forEach(function(e){be[e+"s"]=Oe}),be.watch=function(e,t,n,r){if(e===X&&(e=void 0),t===X&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var o={};for(var i in N(o,e),t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},be.props=be.methods=be.inject=be.computed=function(e,t,n,r){if(!e)return t;var o=Object.create(null);return N(o,e),t&&N(o,t),o},be.provide=ke;var Ce=function(e,t){return void 0===t?e:t};function xe(n,r,o){"function"==typeof r&&(r=r.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])&&(i[h(o)]={type:null});else if(u(n))for(var a in n)o=n[a],i[h(a)]=u(o)?o:{type:o};e.props=i}}(r),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(u(n))for(var i in n){var a=n[i];r[i]=u(a)?N({from:i},a):{from:a}}}}(r),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(r);var e=r.extends;if(e&&(n=xe(n,e,o)),r.mixins)for(var t=0,i=r.mixins.length;t<i;t++)n=xe(n,r.mixins[t],o);var a,s={};for(a in n)c(a);for(a in r)f(n,a)||c(a);function c(e){var t=be[e]||Ce;s[e]=t(n[e],r[e],o,e)}return s}function Ee(e,t,n,r){if("string"==typeof n){var o=e[t];if(f(o,n))return o[n];var i=h(n);if(f(o,i))return o[i];var a=v(i);return f(o,a)?o[a]:o[n]||o[i]||o[a]}}function $e(e,t,n,r){var o=t[e],i=!f(n,e),a=n[e];if(je(Boolean,o.type)&&(i&&!f(o,"default")?a=!1:je(String,o.type)||""!==a&&a!==w(e)||(a=!0)),void 0===a){a=function(e,t,n){if(!f(t,"default"))return;var r=t.default;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Ae(t.type)?r.call(e):r}(r,o,e);var s=pe.shouldConvert;pe.shouldConvert=!0,me(a),pe.shouldConvert=s}return a}function Ae(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function je(e,t){if(!Array.isArray(t))return Ae(t)===Ae(e);for(var n=0,r=t.length;n<r;n++)if(Ae(t[n])===Ae(e))return!0;return!1}function Ie(e,t,n){if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){Me(e,r,"errorCaptured hook")}}Me(e,t,n)}function Me(e,t,n){if($.errorHandler)try{return $.errorHandler.call(null,e,t,n)}catch(e){Te(e,null,"config.errorHandler")}Te(e,t,n)}function Te(e,t,n){if(!L&&!W||"undefined"==typeof console)throw e;console.error(e)}var Pe,Fe,Ne=[],De=!1;function Re(){De=!1;for(var e=Ne.slice(0),t=Ne.length=0;t<e.length;t++)e[t]()}var Ve=!1;if("undefined"!=typeof setImmediate&&Y(setImmediate))Fe=function(){setImmediate(Re)};else if("undefined"==typeof MessageChannel||!Y(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Fe=function(){setTimeout(Re,0)};else{var Je=new MessageChannel,Le=Je.port2;Je.port1.onmessage=Re,Fe=function(){Le.postMessage(1)}}if("undefined"!=typeof Promise&&Y(Promise)){var We=Promise.resolve();Pe=function(){We.then(Re),H&&setTimeout(D)}}else Pe=Fe;function qe(e,t){var n;if(Ne.push(function(){if(e)try{e.call(t)}catch(e){Ie(e,t,"nextTick")}else n&&n(t)}),De||(De=!0,Ve?Fe():Pe()),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}var Ue=new Q;function Be(e){!function e(t,n){var r,o;var i=Array.isArray(t);if(!i&&!b(t)||Object.isFrozen(t))return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}(e,Ue),Ue.clear()}var ze,He=p(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function Xe(e){function o(){var e=arguments,t=o.fns;if(!Array.isArray(t))return t.apply(null,arguments);for(var n=t.slice(),r=0;r<n.length;r++)n[r].apply(null,e)}return o.fns=e,o}function Ge(e,t,n,r,o){var i,a,s,c,l;for(i in e)a=s=e[i],c=t[i],l=He(i),u(a)&&(s=a.handler,l.params=a.params),j(s)||(j(c)?(j(s.fns)&&(s=e[i]=Xe(s)),n(l.name,s,l.once,l.capture,l.passive,l.params)):s!==c&&(c.fns=s,e[i]=c));for(i in t)j(e[i])&&r((l=He(i)).name,t[i],l.capture)}function Ke(e,t,n){var r;e instanceof ie&&(e=e.data.hook||(e.data.hook={}));var o=e[t];function i(){n.apply(this,arguments),l(r.fns,i)}j(o)?r=Xe([i]):I(o.fns)&&M(o.merged)?(r=o).fns.push(i):r=Xe([o,i]),r.merged=!0,e[t]=r}function Ze(e,t,n,r,o){if(I(t)){if(f(t,n))return e[n]=t[n],o||delete t[n],!0;if(f(t,r))return e[n]=t[r],o||delete t[r],!0}return!1}function Ye(e){return T(e)?[ce(e)]:Array.isArray(e)?function e(t,n){var r=[];var o,i,a,s;for(o=0;o<t.length;o++)j(i=t[o])||"boolean"==typeof i||(a=r.length-1,s=r[a],Array.isArray(i)?0<i.length&&(Qe((i=e(i,(n||"")+"_"+o))[0])&&Qe(s)&&(r[a]=ce(s.text+i[0].text),i.shift()),r.push.apply(r,i)):T(i)?Qe(s)?r[a]=ce(s.text+i):""!==i&&r.push(ce(i)):Qe(i)&&Qe(s)?r[a]=ce(s.text+i.text):(M(t._isVList)&&I(i.tag)&&j(i.key)&&I(n)&&(i.key="__vlist"+n+"_"+o+"__"),r.push(i)));return r}(e):void 0}function Qe(e){return I(e)&&I(e.text)&&!1===e.isComment}function et(e,t){return(e.__esModule||ee&&"Module"===e[Symbol.toStringTag])&&(e=e.default),b(e)?t.extend(e):e}function tt(e){return e.isComment&&e.asyncFactory}function nt(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(I(n)&&(I(n.componentOptions)||tt(n)))return n}}function rt(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&at(e,t)}function ot(e,t,n){n?ze.$once(e,t):ze.$on(e,t)}function it(e,t){ze.$off(e,t)}function at(e,t,n){ze=e,Ge(t,n||{},ot,it),ze=void 0}function st(e,t){var n={};if(!e)return n;for(var r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var l in n)n[l].every(ct)&&delete n[l];return n}function ct(e){return e.isComment&&!e.asyncFactory||" "===e.text}function lt(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?lt(e[n],t):t[e[n].key]=e[n].fn;return t}var ut=null;function ft(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function pt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function dt(e,t){if(t){if(e._directInactive=!1,pt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)dt(e.$children[n]);ht(e,"activated")}}function ht(t,n){var e=t.$options[n];if(e)for(var r=0,o=e.length;r<o;r++)try{e[r].call(t)}catch(e){Ie(e,t,n+" hook")}t._hasHookEvent&&t.$emit("hook:"+n)}var vt=[],mt=[],yt={},gt=!1,_t=!1,bt=0;function wt(){var e,t;for(_t=!0,vt.sort(function(e,t){return e.id-t.id}),bt=0;bt<vt.length;bt++)t=(e=vt[bt]).id,yt[t]=null,e.run();var n=mt.slice(),r=vt.slice();bt=vt.length=mt.length=0,yt={},gt=_t=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,dt(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&ht(r,"updated")}}(r),Z&&$.devtools&&Z.emit("flush")}var kt=0,St=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++kt,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new Q,this.newDepIds=new Q,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!F.test(e)){var n=e.split(".");return function(e){for(var t=0;t<n.length;t++){if(!e)return;e=e[n[t]]}return e}}}(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};St.prototype.get=function(){var e,t;e=this,re.target&&oe.push(re.target),re.target=e;var n=this.vm;try{t=this.getter.call(n,n)}catch(e){if(!this.user)throw e;Ie(e,n,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Be(t),re.target=oe.pop(),this.cleanupDeps()}return t},St.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},St.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},St.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==yt[t]){if(yt[t]=!0,_t){for(var n=vt.length-1;bt<n&&vt[n].id>e.id;)n--;vt.splice(n+1,0,e)}else vt.push(e);gt||(gt=!0,qe(wt))}}(this)},St.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||b(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Ie(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},St.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},St.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},St.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Ot={enumerable:!0,configurable:!0,get:D,set:D};function Ct(e,t,n){Ot.get=function(){return this[t][n]},Ot.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Ot)}function xt(e){e._watchers=[];var t=e.$options;t.props&&function(n,r){var o=n.$options.propsData||{},i=n._props={},a=n.$options._propKeys=[],e=!n.$parent;pe.shouldConvert=e;var t=function(e){a.push(e);var t=$e(e,r,o,n);ye(i,e,t),e in n||Ct(n,"_props",e)};for(var s in r)t(s);pe.shouldConvert=!0}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?D:y(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?Et(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var i=n[o];r&&f(r,i)||(void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&Ct(e,"_data",i))}var a;me(t,!0)}(e):me(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=K();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;r||(n[o]=new St(e,a||D,D,$t)),o in e||At(e,o,i)}}(e,t.computed),t.watch&&t.watch!==X&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)It(e,n,r[o]);else It(e,n,r)}}(e,t.watch)}function Et(e,t){try{return e.call(t,t)}catch(e){return Ie(e,t,"data()"),{}}}var $t={lazy:!0};function At(e,t,n){var r=!K();"function"==typeof n?(Ot.get=r?jt(t):n,Ot.set=D):(Ot.get=n.get?r&&!1!==n.cache?jt(t):n.get:D,Ot.set=n.set?n.set:D),Object.defineProperty(e,t,Ot)}function jt(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),re.target&&e.depend(),e.value}}function It(e,t,n,r){return u(n)&&(n=(r=n).handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Mt(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function Tt(t){var n=Pt(t.$options.inject,t);n&&(pe.shouldConvert=!1,Object.keys(n).forEach(function(e){ye(t,e,n[e])}),pe.shouldConvert=!0)}function Pt(t,e){if(t){for(var n=Object.create(null),r=ee?Reflect.ownKeys(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}):Object.keys(t),o=0;o<r.length;o++){for(var i=r[o],a=t[i].from,s=e;s;){if(s._provided&&a in s._provided){n[i]=s._provided[a];break}s=s.$parent}if(!s&&"default"in t[i]){var c=t[i].default;n[i]="function"==typeof c?c.call(e):c}}return n}}function Ft(e,t){var n,r,o,i,a;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(b(e))for(i=Object.keys(e),n=new Array(i.length),r=0,o=i.length;r<o;r++)a=i[r],n[r]=t(e[a],a,r);return I(n)&&(n._isVList=!0),n}function Nt(e,t,n,r){var o,i=this.$scopedSlots[e];if(i)n=n||{},r&&(n=N(N({},r),n)),o=i(n)||t;else{var a=this.$slots[e];a&&(a._rendered=!0),o=a||t}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},o):o}function Dt(e){return Ee(this.$options,"filters",e)||S}function Rt(e,t,n,r){var o=$.keyCodes[t]||n;return o?Array.isArray(o)?-1===o.indexOf(e):o!==e:r?w(r)!==t:void 0}function Vt(n,r,o,i,a){if(o)if(b(o)){var s;Array.isArray(o)&&(o=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(o));var e=function(t){if("class"===t||"style"===t||c(t))s=n;else{var e=n.attrs&&n.attrs.type;s=i||$.mustUseProp(r,e,t)?n.domProps||(n.domProps={}):n.attrs||(n.attrs={})}t in s||(s[t]=o[t],a&&((n.on||(n.on={}))["update:"+t]=function(e){o[t]=e}))};for(var t in o)e(t)}else;return n}function Jt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||Wt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function Lt(e,t,n){return Wt(e,"__once__"+t+(n?"_"+n:""),!0),e}function Wt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&qt(e[r],t+"_"+r,n);else qt(e,t,n)}function qt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Ut(e,t){if(t)if(u(t)){var n=e.on=e.on?N({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else;return e}function Bt(e){e._o=Lt,e._n=n,e._s=t,e._l=Ft,e._t=Nt,e._q=O,e._i=C,e._m=Jt,e._f=Dt,e._k=Rt,e._b=Vt,e._v=ce,e._e=se,e._u=lt,e._g=Ut}function zt(e,t,n,i,r){var a=r.options;this.data=e,this.props=t,this.children=n,this.parent=i,this.listeners=e.on||_,this.injections=Pt(a.inject,i),this.slots=function(){return st(n,i)};var s=Object.create(i),o=M(a._compiled),c=!o;o&&(this.$options=a,this.$slots=this.slots(),this.$scopedSlots=e.scopedSlots||_),a._scopeId?this._c=function(e,t,n,r){var o=fn(s,e,t,n,r,c);return o&&!Array.isArray(o)&&(o.fnScopeId=a._scopeId,o.fnContext=i),o}:this._c=function(e,t,n,r){return fn(s,e,t,n,r,c)}}function Ht(e,t,n,r){e.fnContext=n,e.fnOptions=r,t.slot&&((e.data||(e.data={})).slot=t.slot)}function Xt(e,t){for(var n in t)e[h(n)]=t[n]}Bt(zt.prototype);var Gt="@inRecycleList";function Kt(e,t,n,r){if(o&&o.taskCenter)return"function"==typeof o.taskCenter.registerHook?o.taskCenter.registerHook(e,t,n,r):void 0}var Zt=0;function Yt(e){var t=e.$options.data,n=e.$options.computed||{},r=e._data?Object.assign({},e._data):"function"==typeof t?Et(t,e):t||{},o={};for(var i in n)o[i]=e[i];return Object.assign({},r,o)}function Qt(e){void 0===e&&(e={});var r=this,t=e.componentId;A(r,"_vmTemplate",e.vmTemplate),r._uid=t||"virtual-component-"+Zt++,r._isVue=!0,e&&e._isComponent?wn(r,e):r.$options=xe(kn(r.constructor),e||{},r),ft((r._renderProxy=r)._self=r),rt(r),pn(r),ht(r,"beforeCreate"),Tt(r),xt(r),Mt(r),ht(r,"created"),Kt(t,"lifecycle","attach",function(){ht(r,"beforeMount"),new St(r,function(){return Yt(r)},function(){return r._update(r._vnode,!1)}),r._isMounted=!0,ht(r,"mounted")}),Kt(t,"lifecycle","update",function(){r._update(r._vnode,!1)}),Kt(t,"lifecycle","syncState",function(e,t){if(u(t))for(var n in t)r[n]=t[n];return Yt(r)}),Kt(t,"lifecycle","detach",function(){r.$destroy(),r._vmTemplate&&(r._vmTemplate.removeVirtualComponent(r._uid),delete r._vmTemplate)})}function en(e){var t=this,n=t.$options.componentId;(t._isMounted&&ht(t,"beforeUpdate"),t._vnode=e,t._isMounted&&n)&&function(e,t,n){if(o&&o.taskCenter)"function"==typeof o.taskCenter.updateData&&o.taskCenter.updateData(e,t,n)}(n,Yt(t),function(){ht(t,"updated")})}function tn(e){void 0===e&&(e={});var t=this;t._uid="virtual-component-template-"+Zt++,t._isVue=!0,e&&e._isComponent?wn(t,e):t.$options=xe(kn(t.constructor),e||{},t),rt(t._self=t),pn(t),xt(t),this.registerVirtualComponent()}function nn(e){var t,n,o,i;delete e.data.attrs[Gt],n=(t=e).componentOptions.Ctor,o=n.extend({}),i=o.prototype.$emit,o.prototype._init=Qt,o.prototype._update=en,o.prototype.$emit=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this._uid,o=this._vmTemplate;return r&&o&&(t.push(r),i.apply(o,t)),i.apply(this,t)},t.componentOptions.Ctor=n.extend({methods:{registerVirtualComponent:function(){var r=this;A(r,"_virtualComponents",{}),Kt(String(r._uid),"lifecycle","create",function(e,t){var n=new o({vmTemplate:r,componentId:e,propsData:t});return n._uid=e,r._virtualComponents&&(r._virtualComponents[e]=n),Yt(n)})},removeVirtualComponent:function(e){delete this._virtualComponents[e]}},destroyed:function(){delete this._virtualComponents}}),t.componentOptions.Ctor.prototype._init=tn,t.componentOptions.Ctor.prototype._update=D;var r=sn(e),a=r.$options["@render"];if(a)try{return a.call(r)}catch(e){Ie(e,r,"@render")}}var rn={init:function(e,t,n,r){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var o=e;rn.prepatch(o,o)}else{(e.componentInstance=sn(e,ut,n,r)).$mount(t?e.elm:void 0,t)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,r,o){var i=!!(o||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==_);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=o,e.$attrs=r.data.attrs||_,e.$listeners=n||_,t&&e.$options.props){pe.shouldConvert=!1;for(var a=e._props,s=e.$options._propKeys||[],c=0;c<s.length;c++){var l=s[c];a[l]=$e(l,e.$options.props,t,e)}pe.shouldConvert=!0,e.$options.propsData=t}n=n||_;var u=e.$options._parentListeners;e.$options._parentListeners=n,at(e,n,u),i&&(e.$slots=st(o,r.context),e.$forceUpdate())}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,ht(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,mt.push(t)):dt(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,pt(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);ht(t,"deactivated")}}(t,!0):t.$destroy())}},on=Object.keys(rn);function an(e,t,n,r,o){if(!j(e)){var i=n.$options._base;if(b(e)&&(e=i.extend(e)),"function"==typeof e){var a,s,c,l,u,f,p;if(j(e.cid)&&void 0===(e=function(t,n,e){if(M(t.error)&&I(t.errorComp))return t.errorComp;if(I(t.resolved))return t.resolved;if(M(t.loading)&&I(t.loadingComp))return t.loadingComp;if(!I(t.contexts)){var r=t.contexts=[e],o=!0,i=function(){for(var e=0,t=r.length;e<t;e++)r[e].$forceUpdate()},a=R(function(e){t.resolved=et(e,n),o||i()}),s=R(function(e){I(t.errorComp)&&(t.error=!0,i())}),c=t(a,s);return b(c)&&("function"==typeof c.then?j(t.resolved)&&c.then(a,s):I(c.component)&&"function"==typeof c.component.then&&(c.component.then(a,s),I(c.error)&&(t.errorComp=et(c.error,n)),I(c.loading)&&(t.loadingComp=et(c.loading,n),0===c.delay?t.loading=!0:setTimeout(function(){j(t.resolved)&&j(t.error)&&(t.loading=!0,i())},c.delay||200)),I(c.timeout)&&setTimeout(function(){j(t.resolved)&&s(null)},c.timeout))),o=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(e)}(a=e,i,n)))return s=a,c=t,l=n,u=r,f=o,(p=se()).asyncFactory=s,p.asyncMeta={data:c,context:l,children:u,tag:f},p;t=t||{},kn(e),I(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var o=t.on||(t.on={});I(o[r])?o[r]=[t.model.callback].concat(o[r]):o[r]=t.model.callback}(e.options,t);var d=function(e,t,n){var r=t.options.props;if(!j(r)){var o={},i=e.attrs,a=e.props;if(I(i)||I(a))for(var s in r){var c=w(s);Ze(o,a,s,c,!0)||Ze(o,i,s,c,!1)}return o}}(t,e);if(M(e.options.functional))return function(e,t,n,r,o){var i=e.options,a={},s=i.props;if(I(s))for(var c in s)a[c]=$e(c,s,t||_);else I(n.attrs)&&Xt(a,n.attrs),I(n.props)&&Xt(a,n.props);var l=new zt(n,a,o,r,e),u=i.render.call(null,l._c,l);if(u instanceof ie)return Ht(u,n,r,i),u;if(Array.isArray(u)){for(var f=Ye(u)||[],p=0;p<f.length;p++)Ht(f[p],n,r,i);return f}}(e,d,t,n,r);var h=t.on;if(t.on=t.nativeOn,M(e.options.abstract)){var v=t.slot;t={},v&&(t.slot=v)}!function(e){e.hook||(e.hook={});for(var t=0;t<on.length;t++){var n=on[t],r=e.hook[n],o=rn[n];e.hook[n]=r?cn(o,r):o}}(t);var m,y=e.options.name||o,g=new ie("vue-component-"+e.cid+(y?"-"+y:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:d,listeners:h,tag:o,children:r},a);return(m=g).data.attrs&&Gt in m.data.attrs?nn(g):g}}}function sn(e,t,n,r){var o={_isComponent:!0,parent:t,_parentVnode:e,_parentElm:n||null,_refElm:r||null},i=e.data.inlineTemplate;return I(i)&&(o.render=i.render,o.staticRenderFns=i.staticRenderFns),new e.componentOptions.Ctor(o)}function cn(o,i){return function(e,t,n,r){o(e,t,n,r),i(e,t,n,r)}}var ln=1,un=2;function fn(e,t,n,r,o,i){return(Array.isArray(n)||T(n))&&(o=r,r=n,n=void 0),M(i)&&(o=un),function(e,t,n,r,o){if(I(n)&&I(n.__ob__))return se();I(n)&&I(n.is)&&(t=n.is);if(!t)return se();Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);o===un?r=Ye(r):o===ln&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var i,a;if("string"==typeof t){var s;a=e.$vnode&&e.$vnode.ns||$.getTagNamespace(t),i=$.isReservedTag(t)?new ie($.parsePlatformTagName(t),n,r,void 0,void 0,e):I(s=Ee(e.$options,"components",t))?an(s,n,e,r,t):new ie(t,n,r,void 0,void 0,e)}else i=an(t,n,e,r);return Array.isArray(i)?i:I(i)?(I(a)&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(n=void 0,r=!0);if(I(t.children))for(var o=0,i=t.children.length;o<i;o++){var a=t.children[o];I(a.tag)&&(j(a.ns)||M(r)&&"svg"!==a.tag)&&e(a,n,r)}}(i,a),I(n)&&function(e){b(e.style)&&Be(e.style);b(e.class)&&Be(e.class)}(n),i):se()}(e,t,n,r,o)}function pn(o){o._vnode=null,o._staticTrees=null;var e=o.$options,t=o.$vnode=e._parentVnode,n=t&&t.context;o.$slots=st(e._renderChildren,n),o.$scopedSlots=_,o._c=function(e,t,n,r){return fn(o,e,t,n,r,!1)},o.$createElement=function(e,t,n,r){return fn(o,e,t,n,r,!0)};var r=t&&t.data;ye(o,"$attrs",r&&r.attrs||_,0,!0),ye(o,"$listeners",e._parentListeners||_,0,!0)}var dn,hn,vn,mn,yn,gn,_n,bn=0;function wn(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function kn(e){var t=e.options;if(e.super){var n=kn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.extendOptions,o=e.sealedOptions;for(var i in n)n[i]!==o[i]&&(t||(t={}),t[i]=Sn(n[i],r[i],o[i]));return t}(e);r&&N(e.extendOptions,r),(t=e.options=xe(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function Sn(e,t,n){if(Array.isArray(e)){var r=[];n=Array.isArray(n)?n:[n],t=Array.isArray(t)?t:[t];for(var o=0;o<e.length;o++)(0<=t.indexOf(e[o])||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function On(e){this._init(e)}function Cn(e){e.cid=0;var a=1;e.extend=function(e){e=e||{};var t=this,n=t.cid,r=e._Ctor||(e._Ctor={});if(r[n])return r[n];var o=e.name||t.options.name,i=function(e){this._init(e)};return((i.prototype=Object.create(t.prototype)).constructor=i).cid=a++,i.options=xe(t.options,e),i.super=t,i.options.props&&function(e){var t=e.options.props;for(var n in t)Ct(e.prototype,"_props",n)}(i),i.options.computed&&function(e){var t=e.options.computed;for(var n in t)At(e.prototype,n,t[n])}(i),i.extend=t.extend,i.mixin=t.mixin,i.use=t.use,x.forEach(function(e){i[e]=t[e]}),o&&(i.options.components[o]=i),i.superOptions=t.options,i.extendOptions=e,i.sealedOptions=N({},i.options),r[n]=i}}function xn(e){return e&&(e.Ctor.options.name||e.tag)}function En(e,t){return Array.isArray(e)?-1<e.indexOf(t):"string"==typeof e?-1<e.split(",").indexOf(t):(n=e,"[object RegExp]"===r.call(n)&&e.test(t));var n}function $n(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=xn(a.componentOptions);s&&!t(s)&&An(n,i,r,o)}}}function An(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,l(n,t)}On.prototype._init=function(e){var t=this;t._uid=bn++,t._isVue=!0,e&&e._isComponent?wn(t,e):t.$options=xe(kn(t.constructor),e||{},t),ft((t._renderProxy=t)._self=t),rt(t),pn(t),ht(t,"beforeCreate"),Tt(t),xt(t),Mt(t),ht(t,"created"),t.$options.el&&t.$mount(t.$options.el)},dn=On,hn={get:function(){return this._data}},vn={get:function(){return this._props}},Object.defineProperty(dn.prototype,"$data",hn),Object.defineProperty(dn.prototype,"$props",vn),dn.prototype.$set=ge,dn.prototype.$delete=_e,dn.prototype.$watch=function(e,t,n){if(u(t))return It(this,e,t,n);(n=n||{}).user=!0;var r=new St(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}},yn=/^hook:/,(mn=On).prototype.$on=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n<r;n++)this.$on(e[n],t);else(this._events[e]||(this._events[e]=[])).push(t),yn.test(e)&&(this._hasHookEvent=!0);return this},mn.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},mn.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,o=e.length;r<o;r++)this.$off(e[r],t);return n}var i=n._events[e];if(!i)return n;if(!t)return n._events[e]=null,n;if(t)for(var a,s=i.length;s--;)if((a=i[s])===t||a.fn===t){i.splice(s,1);break}return n},mn.prototype.$emit=function(t){var n=this,e=n._events[t];if(e){e=1<e.length?g(e):e;for(var r=g(arguments,1),o=0,i=e.length;o<i;o++)try{e[o].apply(n,r)}catch(e){Ie(e,n,'event handler for "'+t+'"')}}return n},(gn=On).prototype._update=function(e,t){var n=this;n._isMounted&&ht(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=ut;(ut=n)._vnode=e,o?n.$el=n.__patch__(o,e):(n.$el=n.__patch__(n.$el,e,t,!1,n.$options._parentElm,n.$options._refElm),n.$options._parentElm=n.$options._refElm=null),ut=i,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},gn.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},gn.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){ht(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||l(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),ht(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}},Bt((_n=On).prototype),_n.prototype.$nextTick=function(e){return qe(e,this)},_n.prototype._render=function(){var t,n=this,e=n.$options,r=e.render,o=e._parentVnode;o&&(n.$scopedSlots=o.data.scopedSlots||_),n.$vnode=o;try{t=r.call(n._renderProxy,n.$createElement)}catch(e){Ie(e,n,"render"),t=n._vnode}return t instanceof ie||(t=se()),t.parent=o,t};var jn,In,Mn,Tn=[String,RegExp,Array],Pn={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Tn,exclude:Tn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)An(this.cache,e,this.keys)},watch:{include:function(t){$n(this,function(e){return En(t,e)})},exclude:function(t){$n(this,function(e){return!En(t,e)})}},render:function(){var e=this.$slots.default,t=nt(e),n=t&&t.componentOptions;if(n){var r=xn(n),o=this.include,i=this.exclude;if(o&&(!r||!En(o,r))||i&&r&&En(i,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,l(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&An(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};jn=On,Mn={get:function(){return $}},Object.defineProperty(jn,"config",Mn),jn.util={warn:te,extend:N,mergeOptions:xe,defineReactive:ye},jn.set=ge,jn.delete=_e,jn.nextTick=qe,jn.options=Object.create(null),x.forEach(function(e){jn.options[e+"s"]=Object.create(null)}),N((jn.options._base=jn).options.components,Pn),jn.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(-1<t.indexOf(e))return this;var n=g(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this},jn.mixin=function(e){return this.options=xe(this.options,e),this},Cn(jn),In=jn,x.forEach(function(n){In[n]=function(e,t){return t?("component"===n&&u(t)&&(t.name=t.name||e,t=this.options._base.extend(t)),"directive"===n&&"function"==typeof t&&(t={bind:t,update:t}),this.options[n+"s"][e]=t):this.options[n+"s"][e]}}),Object.defineProperty(On.prototype,"$isServer",{get:K}),Object.defineProperty(On.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),On.version="2.5.13";var Fn=1;function Nn(e){return o.createElement(e)}var Dn=Object.freeze({namespaceMap:{},createElement:Nn,createElementNS:function(e,t){return o.createElement(e+":"+t)},createTextNode:function(e){return new function(e){this.instanceId="",this.nodeId=Fn++,this.parentNode=null,this.nodeType=3,this.text=e}(e)},createComment:function(e){return o.createComment(e)},insertBefore:function(e,t,n){if(3!==t.nodeType)e.insertBefore(t,n);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var r=Nn("text");r.setAttr("value",t.text),e.insertBefore(r,n)}},removeChild:function(e,t){3!==t.nodeType?e.removeChild(t):e.setAttr("value","")},appendChild:function(e,t){if(3!==t.nodeType)e.appendChild(t);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var n=Nn("text");n.setAttr("value",t.text),e.appendChild(n)}},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.type},setTextContent:function(e,t){e.parentNode&&e.parentNode.setAttr("value",t)},setAttribute:function(e,t,n){e.setAttr(t,n)},setStyleScope:function(e,t){e.setAttr("@styleScope",t)}}),Rn={create:function(e,t){Vn(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Vn(e,!0),Vn(t))},destroy:function(e){Vn(e,!0)}};function Vn(e,t){var n=e.data.ref;if(n){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?l(i[n],o):i[n]===o&&(i[n]=void 0):e.data.refInFor?Array.isArray(i[n])?i[n].indexOf(o)<0&&i[n].push(o):i[n]=[o]:i[n]=o}}s("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),s("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0);var Jn=s("text,number,password,search,email,tel,url"),Ln=new ie("",{},[]),Wn=["create","activate","update","remove","destroy"];function qn(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&I(e.data)===I(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=I(n=e.data)&&I(n=n.attrs)&&n.type,o=I(n=t.data)&&I(n=n.attrs)&&n.type;return r===o||Jn(r)&&Jn(o)}(e,t)||M(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&j(t.asyncFactory.error))}function Un(e,t,n){var r,o,i={};for(r=t;r<=n;++r)I(o=e[r].key)&&(i[o]=r);return i}var Bn={create:zn,update:zn,destroy:function(e){zn(e,Ln)}};function zn(e,t){(e.data.directives||t.data.directives)&&function(t,n){var e,r,o,i=t===Ln,a=n===Ln,s=Xn(t.data.directives,t.context),c=Xn(n.data.directives,n.context),l=[],u=[];for(e in c)r=s[e],o=c[e],r?(o.oldValue=r.value,Gn(o,"update",n,t),o.def&&o.def.componentUpdated&&u.push(o)):(Gn(o,"bind",n,t),o.def&&o.def.inserted&&l.push(o));if(l.length){var f=function(){for(var e=0;e<l.length;e++)Gn(l[e],"inserted",n,t)};i?Ke(n,"insert",f):f()}u.length&&Ke(n,"postpatch",function(){for(var e=0;e<u.length;e++)Gn(u[e],"componentUpdated",n,t)});if(!i)for(e in s)c[e]||Gn(s[e],"unbind",t,t,a)}(e,t)}var Hn=Object.create(null);function Xn(e,t){var n,r,o,i=Object.create(null);if(!e)return i;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=Hn),(i[(o=r,o.rawName||o.name+"."+Object.keys(o.modifiers||{}).join("."))]=r).def=Ee(t.$options,"directives",r.name);return i}function Gn(t,n,r,e,o){var i=t.def&&t.def[n];if(i)try{i(r.elm,t,r,e,o)}catch(e){Ie(e,r.context,"directive "+t.name+" "+n+" hook")}}var Kn=[Rn,Bn];function Zn(e,t){if(e.data.attrs||t.data.attrs){var n,r,o=t.elm,i=e.data.attrs||{},a=t.data.attrs||{};a.__ob__&&(a=t.data.attrs=N({},a));var s="function"==typeof o.setAttrs,c={};for(n in a)r=a[n],i[n]!==r&&(s?c[n]=r:o.setAttr(n,r));for(n in i)null==a[n]&&(s?c[n]=void 0:o.setAttr(n));s&&o.setAttrs(c)}}var Yn={create:Zn,update:Zn};function Qn(e,t){var n=t.elm,r=t.context,o=t.data,i=e.data;if(o.staticClass||o.class||i&&(i.staticClass||i.class)){var a=[],s=i.staticClass;s&&a.push.apply(a,s),i.class&&a.push.apply(a,i.class);var c,l,u,f,p=[],d=o.staticClass;if(d&&p.push.apply(p,d),o.class&&p.push.apply(p,o.class),"function"==typeof n.setClassList)n.setClassList(p);else{var h=(c=a,l=p,u=r.$options.style||{},f={},l.forEach(function(e){var t=u[e];N(f,t)}),c.forEach(function(e){var t=u[e];for(var n in t)f.hasOwnProperty(n)||(f[n]="")}),f);if("function"==typeof n.setStyles)n.setStyles(h);else for(var v in h)n.setStyle(v,h[v])}}}var er,tr,nr={create:Qn,update:Qn};function rr(t,e,n,r,o,i){if(r)console.log("Weex do not support event in bubble phase.");else{if(n){var a=e,s=er;e=function(e){null!==(1===arguments.length?a(e):a.apply(null,arguments))&&or(t,null,null,s)}}if(tr&&tr._virtualComponents){er._context=tr;var c=e;e=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=(t[0]||{}).componentId,o=this._context;r&&this._context&&(o=(this._context._virtualComponents||{})[r]||o);try{!function(e,t,n){void 0===n&&(n=null);var r=e.fns;if(!Array.isArray(r))return"function"==typeof r?r.apply(n,t):e.apply(n,t);for(var o=r.slice(),i=0;i<o.length;i++)o[i].apply(n,t)}(c,t,o)}catch(e){Ie(e,o,"Failed to invoke virtual component handler ("+r+")")}}}er.addEvent(t,e,i)}}function or(e,t,n,r){(r||er).removeEvent(e)}function ir(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};er=t.elm,tr=t.context,Ge(n,r,rr,or,t.context),tr=er=void 0}}var ar={create:ir,update:ir},sr=p(h);function cr(e,t){if(e.data.style||t.data.style){var n,r,o=t.elm,i=e.data.style||{},a=t.data.style||{},s=a.__ob__;Array.isArray(a)&&(a=t.data.style=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(a)),s&&(a=t.data.style=N({},a));var c="function"==typeof o.setStyles,l={};for(r in i)a[r]||(c?l[sr(r)]="":o.setStyle(sr(r),""));for(r in a)n=a[r],c?l[sr(r)]=n:o.setStyle(sr(r),n);c&&o.setStyles(l)}}var lr={create:function(e,t){if(t.data.staticStyle){var n=t.elm,r=t.data.staticStyle,o="function"==typeof n.setStyles,i={};for(var a in r)r[a]&&(o?i[sr(a)]=r[a]:n.setStyle(sr(a),r[a]));o&&n.setStyles(i),cr(e,t)}else cr(e,t)},update:cr};function ur(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&N(t,fr(e.name||"v")),N(t,e),t}return"string"==typeof e?fr(e):void 0}}var fr=p(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}});L&&!B&&(void 0===window.ontransitionend&&window.onwebkittransitionend,void 0===window.onanimationend&&window.onwebkitanimationend);L&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window);function pr(e,n){var r=n.elm;r._leaveCb&&(r._leaveCb.cancelled=!0,r._leaveCb());var t=ur(n.data.transition);if(t&&!r._enterCb){for(var o=t.enterClass,i=t.enterToClass,a=t.enterActiveClass,s=t.appearClass,c=t.appearToClass,l=t.appearActiveClass,u=t.beforeEnter,f=t.enter,p=t.afterEnter,d=t.enterCancelled,h=t.beforeAppear,v=t.appear,m=t.afterAppear,y=t.appearCancelled,g=ut,_=ut.$vnode;_&&_.parent;)g=(_=_.parent).context;var b=!g._isMounted||!n.isRootInsert;if(!b||v||""===v){var w=b?s:o,k=b?c:i,S=b?l:a,O=b&&h||u,C=b&&"function"==typeof v?v:f,x=b&&m||p,E=b&&y||d,$=C&&1<(C._length||C.length),A=n.context.$options.style||{},j=A[w],I=A["@TRANSITION"]&&A["@TRANSITION"][S]||{},M=function(e,t,n,r,o,i){var a={},s=t[n],c=t[r],l=t[o];if(s)for(var u in s)a[u]=e.style[u];if(l)for(var f in l)0!==f.indexOf("transition")&&(a[f]=l[f]);c&&N(a,c);return a}(r,A,w,k,S,n.context),T=0<Object.keys(M).length,P=r._enterCb=R(function(){P.cancelled?E&&E(r):x&&x(r),r._enterCb=null});if(setTimeout(function(){var e=r.parentNode,t=e&&e._pending&&e._pending[n.key];(t&&t.context===n.context&&t.tag===n.tag&&t.elm._leaveCb&&t.elm._leaveCb(),C&&C(r,P),T)?n.context.$requireWeexModule("animation").transition(r.ref,{styles:M,duration:I.duration||0,delay:I.delay||0,timingFunction:I.timingFunction||"linear"},$?D:P):$||P()},16),O&&O(r),j)if("function"==typeof r.setStyles)r.setStyles(j);else for(var F in j)r.setStyle(F,j[F]);T||$||P()}}}var dr=function(e){var r,t,g={},n=e.modules,_=e.nodeOps;for(r=0;r<Wn.length;++r)for(g[Wn[r]]=[],t=0;t<n.length;++t)I(n[t][Wn[r]])&&g[Wn[r]].push(n[t][Wn[r]]);function i(e){var t=_.parentNode(e);I(t)&&_.removeChild(t,e)}function b(e,t,n,r,o,i,a){var s,c;if(I(e.elm)&&I(i)&&(e=i[a]=((c=new ie((s=e).tag,s.data,s.children,s.text,s.elm,s.context,s.componentOptions,s.asyncFactory)).ns=s.ns,c.isStatic=s.isStatic,c.key=s.key,c.isComment=s.isComment,c.fnContext=s.fnContext,c.fnOptions=s.fnOptions,c.fnScopeId=s.fnScopeId,c.isCloned=!0,c)),e.isRootInsert=!o,!function(e,t,n,r){var o=e.data;if(I(o)){var i=I(e.componentInstance)&&o.keepAlive;if(I(o=o.hook)&&I(o=o.init)&&o(e,!1,n,r),I(e.componentInstance))return d(e,t),M(i)&&function(e,t,n,r){for(var o,i=e;i.componentInstance;)if(i=i.componentInstance._vnode,I(o=i.data)&&I(o=o.transition)){for(o=0;o<g.activate.length;++o)g.activate[o](Ln,i);t.push(i);break}h(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var l=e.data,u=e.children,f=e.tag;if(I(f)){e.elm=e.ns?_.createElementNS(e.ns,f):_.createElement(f,e),y(e);var p=I(l)&&M(l.appendAsTree);p||(I(l)&&m(e,t),h(n,e.elm,r)),v(e,u,t),p&&(I(l)&&m(e,t),h(n,e.elm,r))}else M(e.isComment)?e.elm=_.createComment(e.text):e.elm=_.createTextNode(e.text),h(n,e.elm,r)}}function d(e,t){I(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,w(e)?(m(e,t),y(e)):(Vn(e),t.push(e))}function h(e,t,n){I(e)&&(I(n)?n.parentNode===e&&_.insertBefore(e,t,n):_.appendChild(e,t))}function v(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)b(t[r],n,e.elm,null,!0,t,r);else T(e.text)&&_.appendChild(e.elm,_.createTextNode(String(e.text)))}function w(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return I(e.tag)}function m(e,t){for(var n=0;n<g.create.length;++n)g.create[n](Ln,e);I(r=e.data.hook)&&(I(r.create)&&r.create(Ln,e),I(r.insert)&&t.push(e))}function y(e){var t;if(I(t=e.fnScopeId))_.setStyleScope(e.elm,t);else for(var n=e;n;)I(t=n.context)&&I(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t),n=n.parent;I(t=ut)&&t!==e.context&&t!==e.fnContext&&I(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t)}function k(e,t,n,r,o,i){for(;r<=o;++r)b(n[r],i,e,t,!1,n,r)}function S(e){var t,n,r=e.data;if(I(r))for(I(t=r.hook)&&I(t=t.destroy)&&t(e),t=0;t<g.destroy.length;++t)g.destroy[t](e);if(I(t=e.children))for(n=0;n<e.children.length;++n)S(e.children[n])}function O(e,t,n,r){for(;n<=r;++n){var o=t[n];I(o)&&(I(o.tag)?(a(o),S(o)):i(o.elm))}}function a(e,t){if(I(t)||I(e.data)){var n,r=g.remove.length+1;for(I(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&i(e)}return n.listeners=t,n}(e.elm,r),I(n=e.componentInstance)&&I(n=n._vnode)&&I(n.data)&&a(n,t),n=0;n<g.remove.length;++n)g.remove[n](e,t);I(n=e.data.hook)&&I(n=n.remove)?n(e,t):t()}else i(e.elm)}function C(e,t,n,r){for(var o=n;o<r;o++){var i=t[o];if(I(i)&&qn(e,i))return o}}function x(e,t,n,r){if(e!==t){var o=t.elm=e.elm;if(M(e.isAsyncPlaceholder))I(t.asyncFactory.resolved)?A(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(M(t.isStatic)&&M(e.isStatic)&&t.key===e.key&&(M(t.isCloned)||M(t.isOnce)))t.componentInstance=e.componentInstance;else{var i,a=t.data;I(a)&&I(i=a.hook)&&I(i=i.prepatch)&&i(e,t);var s=e.children,c=t.children;if(I(a)&&w(t)){for(i=0;i<g.update.length;++i)g.update[i](e,t);I(i=a.hook)&&I(i=i.update)&&i(e,t)}j(t.text)?I(s)&&I(c)?s!==c&&function(e,t,n,r,o){for(var i,a,s,c=0,l=0,u=t.length-1,f=t[0],p=t[u],d=n.length-1,h=n[0],v=n[d],m=!o;c<=u&&l<=d;)j(f)?f=t[++c]:j(p)?p=t[--u]:qn(f,h)?(x(f,h,r),f=t[++c],h=n[++l]):qn(p,v)?(x(p,v,r),p=t[--u],v=n[--d]):qn(f,v)?(x(f,v,r),m&&_.insertBefore(e,f.elm,_.nextSibling(p.elm)),f=t[++c],v=n[--d]):(qn(p,h)?(x(p,h,r),m&&_.insertBefore(e,p.elm,f.elm),p=t[--u]):(j(i)&&(i=Un(t,c,u)),j(a=I(h.key)?i[h.key]:C(h,t,c,u))?b(h,r,e,f.elm,!1,n,l):qn(s=t[a],h)?(x(s,h,r),t[a]=void 0,m&&_.insertBefore(e,s.elm,f.elm)):b(h,r,e,f.elm,!1,n,l)),h=n[++l]);u<c?k(e,j(n[d+1])?null:n[d+1].elm,n,l,d,r):d<l&&O(0,t,c,u)}(o,s,c,n,r):I(c)?(I(e.text)&&_.setTextContent(o,""),k(o,null,c,0,c.length-1,n)):I(s)?O(0,s,0,s.length-1):I(e.text)&&_.setTextContent(o,""):e.text!==t.text&&_.setTextContent(o,t.text),I(a)&&I(i=a.hook)&&I(i=i.postpatch)&&i(e,t)}}}function E(e,t,n){if(M(n)&&I(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var $=s("attrs,class,staticClass,staticStyle,key");function A(e,t,n,r){var o,i=t.tag,a=t.data,s=t.children;if(r=r||a&&a.pre,t.elm=e,M(t.isComment)&&I(t.asyncFactory))return t.isAsyncPlaceholder=!0;if(I(a)&&(I(o=a.hook)&&I(o=o.init)&&o(t,!0),I(o=t.componentInstance)))return d(t,n),!0;if(I(i)){if(I(s))if(e.hasChildNodes())if(I(o=a)&&I(o=o.domProps)&&I(o=o.innerHTML)){if(o!==e.innerHTML)return!1}else{for(var c=!0,l=e.firstChild,u=0;u<s.length;u++){if(!l||!A(l,s[u],n,r)){c=!1;break}l=l.nextSibling}if(!c||l)return!1}else v(t,s,n);if(I(a)){var f=!1;for(var p in a)if(!$(p)){f=!0,m(t,n);break}!f&&a.class&&Be(a.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,r,o,i){if(!j(t)){var a,s=!1,c=[];if(j(e))s=!0,b(t,c,o,i);else{var l=I(e.nodeType);if(!l&&qn(e,t))x(e,t,c,r);else{if(l){if(1===e.nodeType&&e.hasAttribute(P)&&(e.removeAttribute(P),n=!0),M(n)&&A(e,t,c))return E(t,c,!0),e;a=e,e=new ie(_.tagName(a).toLowerCase(),{},[],void 0,a)}var u=e.elm,f=_.parentNode(u);if(b(t,c,u._leaveCb?null:f,_.nextSibling(u)),I(t.parent))for(var p=t.parent,d=w(t);p;){for(var h=0;h<g.destroy.length;++h)g.destroy[h](p);if(p.elm=t.elm,d){for(var v=0;v<g.create.length;++v)g.create[v](Ln,p);var m=p.data.hook.insert;if(m.merged)for(var y=1;y<m.fns.length;y++)m.fns[y]()}else Vn(p);p=p.parent}I(f)?O(0,[e],0,0):I(e.tag)&&S(e)}}return E(t,c,s),t.elm}I(e)&&S(e)}}({nodeOps:Dn,modules:[Yn,nr,ar,lr,{create:pr,activate:pr,remove:function(n,e){var r=n.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var t=ur(n.data.transition);if(!t)return e();if(r._leaveCb)return;var o=t.leaveClass,i=t.leaveToClass,a=t.leaveActiveClass,s=t.beforeLeave,c=t.leave,l=t.afterLeave,u=t.leaveCancelled,f=t.delayLeave,p=c&&1<(c._length||c.length),d=n.context.$options.style||{},h=d[o],v=d[i]||d[a],m=d["@TRANSITION"]&&d["@TRANSITION"][a]||{},y=r._leaveCb=R(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[n.key]=null),y.cancelled?u&&u(r):(e(),l&&l(r)),r._leaveCb=null});f?f(g):g();function g(){var e=n.context.$requireWeexModule("animation");function t(){e.transition(r.ref,{styles:v,duration:m.duration||0,delay:m.delay||0,timingFunction:m.timingFunction||"linear"},p?D:y)}y.cancelled||(n.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[n.key]=n),s&&s(r),h?e.transition(r.ref,{styles:h},t):t(),c&&c(r,y),v||p||y())}}}].concat(Kn),LONG_LIST_THRESHOLD:10}),hr=Object.getOwnPropertyNames(ue);function vr(e,r){var o=e.$el;return o&&"function"==typeof o[r]?function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)}:(te("Can't find component method \""+r+'" on '+o.type),D)}function mr(n,r){Array.isArray(r)&&(!function(p,n){for(var e=function(e,t){var f=hr[e];A(n,f,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this.length,o=ue[f];"function"==typeof o&&o.apply(this,t);var i=vr(p,"removeData"),a=vr(p,"insertRange"),s=vr(p,"setListData");switch(f){case"push":a(r,t);break;case"pop":i(r-1,1);break;case"shift":i(0,1);break;case"unshift":a(0,t);break;case"splice":var c=t[0],l=t[1],u=t.slice(2);0<l&&i(c,l),0<u.length&&a(c,u);break;case"sort":case"reverse":s(this.slice())}})},t=0,r=hr.length;t<r;t++)e(t)}(n,r),r.forEach(function(t,e){u(t)&&!f(t,"[[Watched]]")&&(A(t,"[[Watched]]",!0),n.$watch(function(){for(var e in t)t[e]},function(){vr(n,"updateData")(r.indexOf(t),t)},{deep:!0}))}))}var yr={name:"recycle-list",render:function(e){var t=this;if(this._vnode&&this.$options["[[UseCache]]"])return A(this.$options,"[[UseCache]]",!1),this._vnode;var n=this.$options.parent,r=this.$attrs.bindingExpression;return n&&r&&(n.$watch(r,function(){return A(t.$options,"[[UseCache]]",!0)},{deep:!0,immediate:!0}),mr(this,this.$attrs.listData),n.$watch(r,function(e){mr(t,e)})),e("weex:recycle-list",{on:this._events},this.$slots.default)},renderError:function(e,t){return e("text",{style:{fontSize:"36px",color:"#FF0000"},value:t.toString()})}};function gr(e){if(e.length)return e.map(function(e){var t,n,r=(t=e).tag?t.tag.replace(/vue\-component\-(\d+\-)?/,""):"",o={type:r};if(r){if(o.style=function(e){if(e&&e.data){var t=e.data,n=t.staticStyle,r=t.staticClass;if(e.data.style||e.data.class||n||r){var o=Object.assign({},n,e.data.style),i=e.context.$options.style||{};return[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])}),o}}}(e),e.data&&(o.attr=e.data.attrs,e.data.on&&(o.events=e.data.on)),"span"===r&&((n=e).children&&1===n.children.length&&!n.children[0].tag))return o.attr=o.attr||{},o.attr.value=e.children[0].text.trim(),o}else o.type="span",o.attr={value:(e.text||"").trim()};return e.children&&e.children.length&&(o.children=gr(e.children)),o})}var _r={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:gr(this.$options._renderChildren||[])}})}},br={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function wr(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?wr(nt(t.children)):e}function kr(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[h(i)]=o[i];return t}function Sr(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Or={name:"transition",props:br,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag||tt(e)})).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=wr(o);if(!i)return o;if(this._leaving)return Sr(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:T(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s,c,l=(i.data||(i.data={})).transition=kr(this),u=this._vnode,f=wr(u);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),f&&f.data&&(s=i,(c=f).key!==s.key||c.tag!==s.tag)&&!tt(f)&&(!f.componentInstance||!f.componentInstance._vnode.isComment)){var p=f.data.transition=N({},l);if("out-in"===r)return this._leaving=!0,Ke(p,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),Sr(e,o);if("in-out"===r){if(tt(i))return u;var d,h=function(){d()};Ke(l,"afterEnter",h),Ke(l,"enterCancelled",h),Ke(p,"delayLeave",function(e){d=e})}}return o}}},Cr=N({tag:String,moveClass:String},br);delete Cr.mode;var xr={RecycleList:yr,Richtext:_r,Transition:Or,TransitionGroup:{props:Cr,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(r){return new Promise(function(t,n){e.getComponentRect(r.ref,function(e){e.result?t(e.size):n(new Error("failed to get rect for element: "+r.tag))})})};var r=this.$requireWeexModule("animation");this.animate=function(t,n){return new Promise(function(e){r.transition(t.ref,n,e)})}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=kr(this),s=0;s<o.length;s++){var c=o[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(i.push(c),((n[c.key]=c).data||(c.data={})).transition=a)}if(r){var l=[],u=[];r.forEach(function(e){e.data.transition=a,n[e.key]?l.push(e):u.push(e)}),this.kept=e(t,null,l),this.removed=u}return e(t,null,i)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.getMoveData(e[0].context,t)},methods:{getMoveData:function(e,t){var n=e.$options.style||{};return n["@TRANSITION"]&&n["@TRANSITION"][t]}}}},Er=s("template,script,style,element,content,slot,link,meta,svg,view,a,div,img,image,text,span,input,switch,textarea,spinner,select,slider,slider-neighbor,indicator,canvas,list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown",!0),$r=(s("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),s("richtext,transition,transition-group",!0));s("embed,img,image,input,link,meta",!0);On.config.mustUseProp=function(e,t,n){return!1},On.config.isReservedTag=Er,On.config.isRuntimeComponent=$r,On.config.isUnknownElement=function(e){return!1},On.options.directives={},On.options.components=xr,On.prototype.__patch__=dr,On.prototype.$mount=function(e,t){return n=this,r=e&&(i=this.$document,(a=i.createComment("root")).hasAttribute=a.removeAttribute=function(){},i.documentElement.appendChild(a),a),o=t,n.$el=r,n.$options.render||(n.$options.render=se),ht(n,"beforeMount"),new St(n,function(){n._update(n._render(),o)},D,null,!0),o=!1,null==n.$vnode&&(n._isMounted=!0,ht(n,"mounted")),n;var n,r,o,i,a},e.Vue=On}});e(yr);var gr=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var f={};t.createInstanceContext=function(e,t,n){void 0===n&&(n={});var r,o,i,a,s=t.weex,c=(f[e]={instanceId:e,config:s.config,document:s.document,data:n}).Vue=function(e,t){var n={};yr(n,t.document);var r=n.Vue,o=f[e],i=/^weex:/i,a=r.config.isReservedTag||function(){return!1},s=r.config.isRuntimeComponent||function(){return!1};return r.config.isReservedTag=function(e){return!s(e)&&t.supports("@component/"+e)||a(e)||i.test(e)},r.config.parsePlatformTagName=function(e){return e.replace(i,"")},r.prototype.$instanceId=e,r.prototype.$document=o.document,r.prototype.$requireWeexModule=t.requireModule,r.mixin({beforeCreate:function(){var e=this.$options;if(e.el){var t=e.data,n=("function"==typeof t?t():t)||{};e.data=Object.assign(n,o.data),o.app=this}},mounted:function(){if(this.$options.el&&t.document&&o.app===this)try{t.document.taskCenter.send("dom",{action:"createFinish"},[])}catch(e){}}}),r.prototype.$getConfig=function(){if(o.app instanceof r)return o.config},r}(e,s),l=(r=e,o=s.requireModule,i=f[r],a=o("timer"),{setTimeout:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){a.clearTimeout(e)},clearInterval:function(e){a.clearInterval(e)}}),u=Object.assign({Vue:c},l);return Object.freeze(u),u},t.destroyInstance=function(e){var t=f[e];if(t&&t.app instanceof t.Vue){try{t.app.$destroy(),t.document.destroy()}catch(e){}delete t.document,delete t.app}delete f[e]},t.refreshInstance=function(e,t){var n=f[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");if(n.Vue&&n.Vue.set)for(var r in t)n.Vue.set(n.app,r,t[r]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])}}),_r=e(gr),br=gr.createInstanceContext,wr=gr.destroyInstance,kr=gr.refreshInstance,Sr=Object.freeze({default:_r,__moduleExports:gr,createInstanceContext:br,destroyInstance:wr,refreshInstance:kr});var Or=Object.freeze({$:function(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm},$el:function(e){var t=this._ids[e];if(t)return t.el},$vm:function(e){var t=this._ids[e];if(t)return t.vm},$renderThen:function(e){return this._app.differ.then(function(){e()})},$scrollTo:function(e,t){console.warn("[JS Framework] Vm#$scrollTo is deprecated, please use \"require('@weex-module/dom').scrollTo(el, options)\" instead");var n=this.$el(e);n&&this._app.requireModule("dom").scrollToElement(n.ref,{offset:t})},$transition:function(e,n,r){var o=this,i=this.$el(e);i&&n&&n.styles&&this._app.requireModule("animation").transition(i.ref,n,function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];o._setStyle(i,n.styles),r&&r.apply(void 0,e)})},$getConfig:function(e){var t=this._app.options;return"function"==typeof e&&(console.warn("[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, this api now can directly RETURN config info."),e(t)),t},$sendHttp:function(e,t){console.warn("[JS Framework] Vm#$sendHttp is deprecated, please use \"require('@weex-module/stream').sendHttp(params, callback)\" instead"),this._app.requireModule("stream").sendHttp(e,t)},$openURL:function(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead"),this._app.requireModule("event").openURL(e)},$setTitle:function(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead"),this._app.requireModule("pageInfo").setTitle(e)},$call:function(e,t){for(var n=[],r=arguments.length-2;0<r--;)n[r]=arguments[r+2];console.warn("[JS Framework] Vm#$call is deprecated, please use \"require('@weex-module/moduleName')\" instead");var o=this._app.requireModule(e);o&&o[t]&&o[t].apply(o,n)}});function Cr(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];if("function"==typeof Object.assign)Object.assign.apply(Object,[e].concat(t));else{var r=t.shift();for(var o in r)e[o]=r[o];t.length&&Cr.apply(void 0,[e].concat(t))}return e}function xr(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function Er(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var $r=Object.prototype.hasOwnProperty;function Ar(e,t){return $r.call(e,t)}function jr(n,r){return function(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}}function Ir(e){return null!==e&&"object"==typeof e}var Mr=Object.prototype.toString,Tr="[object Object]";function Pr(e){return Mr.call(e)===Tr}function Fr(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}var Nr,Dr="__proto__"in{};function Rr(){return"object"==typeof nativeSet?nativeSet.create():new Nr}function Vr(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}"undefined"!=typeof Set&&Set.toString().match(/native code/)?Nr=Set:((Nr=function(){this.set=Object.create(null)}).prototype.has=function(e){return void 0!==this.set[e]},Nr.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},Nr.prototype.clear=function(){this.set=Object.create(null)});var Jr=/^@weex-component\//,Lr=/^@weex-module\//,Wr=/^\.{1,2}\//,qr=/\.js$/,Ur=function(e){return!!e.match(Jr)},Br=function(e){return!!e.match(Lr)},zr=function(e){return!!e.match(Wr)},Hr=function(e){return!Ur(e)&&!Br(e)&&!zr(e)};function Xr(e){return e.replace(Jr,"").replace(Lr,"")}function Gr(e){return e.replace(qr,"")}var Kr=0;function Zr(){this.id=Kr++,this.subs=[]}Zr.target=null;var Yr=[];function Qr(){Zr.target=null,Yr=[]}Zr.prototype.addSub=function(e){this.subs.push(e)},Zr.prototype.removeSub=function(e){Er(this.subs,e)},Zr.prototype.depend=function(){Zr.target&&Zr.target.addDep(this)},Zr.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var eo=0;function to(e,t,n,r){r&&Cr(this,r);var o="function"==typeof t;(this.vm=e)._watchers.push(this),this.expression=t,this.cb=n,this.id=++eo,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=Rr(),this.newDepIds=Rr(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}to.prototype.get=function(){var e;e=this,Zr.target&&Yr.push(Zr.target),Zr.target=e;var t=this.getter.call(this.vm,this.vm);return this.deep&&function e(t,n){var r,o,i,a;n||(n=no).clear();i=Array.isArray(t);a=Ir(t);if(i||a){if(t.__ob__){var s=t.__ob__.dep.id;if(n.has(s))return;n.add(s)}if(i)for(r=t.length;r--;)e(t[r],n);else if(a)for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}}(t),Zr.target=Yr.pop(),this.cleanupDeps(),t},to.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},to.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},to.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},to.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(Ir(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},to.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},to.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},to.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||Er(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1,this.vm=this.cb=this.value=null}};var no=Rr();var ro=Array.prototype,oo=Object.create(ro);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=ro[a];xr(oo,a,function(){for(var e=arguments,t=arguments.length,n=new Array(t);t--;)n[t]=e[t];var r,o=s.apply(this,n),i=this.__ob__;switch(a){case"push":case"unshift":r=n;break;case"splice":r=n.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})}),xr(ro,"$set",function(e,t){return console.warn('[JS Framework] "Array.prototype.$set" is not a standard API, it will be removed in the next version.'),e>=this.length&&(this.length=e+1),this.splice(e,1,t)[0]}),xr(ro,"$remove",function(e){console.warn('[JS Framework] "Array.prototype.$remove" is not a standard API, it will be removed in the next version.'),this.length&&("number"!=typeof e&&(e=this.indexOf(e)),-1<e&&this.splice(e,1))});var io=Object.getOwnPropertyNames(oo);function ao(e){(this.value=e,this.dep=new Zr,xr(e,"__ob__",this),Array.isArray(e))?((Dr?so:co)(e,oo,io),this.observeArray(e)):this.walk(e)}function so(e,t){e.__proto__=t}function co(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];xr(e,i,t[i])}}function lo(e,t){var n;if(Ir(e))return Ar(e,"__ob__")&&e.__ob__ instanceof ao?n=e.__ob__:(Array.isArray(e)||Pr(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new ao(e)),n&&t&&n.addVm(t),n}ao.prototype.walk=function(e){for(var t in e)this.convert(t,e[t])},ao.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)lo(e[t])},ao.prototype.convert=function(e,t){!function(o,e,i){var a=new Zr,t=Object.getOwnPropertyDescriptor(o,e);if(t&&!1===t.configurable)return;var s=t&&t.get,n=t&&t.set,c=lo(i);Object.defineProperty(o,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(o):i;if(Zr.target&&(a.depend(),c&&c.dep.depend(),Array.isArray(e)))for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend();return e},set:function(e){var t=s?s.call(o):i;e!==t&&(n?n.call(o,e):i=e,c=lo(e),a.notify())}})}(this.value,e,t)},ao.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},ao.prototype.removeVm=function(e){Er(this.vms,e)};var uo=["$index","$value","$event"];function fo(t,n){(-1<uo.indexOf(n)||!Fr(n))&&Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return t._data[n]},set:function(e){t._data[n]=e}})}function po(e){var t=e._data;Pr(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)fo(e,n[r]);lo(t,e)}function ho(){}function vo(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};"function"==typeof r?(o.get=mo(r,e),o.set=ho):(o.get=r.get?!1!==r.cache?mo(r.get,e):jr(r.get,e):ho,o.set=r.set?jr(r.set,e):ho),Object.defineProperty(e,n,o)}}function mo(e,t){var n=new to(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Zr.target&&n.depend(),n.value}}var yo={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},go=yo.nativeComponentMap,_o={attr:"setAttr",style:"setStyle",event:"addEvent"};function bo(e,t,n){var r,o,i,a,s,c;So(e,t,n.id,e),r=e,o=t,i=n.attr,Co(r,o,"attr",i),function(e,t,n){if("function"!=typeof n&&!Array.isArray(n))return;if(Array.isArray(n)&&!n.length)return t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=Eo(e,n,function(e){Oo(t,r,e)});Oo(t,r,o)}else Oo(t,r,n)}(e,t,n.classList),a=e,s=t,c=n.style,Co(a,s,"style",c),function(e,t,n){if(!n)return;var r=Object.keys(n),o=r.length;for(;o--;){var i=r[o],a=n[i];"string"==typeof a&&((a=e[a])||console.warn('[JS Framework] The event handler "'+a+'" is not defined.')),s=e,c=i,l=a,t.addEvent(c,jr(l,s))}var s,c,l}(e,t,n.events)}function wo(e,t,n,r){void 0===r&&(r={}),function(e,t,n){var r=t._options&&t._options.style||{};if(!n._rootEl)return;var o="@originalRootEl";function i(e,t){"array"===Vr(e)&&e.unshift(t)}if(r[o]=n._rootEl.classStyle,"function"==typeof e){var a=Eo(t,e,function(e){i(e,o),Oo(n._rootEl,r,e)});i(a,o),Oo(n._rootEl,r,a)}else null!=e&&(i(e,o),Oo(n._rootEl,r,e))}(n.classList,e,t),function(r,o,i){var e=function(t){var e=r[t];if("function"==typeof e){var n=Eo(o,e,function(e){i._rootEl&&i._rootEl.setStyle(t,e)});i._rootEl.setStyle(t,n)}else i._rootEl&&i._rootEl.setStyle(t,e)};for(var t in r)e(t)}(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function ko(r,o,i,a){if(r){var e=function(t){if(!o||o[t]){var e=r[t];if("function"==typeof e){var n=Eo(i,e,function(e){a[t]=e});a[t]=n}else a[t]=e}};for(var t in r)e(t)}}function So(t,e,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return e||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;((n=i.call(t))||0===n)&&(t._ids[n]=o),Eo(t,i,function(e){e&&(t._ids[e]=o)})}else n&&"string"==typeof n&&(t._ids[n]=o)}function Oo(e,n,r){"string"==typeof r&&(r=r.split(/\s+/)),r.forEach(function(e,t){r.splice.apply(r,[t,1].concat(e.split(/\s+/)))});for(var o={},t=r.length,i=function(e){var t=n[r[e]];t&&Object.keys(t).forEach(function(e){o[e]=t[e]})},a=0;a<t;a++)i(a);e.setClassStyle(o)}function Co(e,t,n,r){if(r)for(var o=Object.keys(r),i=o.length;i--;){var a=o[i],s=r[a];"function"==typeof s?xo(e,t,n,a,s):t[_o[n]](a,s)}}function xo(r,o,e,i,t){var a=_o[e],n=Eo(r,t,function(e){function t(){o[a](i,e)}var n=r&&r._app&&r._app.differ;n?n.append("element",o.depth||0,o.ref,t):t()});o[a](i,n)}function Eo(e,t,n){return e._static?t.call(e,e):new to(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function $o(e,t){var n=e._app.doc.createComment("start"),r=e._app.doc.createComment("end"),o=Ao++;if(t.element){var i=t.updateMark;i?(i.element&&(i=i.end),t.element.insertAfter(r,i),t.element.insertAfter(n,i),t.updateMark=r):(t.element.insertBefore(n,t.end),t.element.insertBefore(r,t.end)),t=t.element}else t.appendChild(n),t.appendChild(r);return{start:n,end:r,element:t,blockId:o}}var Ao=1;function jo(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=Io(e,t,o);return n.updateMark=t.element?t.end:t,i}if(!t.element)return n.element.insertBefore(t,r);n.element.insertBefore(t.start,r),n.element.insertBefore(t.end,r)}else{if(!t.element)return n.appendChild(t);n.appendChild(t.start),n.appendChild(t.end)}}function Io(e,t,n){return t.element?function(e,t){var n=t.parentNode;if(n){for(var r,o=e.start,i=[o];o&&o!==e.end;)o=o.nextSibling,i.push(o);var a=t;return i.every(function(e){return r=n.insertAfter(e,a),a=e,-1!==r}),r}}(t,n):function(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}(t,n)}function Mo(e,t,n){void 0===n&&(n=!1),t.element?function(e,t){void 0===t&&(t=!1);var n=[],r=e.start.nextSibling;for(;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||To(e.start);n.forEach(function(e){To(e)}),t||To(e.end)}(t,n):To(t),t._vm&&t._vm.$emit("hook:destroyed")}function To(e){var t=e.parentNode;t&&t.removeChild(e)}function Po(e,t,n,r){if(-1!==(e._app||{}).lastSignal){if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),c=t,Array.isArray(c))return i=t,a=r,s=$o(o=e,n),void i.forEach(function(e){Po(o,e,s,a)});var o,i,a,s,c,l,u,f;if(r=r||{},"content"===(l=t).type||"slot"===l.type)return console.debug('[JS Framework] compile "content" block by',t),void(e._content=$o(e,n));if(u=t,!r.hasOwnProperty("repeat")&&u.repeat)return console.debug('[JS Framework] compile "repeat" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `repeat` directive!"):function(e,t,n){var r=t.repeat,o="function"==typeof r,i=r.getter||r.expression||r;"function"!=typeof i&&(i=function(){return[]});var a=r.key||"$index",s=r.value||"$value",c=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,l=$o(e,n);l.children=[],l.data=[],l.vms=[],function(c,i,l,e){var u=l.vms,f=l.children,t=e.getter,p=e.trackBy,d=e.oldStyle,h=e.key,v=e.value;function m(e,t,n){var r;d?Ir(r=e)?(r[h]=t,r.hasOwnProperty("INDEX")||Object.defineProperty(r,"INDEX",{value:function(){console.warn('[JS Framework] "INDEX" in repeat is deprecated, please use "$index" instead')}})):(console.warn("[JS Framework] Each list item must be an object in old-style repeat, please use `repeat={{v in list}}` instead."),(r={})[h]=t,r[v]=e):((r={})[h]=t,r[v]=e);var o=function(e,t){var n=Object.create(e);n._data=t,po(n),vo(n),(n._realParent=e)._static&&(n._static=e._static);return n}(n,r);u.push(o),Po(o,i,l,{repeat:e})}var n=No(c,l,t,"repeat",function(e){if(console.debug('[JS Framework] the "repeat" item has changed',e),l&&e){var r=f.slice(),o=u.slice(),t=l.data.slice(),i={},a={};e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;null!=n&&""!==n&&(i[n]=e)});var s=[];t.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;i.hasOwnProperty(n)?(a[n]={item:e,index:t,key:n,target:r[t],vm:o[t]},s.push(e)):Mo(0,r[t])}),f.length=0,u.length=0,l.data=e.slice(),l.updateMark=l.start,e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t,r=a[n];r?(r.item===s[0]?s.shift():(s.$remove(r.item),Io(0,r.target,l.updateMark)),f.push(r.target),u.push(r.vm),d?r.vm=e:r.vm[v]=e,r.vm[h]=t,l.updateMark=r.target):m(e,t,c)}),delete l.updateMark}});l.data=n.slice(0),n.forEach(function(e,t){m(e,t,c)})}(e,t,l,{getter:i,key:a,value:s,trackBy:c,oldStyle:o})}(e,t,n));if(f=t,!r.hasOwnProperty("shown")&&f.shown)return console.debug('[JS Framework] compile "if" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `if` directive!"):function(e,t,n,r){var o={shown:!0},i=$o(e,n);n.element&&n.children&&n.children.push(i);r.repeat&&(o.repeat=r.repeat);a=e,s=t,c=i,l=o,u=No(a,c,s.shown,"shown",function(e){console.debug('[JS Framework] the "if" item was changed',e),c&&!!c.display!=!!e&&(c.display=!!e,e?Po(a,s,c,l):Mo(0,c,!0))}),c.display=!!u,u&&Po(a,s,c,l);var a,s,c,l,u}(e,t,n,r));var p=r.type||t.type;if(d=r,"function"!=typeof p||d.hasOwnProperty("type")){var d,h,v,m,y,g,_,b,w=p,k=function(e,t,n){var r;e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]);e._options&&e._options.components&&(r=e._options.components[n]);t.component&&(r=r||{});return r}(e,t,w);if(k)return console.debug("[JS Framework] compile composed component by",t),v=k,m=t,y=n,g=w,_=r,b=new(0,(h=e).constructor)(g,v,h,y,void 0,{"hook:init":function(){h._static&&(this._static=h._static),So(h,null,m.id,this),this._externalBinding={parent:h,template:m}},"hook:created":function(){!function(e,t,n,r){n=n||{};var o=((t=t||{})._options||{}).props;Array.isArray(o)&&(o=o.reduce(function(e,t){return e[t]=!0,e},{})),ko(r,o,e,t),ko(n.attr,o,e,t)}(h,this,m,_.repeat)},"hook:ready":function(){this._content&&Fo(h,m,this._content)}}),void wo(h,b,m,y);console.debug("[JS Framework] compile native component by",t),function(e,t,n,r){var o;(function(e){var t=e.type,n=go[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===Vr(e[r])&&"object"===Vr(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])})(t),"_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),a=r,o=e._app.doc.createBody(a)):(console.debug("[JS Framework] compile to create element for "+r),i=r,o=e._app.doc.createElement(i));var i;var a;if(!e._rootEl){e._rootEl=o;var s=e._externalBinding||{},c=s.template,l=s.parent;if(c&&c.events&&l&&o)for(var u in c.events){var f=l[c.events[u]];f&&o.addEvent(u,jr(f,l))}}bo(e,o,t),t.attr&&t.attr.append&&(t.append=t.attr.append);t.append&&(o.attr=o.attr||{},o.attr.append=t.append);var p="tree"===t.append,d=e._app||{};-1===d.lastSignal||p||(console.debug("[JS Framework] compile to append single node for",o),d.lastSignal=jo(e,o,n));-1!==d.lastSignal&&Fo(e,t,o);-1!==d.lastSignal&&p&&(console.debug("[JS Framework] compile to append whole tree for",o),d.lastSignal=jo(e,o,n))}(e,t,n,w)}else!function(n,r,e,t,o){var i=Cr({type:t.call(n)},o),a=$o(n,e);e.element&&e.children&&e.children.push(a);Eo(n,t,function(e){var t=Cr({type:e},o);Mo(0,a,!0),Po(n,r,a,t)}),Po(n,r,a,i)}(e,t,n,p,r)}}function Fo(t,e,n){var r=t._app||{},o=e.children;o&&o.length&&o.every(function(e){return Po(t,e,n),-1!==r.lastSignal})}function No(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return Eo(e,n,function(e){a.latestValue=e,i&&!a.recorded&&i.append(r,s,t.blockId,function(){var e=a.latestValue;o(e),a.recorded=!1,a.latestValue=void 0}),a.recorded=!0})}function Do(e,t){if(t instanceof Do)return t;this.timestamp=Date.now(),this.detail=t,this.type=e;var n=!1;this.stop=function(){n=!0},this.hasStopped=function(){return n}}function Ro(e,t){var n=this,r=this._vmEvents[e];if(r){var o=new Do(e,t);r.forEach(function(e){e.call(n,o)})}}function Vo(e,t){var n=new Do(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Jo(t,e){var n=new Do(t,e);this.$emit(t,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(e){e.$broadcast(t,n)})}function Lo(e,t){if(e&&"function"==typeof t){var n=this._vmEvents,r=n[e]||[];r.push(t),n[e]=r,"hook:ready"===e&&this._ready&&this.$emit("hook:ready")}}function Wo(e,t){if(e){var n=this._vmEvents;if(t){var r=n[e];r&&r.$remove(t)}else delete n[e]}}var qo,Uo=["init","created","ready","destroyed"];function Bo(e,t,n,r,o,i){n=n||{},this._parent=n._realParent?n._realParent:n,this._app=n._app||{},n._childrenVms&&n._childrenVms.push(this),!t&&this._app.customComponentMap&&(t=this._app.customComponentMap[e]);var a,s,c,l,u=(t=t||{}).data||{};(this._options=t,this._methods=t.methods||{},this._computed=t.computed||{},this._css=t.style||{},this._ids={},this._vmEvents={},this._childrenVms=[],this._type=e,function(t,e){var n=t._options||{},r=n.events||{};for(var o in r)t.$on(o,r[o]);for(var i in e)t.$on(i,e[i]);Uo.forEach(function(e){t.$on("hook:"+e,n[e])})}(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof u?u():u,o&&Cr(this._data,o),(a=this)._watchers=[],po(a),vo(a),function(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}(a),console.debug('[JS Framework] "created" lifecycle in Vm('+this._type+")"),this.$emit("hook:created"),this._created=!0,t.methods&&t.methods.ready&&(console.warn('"exports.methods.ready" is deprecated, please use "exports.created" instead'),t.methods.ready.call(this)),this._app.doc)&&(this._parentEl=r||this._app.doc.documentElement,c=(s=this)._options||{},l=c.template||{},c.replace?l.children&&1===l.children.length?Po(s,l.children[0],s._parentEl):Po(s,l.children,s._parentEl):Po(s,l,s._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+s._type+")"),s.$emit("hook:ready"),s._ready=!0)}(qo=Bo.prototype).$emit=Ro,qo.$dispatch=Vo,qo.$broadcast=Jo,qo.$on=Lo,qo.$off=Wo,Bo.prototype.$watch=function(e,t){Eo(this,e,t)},Bo.set=function e(t,n,r){if(Array.isArray(t))return t.splice(n,1,r);if(Ar(t,n))t[n]=r;else if(t._isVue)e(t._data,n,r);else{var o=t.__ob__;if(o){if(o.convert(n,r),o.dep.notify(),o.vms)for(var i=o.vms.length;i--;)fo(o.vms[i],n);return r}t[n]=r}},Bo.delete=function(e,t){if(Ar(e,t)){delete e[t];var n=e.__ob__;if(n){if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;)o=n.vms[r],Fr(i=t)||delete o[i]}else e._isVue&&delete e._data[t]}var o,i};var zo={};function Ho(n,r){var e=function(e){var t=zo[e];t||(t={},zo[e]=t),n[e].forEach(function(e){"string"==typeof e&&(e={name:e}),t[e.name]&&!r||(t[e.name]=e)})};for(var t in n)e(t)}function Xo(e,t){return e.customComponentMap[t]}function Go(e,t,n){var r=e.customComponentMap;r[t]?console.error("[JS Framework] define a component("+t+") that already exists"):r[t]=n}var Ko=n(function(e,r){var f;r=e.exports=H,"object"==typeof process&&process.env,f=function(){},r.SEMVER_SPEC_VERSION="2.0.0";var o=256,i=Number.MAX_SAFE_INTEGER||9007199254740991,l=r.re=[],t=r.src=[],n=0,a=n++;t[a]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var c=n++;t[c]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var u=n++;t[u]="("+t[a]+")\\.("+t[a]+")\\.("+t[a]+")";var p=n++;t[p]="("+t[s]+")\\.("+t[s]+")\\.("+t[s]+")";var d=n++;t[d]="(?:"+t[a]+"|"+t[c]+")";var h=n++;t[h]="(?:"+t[s]+"|"+t[c]+")";var v=n++;t[v]="(?:-("+t[d]+"(?:\\."+t[d]+")*))";var m=n++;t[m]="(?:-?("+t[h]+"(?:\\."+t[h]+")*))";var y=n++;t[y]="[0-9A-Za-z-]+";var g=n++;t[g]="(?:\\+("+t[y]+"(?:\\."+t[y]+")*))";var _=n++,b="v?"+t[u]+t[v]+"?"+t[g]+"?";t[_]="^"+b+"$";var w="[v=\\s]*"+t[p]+t[m]+"?"+t[g]+"?",k=n++;t[k]="^"+w+"$";var S=n++;t[S]="((?:<|>)?=?)";var O=n++;t[O]=t[s]+"|x|X|\\*";var C=n++;t[C]=t[a]+"|x|X|\\*";var x=n++;t[x]="[v=\\s]*("+t[C]+")(?:\\.("+t[C]+")(?:\\.("+t[C]+")(?:"+t[v]+")?"+t[g]+"?)?)?";var E=n++;t[E]="[v=\\s]*("+t[O]+")(?:\\.("+t[O]+")(?:\\.("+t[O]+")(?:"+t[m]+")?"+t[g]+"?)?)?";var $=n++;t[$]="^"+t[S]+"\\s*"+t[x]+"$";var A=n++;t[A]="^"+t[S]+"\\s*"+t[E]+"$";var j=n++;t[j]="(?:^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])";var I=n++;t[I]="(?:~>?)";var M=n++;t[M]="(\\s*)"+t[I]+"\\s+",l[M]=new RegExp(t[M],"g");var T=n++;t[T]="^"+t[I]+t[x]+"$";var P=n++;t[P]="^"+t[I]+t[E]+"$";var F=n++;t[F]="(?:\\^)";var N=n++;t[N]="(\\s*)"+t[F]+"\\s+",l[N]=new RegExp(t[N],"g");var D=n++;t[D]="^"+t[F]+t[x]+"$";var R=n++;t[R]="^"+t[F]+t[E]+"$";var V=n++;t[V]="^"+t[S]+"\\s*("+w+")$|^$";var J=n++;t[J]="^"+t[S]+"\\s*("+b+")$|^$";var L=n++;t[L]="(\\s*)"+t[S]+"\\s*("+w+"|"+t[x]+")",l[L]=new RegExp(t[L],"g");var W=n++;t[W]="^\\s*("+t[x]+")\\s+-\\s+("+t[x]+")\\s*$";var q=n++;t[q]="^\\s*("+t[E]+")\\s+-\\s+("+t[E]+")\\s*$";var U=n++;t[U]="(<|>)?=?\\s*\\*";for(var B=0;B<35;B++)f(B,t[B]),l[B]||(l[B]=new RegExp(t[B]));function z(e,t){if(e instanceof H)return e;if("string"!=typeof e)return null;if(e.length>o)return null;if(!(t?l[k]:l[_]).test(e))return null;try{return new H(e,t)}catch(e){return null}}function H(e,t){if(e instanceof H){if(e.loose===t)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>o)throw new TypeError("version is longer than "+o+" characters");if(!(this instanceof H))return new H(e,t);f("SemVer",e,t),this.loose=t;var n=e.trim().match(t?l[k]:l[_]);if(!n)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>i||this.major<0)throw new TypeError("Invalid major version");if(this.minor>i||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>i||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map(function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(0<=t&&t<i)return t}return e}):this.prerelease=[],this.build=n[5]?n[5].split("."):[],this.format()}r.parse=z,r.valid=function(e,t){var n=z(e,t);return n?n.version:null},r.clean=function(e,t){var n=z(e.trim().replace(/^[=v]+/,""),t);return n?n.version:null},(r.SemVer=H).prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},H.prototype.toString=function(){return this.version},H.prototype.compare=function(e){return f("SemVer.compare",this.version,this.loose,e),e instanceof H||(e=new H(e,this.loose)),this.compareMain(e)||this.comparePre(e)},H.prototype.compareMain=function(e){return e instanceof H||(e=new H(e,this.loose)),G(this.major,e.major)||G(this.minor,e.minor)||G(this.patch,e.patch)},H.prototype.comparePre=function(e){if(e instanceof H||(e=new H(e,this.loose)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;var t=0;do{var n=this.prerelease[t],r=e.prerelease[t];if(f("prerelease compare",t,n,r),void 0===n&&void 0===r)return 0;if(void 0===r)return 1;if(void 0===n)return-1;if(n!==r)return G(n,r)}while(++t)},H.prototype.inc=function(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t),this.inc("pre",t);break;case"prerelease":0===this.prerelease.length&&this.inc("patch",t),this.inc("pre",t);break;case"major":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case"patch":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case"pre":if(0===this.prerelease.length)this.prerelease=[0];else{for(var n=this.prerelease.length;0<=--n;)"number"==typeof this.prerelease[n]&&(this.prerelease[n]++,n=-2);-1===n&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},r.inc=function(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new H(e,n).inc(t,r).version}catch(e){return null}},r.diff=function(e,t){{if(Q(e,t))return null;var n=z(e),r=z(t);if(n.prerelease.length||r.prerelease.length){for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return"pre"+o;return"prerelease"}for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return o}},r.compareIdentifiers=G;var X=/^[0-9]+$/;function G(e,t){var n=X.test(e),r=X.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:t<e?1:0}function K(e,t,n){return new H(e,n).compare(new H(t,n))}function Z(e,t,n){return 0<K(e,t,n)}function Y(e,t,n){return K(e,t,n)<0}function Q(e,t,n){return 0===K(e,t,n)}function ee(e,t,n){return 0!==K(e,t,n)}function te(e,t,n){return 0<=K(e,t,n)}function ne(e,t,n){return K(e,t,n)<=0}function re(e,t,n,r){var o;switch(t){case"===":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e===n;break;case"!==":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e!==n;break;case"":case"=":case"==":o=Q(e,n,r);break;case"!=":o=ee(e,n,r);break;case">":o=Z(e,n,r);break;case">=":o=te(e,n,r);break;case"<":o=Y(e,n,r);break;case"<=":o=ne(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}function oe(e,t){if(e instanceof oe){if(e.loose===t)return e;e=e.value}if(!(this instanceof oe))return new oe(e,t);f("comparator",e,t),this.loose=t,this.parse(e),this.semver===ie?this.value="":this.value=this.operator+this.semver.version,f("comp",this)}r.rcompareIdentifiers=function(e,t){return G(t,e)},r.major=function(e,t){return new H(e,t).major},r.minor=function(e,t){return new H(e,t).minor},r.patch=function(e,t){return new H(e,t).patch},r.compare=K,r.compareLoose=function(e,t){return K(e,t,!0)},r.rcompare=function(e,t,n){return K(t,e,n)},r.sort=function(e,n){return e.sort(function(e,t){return r.compare(e,t,n)})},r.rsort=function(e,n){return e.sort(function(e,t){return r.rcompare(e,t,n)})},r.gt=Z,r.lt=Y,r.eq=Q,r.neq=ee,r.gte=te,r.lte=ne,r.cmp=re,r.Comparator=oe;var ie={};function ae(e,t){if(e instanceof ae)return e.loose===t?e:new ae(e.raw,t);if(e instanceof oe)return new ae(e.value,t);if(!(this instanceof ae))return new ae(e,t);if(this.loose=t,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function se(e){return!e||"x"===e.toLowerCase()||"*"===e}function ce(e,t,n,r,o,i,a,s,c,l,u,f,p){return((t=se(n)?"":se(r)?">="+n+".0.0":se(o)?">="+n+"."+r+".0":">="+t)+" "+(s=se(c)?"":se(l)?"<"+(+c+1)+".0.0":se(u)?"<"+c+"."+(+l+1)+".0":f?"<="+c+"."+l+"."+u+"-"+f:"<="+s)).trim()}function le(e,t){for(var n=0;n<e.length;n++)if(!e[n].test(t))return!1;if(t.prerelease.length){for(n=0;n<e.length;n++)if(f(e[n].semver),e[n].semver!==ie&&0<e[n].semver.prerelease.length){var r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}function ue(e,t,n){try{t=new ae(t,n)}catch(e){return!1}return t.test(e)}function fe(e,t,n,r){var o,i,a,s,c;switch(e=new H(e,r),t=new ae(t,r),n){case">":o=Z,i=ne,a=Y,s=">",c=">=";break;case"<":o=Y,i=te,a=Z,s="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ue(e,t,r))return!1;for(var l=0;l<t.set.length;++l){var u=t.set[l],f=null,p=null;if(u.forEach(function(e){e.semver===ie&&(e=new oe(">=0.0.0")),f=f||e,p=p||e,o(e.semver,f.semver,r)?f=e:a(e.semver,p.semver,r)&&(p=e)}),f.operator===s||f.operator===c)return!1;if((!p.operator||p.operator===s)&&i(e,p.semver))return!1;if(p.operator===c&&a(e,p.semver))return!1}return!0}oe.prototype.parse=function(e){var t=this.loose?l[V]:l[J],n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1],"="===this.operator&&(this.operator=""),n[2]?this.semver=new H(n[2],this.loose):this.semver=ie},oe.prototype.toString=function(){return this.value},oe.prototype.test=function(e){return f("Comparator.test",e,this.loose),this.semver===ie||("string"==typeof e&&(e=new H(e,this.loose)),re(e,this.operator,this.semver,this.loose))},oe.prototype.intersects=function(e,t){if(!(e instanceof oe))throw new TypeError("a Comparator is required");var n;if(""===this.operator)return n=new ae(e.value,t),ue(this.value,n,t);if(""===e.operator)return n=new ae(this.value,t),ue(e.semver,n,t);var r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),o=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),i=this.semver.version===e.semver.version,a=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),s=re(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=re(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||c},(r.Range=ae).prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},ae.prototype.toString=function(){return this.range},ae.prototype.parseRange=function(e){var c=this.loose;e=e.trim(),f("range",e,c);var t=c?l[q]:l[W];e=e.replace(t,ce),f("hyphen replace",e),e=e.replace(l[L],"$1$2$3"),f("comparator trim",e,l[L]),e=(e=(e=e.replace(l[M],"$1~")).replace(l[N],"$1^")).split(/\s+/).join(" ");var n=c?l[V]:l[J],r=e.split(" ").map(function(e){return n=c,f("comp",t=e),a=n,t=t.trim().split(/\s+/).map(function(e){return function(a,e){f("caret",a,e);var t=e?l[R]:l[D];return a.replace(t,function(e,t,n,r,o){var i;return f("caret",a,e,t,n,r,o),se(t)?i="":se(n)?i=">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?i="0"===t?">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":">="+t+"."+n+".0 <"+(+t+1)+".0.0":o?(f("replaceCaret pr",o),"-"!==o.charAt(0)&&(o="-"+o),i="0"===t?"0"===n?">="+t+"."+n+"."+r+o+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+o+" <"+(+t+1)+".0.0"):(f("no pr"),i="0"===t?"0"===n?">="+t+"."+n+"."+r+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+" <"+(+t+1)+".0.0"),f("caret return",i),i})}(e,a)}).join(" "),f("caret",t),s=n,t=t.trim().split(/\s+/).map(function(e){return a=e,t=s?l[P]:l[T],a.replace(t,function(e,t,n,r,o){var i;return f("tilde",a,e,t,n,r,o),se(t)?i="":se(n)?i=">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?i=">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":o?(f("replaceTilde pr",o),"-"!==o.charAt(0)&&(o="-"+o),i=">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0"):i=">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0",f("tilde return",i),i});var a,t}).join(" "),f("tildes",t),f("replaceXRanges",o=t,i=n),t=o.split(/\s+/).map(function(e){return function(u,e){u=u.trim();var t=e?l[A]:l[$];return u.replace(t,function(e,t,n,r,o,i){f("xRange",u,e,t,n,r,o,i);var a=se(n),s=a||se(r),c=s||se(o),l=c;return"="===t&&l&&(t=""),a?e=">"===t||"<"===t?"<0.0.0":"*":t&&l?(s&&(r=0),c&&(o=0),">"===t?(t=">=",s?(n=+n+1,o=r=0):c&&(r=+r+1,o=0)):"<="===t&&(t="<",s?n=+n+1:r=+r+1),e=t+n+"."+r+"."+o):s?e=">="+n+".0.0 <"+(+n+1)+".0.0":c&&(e=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0"),f("xRange return",e),e})}(e,i)}).join(" "),f("xrange",t),f("replaceStars",r=t,n),t=r.trim().replace(l[U],""),f("stars",t),t;var t,n,r,o,i,s,a}).join(" ").split(/\s+/);return this.loose&&(r=r.filter(function(e){return!!e.match(n)})),r=r.map(function(e){return new oe(e,c)})},ae.prototype.intersects=function(n,r){if(!(n instanceof ae))throw new TypeError("a Range is required");return this.set.some(function(e){return e.every(function(t){return n.set.some(function(e){return e.every(function(e){return t.intersects(e,r)})})})})},r.toComparators=function(e,t){return new ae(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})},ae.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new H(e,this.loose));for(var t=0;t<this.set.length;t++)if(le(this.set[t],e))return!0;return!1},r.satisfies=ue,r.maxSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&-1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.minSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.validRange=function(e,t){try{return new ae(e,t).range||"*"}catch(e){return null}},r.ltr=function(e,t,n){return fe(e,t,"<",n)},r.gtr=function(e,t,n){return fe(e,t,">",n)},r.outside=fe,r.prerelease=function(e,t){var n=z(e,t);return n&&n.prerelease.length?n.prerelease:null},r.intersects=function(e,t,n){return e=new ae(e,n),t=new ae(t,n),e.intersects(t)},r.coerce=function(e){if(e instanceof H)return e;if("string"!=typeof e)return null;var t=e.match(l[j]);if(null==t)return null;return z((t[1]||"0")+"."+(t[2]||"0")+"."+(t[3]||"0"))}});Ko.SEMVER_SPEC_VERSION,Ko.re,Ko.src,Ko.parse,Ko.valid,Ko.clean,Ko.SemVer,Ko.inc,Ko.diff,Ko.compareIdentifiers,Ko.rcompareIdentifiers,Ko.major,Ko.minor,Ko.patch,Ko.compare,Ko.compareLoose,Ko.rcompare,Ko.sort,Ko.rsort,Ko.gt,Ko.lt,Ko.eq,Ko.neq,Ko.gte,Ko.lte,Ko.cmp,Ko.Comparator,Ko.Range,Ko.toComparators,Ko.satisfies,Ko.maxSatisfying,Ko.minSatisfying,Ko.validRange,Ko.ltr,Ko.gtr,Ko.outside,Ko.prerelease,Ko.intersects,Ko.coerce;function Zo(e){if(Ko.valid(e))return e;for(var t=(e="string"==typeof e?e:"").split("."),n=0,r=[];n<3;){var o="string"==typeof t[n]&&t[n]?t[n]:"0";r.push(o),n++}return r.join(".")}function Yo(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return r.errorMessage="Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n,0<=o.indexOf("osversion")?r.code=1001:0<=o.indexOf("appversion")?r.code=1002:0<=o.indexOf("weexversion")?r.code=1003:0<=o.indexOf("devicemodel")&&(r.code=1004),r}function Qo(e,t,n,r){var o;if(console.debug("[JS Framework] bootstrap for "+t),Ur(t))o=Xr(t);else{if(!Hr(t))return new Error("Wrong component name: "+t);if(!Xo(e,o=Gr(t)))return new Error("It's not a component: "+t)}if("string"==typeof(n=Pr(n)?n:{}).transformerVersion&&"string"==typeof global.transformerVersion&&!Ko.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=function(e,t){t=Pr(t=t||global.WXEnvironment)?t:{};var n={isDowngrade:!1};if("function"===Vr(e)){var r=e.call(this,t,{semver:Ko,normalizeVersion:Zo});n=(r=!!r)?Yo("custom","","custom params"):n}else{var o=(e=Pr(e)?e:{})[(t.platform||"unknow").toLowerCase()]||{};for(var i in t){var a=i,s=a.toLowerCase(),c=t[i],l=0<=s.indexOf("version"),u=0<=s.indexOf("devicemodel"),f=o[i];if(f&&l){var p=Zo(f),d=Zo(t[i]);if(Ko.satisfies(d,p)){n=Yo(a,c,f);break}}else if(u&&0<=("array"===Vr(f)?f:[f]).indexOf(c)){n=Yo(a,c,f);break}}}return n}(n.downgrade);if(i.isDowngrade)return e.callTasks([{module:"instanceWrap",method:"error",args:[i.errorType,i.code,i.errorMessage]}]),new Error("Downgrade["+i.code+"]: "+i.errorMessage);n.viewport&&function(e,t){if(void 0===t&&(t={}),e&&e.callTasks)e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}(e,n.viewport),e.vm=new Bo(o,null,{_app:e},null,r)}var ei=function(o,e){for(var t,n,r,i=[],a=arguments.length-2;0<a--;)i[a]=arguments[a+2];if(console.debug("[JS Framework] define a component "+e),"function"==typeof(r=1<i.length?i[1]:i[0])&&(n=r,r=null),n){var s={exports:{}};n(function(e){if(Ur(e)){var t=Xr(e);return Xo(o,t)}if(Br(e)){var n=Xr(e);return o.requireModule(n)}if(zr(e)||Hr(e)){var r=Gr(e);return o.commonModules[r]}},s.exports,s),r=s.exports}if(Ur(e)){var c=Xr(e);Go(o,c,r)}else if(Br(e)){Ho(((t={})[Xr(e)]=r,t))}else if(zr(e)){var l=Gr(e);o.commonModules[l]=r}else if(Hr(e)){var u=Gr(e);r.template||r.style||r.methods?Go(o,u,r):o.commonModules[u]=r}};function ti(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&function e(t){delete t._app;delete t._computed;delete t._css;delete t._data;delete t._ids;delete t._methods;delete t._options;delete t._parent;delete t._parentEl;delete t._rootEl;if(t._watchers){for(var n=t._watchers.length;n--;)t._watchers[n].teardown();delete t._watchers}if(t._childrenVms){for(var r=t._childrenVms.length;r--;)e(t._childrenVms[r]);delete t._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+t._type+")");t.$emit("hook:destroyed");delete t._type;delete t._vmEvents}(e.vm),e.id="",e.options=null,e.blocks=null,e.vm=null,e.doc.taskCenter.destroyCallback(),e.doc.destroy(),e.doc=null,e.customComponentMap=null,e.commonModules=null}function ni(e){e.differ.flush()}function ri(r,e,o,t){var i;console.debug("[JS Framework] Intialize an instance with:\n",o);var n,a=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return ei.apply(void 0,[r].concat(e))},s=function(e,t,n){i=Qo(r,e,t,n||o),ni(r),r.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+r.id+")")},c=Bo,l=r.doc,u=function(e){return r.requireModule(Xr(e))},f={config:r.options,define:a,bootstrap:s,requireModule:u,document:l,Vm:c};Object.freeze(f),"function"==typeof e?n=e.toString().substr(12):e&&(n=e.toString()),n='(function(global){\n\n"use strict";\n\n '+n+" \n\n})(Object.create(this))";var p=global.WXEnvironment,d={};if(p&&"Web"!==p.platform){var h=r.requireModule("timer");Object.assign(d,{setTimeout:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setTimeout(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setInterval(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){h.clearTimeout(e)},clearInterval:function(e){h.clearInterval(e)}})}var v=Object.assign({define:a,require:function(t){return function(e){i=Qo(r,t,{},e)}},bootstrap:s,register:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return function(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),Go(e,t,n)}.apply(void 0,[r].concat(e))},render:function(e,t){i=Qo(r,e,{},t)},__weex_define__:a,__weex_bootstrap__:s,__weex_document__:l,__weex_require__:u,__weex_viewmodel__:c,weex:f},d,t);return function(e,t){if("function"!=typeof compileAndRunBundle)return!1;var n=void 0,r=!1,o="(function (",i=[],a=[];for(var s in e)i.push(s),a.push(e[s]);for(var c=0;c<i.length-1;++c)o+=i[c],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var l=e.weex||{},u=l.config||{};(n=compileAndRunBundle(o,u.bundleUrl,u.bundleDigest,u.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}(v,n)||function(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}(v,n),i}var oi=function(e){this.id=e,this.map=[],this.hooks=[]};function ii(e,t){var n=e[t];for(var r in n)n[r]()}function ai(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new yo.Document(e,this.options.bundleUrl,null,yo.Listener),this.differ=new oi(e)}oi.prototype.isEmpty=function(){return 0===this.map.length},oi.prototype.append=function(e,t,n,r){var o=this;void 0===t&&(t=0),this.hasTimer||(this.hasTimer=!0,setTimeout(function(){o.hasTimer=!1,o.flush(!0)},0));var i=this.map;i[t]||(i[t]={});var a=i[t];a[e]||(a[e]={}),"element"===e?(a[e][n]||(a[e][n]=[]),a[e][n].push(r)):a[e][n]=r},oi.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){ii(e,"repeat"),ii(e,"shown"),function(e,t){var n=e[t];for(var r in n){var o=n[r];o.forEach(function(e){e()})}}(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},oi.prototype.then=function(e){this.hooks.push(e)},ai.prototype.requireModule=function(e){return function(r,o){var e=zo[o],t={},n=function(n){Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return r.callTasks({module:o,method:n,args:e})}},set:function(e){if("function"==typeof e)return r.callTasks({module:o,method:n,args:[e]})}})};for(var i in e)n(i);return t}(this,e)},ai.prototype.updateActions=function(){return ni(this)},ai.prototype.callTasks=function(e){return t=this,"array"!==Vr(n=e)&&(n=[n]),n.forEach(function(e){r=t.doc.taskCenter.send("module",{module:e.module,method:e.method},e.args)}),r;var t,n,r},Object.freeze(ai),Object.freeze(ai.prototype);var si={};var ci=yo.nativeComponentMap;function li(e){"object"==typeof e&&function(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}(Bo,e)}global.registerMethods=li;var ui={fireEvent:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function t(n,e,r,o,i){if(console.debug('[JS Framework] Fire a "'+r+'" event on an element('+e+") in instance("+n.id+")"),!Array.isArray(e)){var a=n.doc.getRef(e);if(a){var s=n.doc.fireEvent(a,r,o,i);return n.differ.flush(),n.doc.taskCenter.send("dom",{action:"updateFinish"},[]),s}return new Error('invalid element reference "'+e+'"')}e.some(function(e){return!1!==t(n,e,r,o)})}.apply(void 0,[si[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function(e,t,n,r){console.debug("[JS Framework] Invoke a callback("+t+") with",n,"in instance("+e.id+")");var o=e.doc.taskCenter.callback(t,n,r);return ni(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}.apply(void 0,[si[e]].concat(t))}};li(Or),Object.freeze(Bo);var fi=Object.freeze({registerComponents:function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?ci[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(ci[e.type]=e))})},registerModules:function(e){"object"==typeof e&&Ho(e)},registerMethods:li,createInstance:function(e,t,n,r,o){var i=(o||{}).services;Qr();var a,s=si[e];return n=n||{},s?a=new Error('invalid instance id "'+e+'"'):(s=new ai(e,n),a=ri(si[e]=s,t,r,i)),a instanceof Error?a:s},init:function(e){yo.Document=e.Document,yo.Element=e.Element,yo.Comment=e.Comment,yo.sendTasks=e.sendTasks,yo.Listener=e.Listener},refreshInstance:function(e,t){var n=si[e];return n?function(e,t){console.debug("[JS Framework] Refresh with",t,"in instance["+e.id+"]");var n=e.vm;return n&&t?("function"==typeof n.refreshData?n.refreshData(t):Cr(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}(n,t):new Error('invalid instance id "'+e+'"')},destroyInstance:function(e){"function"==typeof markupState&&markupState(),Qr();var t=si[e];if(!t)return new Error('invalid instance id "'+e+'"');ti(t),delete si[e];var n=Math.round(e);return 0<n&&(n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory()),si},receiveTasks:function(r,e){if(si[r]&&Array.isArray(e)){var o=[];return e.forEach(function(e){var t=ui[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),o.push(t.apply(void 0,n)))}),o}return new Error('invalid instance id "'+r+'" or tasks')},getRoot:function(e){var t,n=si[e];return n?(t=(n.doc||{}).body||{}).toJSON?t.toJSON():{}:new Error('invalid instance id "'+e+'"')}}),pi={Vanilla:mr,Vue:Sr,Rax:e(n(function(e){e.exports=function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}return o.m=n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.getInstance=r,t.init=function(e){c=e.Document,e.Element,e.Comment},t.createInstanceContext=function(e,t,n){var r=l[e],o=t.weex;{if(null==r){var i=o.config.bundleUrl;i?i.split("//")[0]||(i="https:"+i):(console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".'),i="about:blank");var a=new c(e,i);r=l[e]={document:a,instanceId:e,bundleUrl:i,__weex_data__:n,uid:0};var s={instanceId:e,bundleUrl:i,document:a,__weex_document__:a,__weex_options__:t,__weex_data__:n||{},callNative:function(){},__weex_config__:t};return s}throw new Error('Instance id "'+e+'" existed when create instance')}},t.refreshInstance=function(e,t){var n=r(e).document;n.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),n.taskCenter.send("dom",{action:"refreshFinish"},[])},t.destroyInstance=function(e){var t=r(e),n=(t.bundleCode,t.document);n.documentElement.fireEvent("destory",{timestamp:Date.now()}),n.destroy&&n.destroy();n.taskCenter&&n.taskCenter.destroyCallback&&n.taskCenter.destroyCallback();delete l[e]};var c=void 0,l={};function r(e){var t=l[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}t.default=t}])})),Weex:fi};var di,hi,vi,mi,yi=Object.freeze({$userTrack:function(e,t,n,r){console.error("[Upgrade Warning] $userTrack will be removed in the next version!"),console.error("[JS Framework] Vm#$userTrack is deprecated, please use \"require('@weex-module/userTrack').commit(type, name, comName, param)\" instead"),this._app.requireModule("userTrack").commit(e,t,n,r)},$sendMtop:function(e,t){console.error("[Upgrade Warning] $sendMtop will be removed in the next version!"),console.error("[JS Framework] Vm#$sendMtop is deprecated, please use \"require('@weex-module/stream').sendMtop(params, callback)\" instead"),"undefined"==typeof window?this._app.requireModule("windvane").call({class:"MtopWVPlugin",method:"send",data:e},t):this._app.requireModule("stream").sendMtop(e,t)},$callWindvane:function(e,t){console.error("[Upgrade Warning] $callWindvane will be removed in the next version!"),console.error("[JS Framework] Vm#$callWindvane is deprecated, please use \"require('@weex-module/windvane').call(params, callback)\" instead"),this._app.requireModule("windvane").call(e,t)},$setSpm:function(e,t){console.error("[Upgrade Warning] $setSpm will be removed in the next version!"),console.error("[JS Framework] Vm#$setSpm is deprecated, please use \"require('@weex-module/pageInfo').setSpm(a, b)\" instead"),this._app.requireModule("pageInfo").setSpm(e,t)},$getUserInfo:function(e){console.error("[Upgrade Warning] $getUserInfo will be removed in the next version!"),console.error("[JS Framework] Vm#$getUserInfo is deprecated, please use \"require('@weex-module/user').getUserInfo(callback)\" instead"),this._app.requireModule("user").getUserInfo(e)},$login:function(e){console.error("[Upgrade Warning] $login will be removed in the next version!"),console.error("[JS Framework] Vm#$login is deprecated, please use \"require('@weex-module/user').login(callback)\" instead"),this._app.requireModule("user").login(e)},$logout:function(e){console.error("[Upgrade Warning] $logout will be removed in the next version!"),console.error("[JS Framework] Vm#$logout is deprecated, please use \"require('@weex-module/user').logout(callback)\" instead"),this._app.requireModule("user").logout(e)}}),gi=n(function(e,t){console.log("Start windmill weex-vue-plugin (0.1.5) framework. Build at 2018-06-20 14:30"),e.exports=function(){"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{writable:!0,enumerable:!1,configurable:!0,value:function(e,t){var n=arguments;if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var r=Object(e),o=1;o<arguments.length;o++){var i=n[o];if(null!=i)for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(r[a]=i[a])}return r}});var t,i=(t=1e5,function(){var e=String(t);return t+=1,e});function s(e){return Object.prototype.toString.call(e).slice(8,-1)}function o(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n]}function f(o,i){var a;return void 0===i&&(i=0),"function"!=typeof setTimeout||"function"!=typeof clearTimeout?(console.warn("[Warn] There is no timer API in the current context."),o):function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this;clearTimeout(a),a=setTimeout(function(){return o.apply(r,t)},i)}}var n=function(){},a={},r=["Android","iOS"],c=function(e){return e.charAt(0).toUpperCase()+e.slice(1)};function l(e,t){return"object"==typeof process&&process&&process.env&&"test"===process.env.PURPOSE?"function"==typeof __test_logger__&&(n=__test_logger__,!0):(a.debugMode,!0)}function p(e,t){l()&&n("log",e)}function d(e,t){l()&&n("debug",e)}function h(e,t){l()&&n("warn",e)}function v(e,t){l()&&n("error",e)}function u(e){if(v(e),"test"!==process.env.PURPOSE)throw new Error(e)}n=function(e,t){var n="["+c(e)+"][wml-r] "+t;return a.isWeex&&-1<r.indexOf(a.platform)?console.log(n):console.error(n)};var m={miniApp:["setAppShareInfo"],network:["request"],mtop:["request"],storage:["length","setItem","getItem","removeItem"],memoryStorage:["setItem","getItem"],navigator:["push","pop","openMessagePage"],user:["login","logout","info"],modal:["alert","confirm","toast"],navigatorBar:["show","hide","setTitle","setRightItem","setStyle","setDrawer","setActionSheet","hasIndexBadge","scaleIndexBadge","resetIndexBadge","getHeight","openDrawer","isDrawerOpened","closeDrawer","setLeftItem","showMenu","hideMenu"],clipboard:["writeText","readText"],picker:["pick","pickDate","pickTime","chooseCity"],webSocket:["webSocket","send","close","onOpen","onMessage","onClose","onError"],calendar:["addEvent","checkEvent","removeEvent"],connection:["getType","getDownlinkMax","onChange"],screen:["setAlwaysOn","setBrightness"],broadcast:["createChannel","postMessage","onMessage","close"],share:["doShare"],cookie:["read","write","getAllObjects"],audio:["load","play","pause","stop","setVolume","canPlayType"],wopc:["authLogin","checkAuthSession","doAuth"],WopcMtopPlugin:["request"],device:["onShake","vibrate"],keyboard:["hideKeyboard"],contact:["choosePhoneContact"],location:["getLocation"],alipay:["tradePay"],userTrack:["commit","commitut","commitEvent","customAdvance","pageAppear","pageDisaappear","skipPage","updatePageUtparam","updateNextPageUtparam"]},e=function(){};e.prototype.$on=function(e,t){return void 0===t&&(t=o),d('$on "'+e+'"'),!e&&u("invalid event name "+e+" for windmill.$on."),t===o&&u("bind event "+e+" with no callback through windmill.$on."),this.bridge.onReceiveMessage({data:{type:e},origin:this.label,type:"Event"},t)},e.prototype.$once=function(e,t){return void 0===t&&(t=o),d('$once "'+e+'"'),!e&&u("invalid event name "+e+" for windmill.$once."),t===o&&u("bind event "+e+" with no callback through windmill.$once."),this.bridge.onReceiveMessage({data:{type:e,once:!0},origin:this.label,type:"Event"},t)},e.prototype.$off=function(e,t){return d('$off "'+e+'"'),!e&&u("invalid event name "+e+" for windmill.$off."),this.bridge.unbindEventListener("Event."+e,t)},e.prototype.$cycle=function(e,t){return void 0===t&&(t=o),d('$cycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||u("invalid lifecycle name "+e+" for windmill.$cycle."),t===o&&u("hook lifecycle "+e+" with no callback function through windmill.$cycle."),"AppWorker"!==this.label&&/^app:/.test(e)&&u("Shouldn't bind lifecycle hook for app in a page client."),this.bridge.onReceiveMessage({type:"Lifecycle",origin:this.label,data:{type:e}},t)},e.prototype.$decycle=function(e,t){return d('$decycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||u("invalid lifecycle name "+e+" for windmill.$decycle."),this.bridge.unbindEventListener("Lifecycle."+e,t)},e.prototype.$emit=function(e,t,n){return void 0===t&&(t={}),d('$emit("'+e+'")'),!e&&u("invalid event name "+e+" for windmill.$emit."),n&&n!==this.label?this.bridge.postMessage({data:{type:e,data:t},origin:this.label,target:n,type:"Event"}):this.bridge.emitEvent(""+e,t)},e.prototype.$callAsync=function(n,r){var o=this;return void 0===r&&(r={}),d('$callAsync "'+n+'"'),n||u("invalid method name "+n+" for windmill.$callAsync."),new Promise(function(e,t){o.bridge.dispatchMessage({type:"ModuleCall",origin:o.label,target:"AppWorker",data:{method:n,params:r}},e,t,!1)})},e.prototype.$call=function(e,t,n,r){return void 0===t&&(t={}),void 0===n&&(n=o),void 0===r&&(r=o),d('$call "'+e+'", params: '+JSON.stringify(t)),e||u("invalid method name "+e+" for windmill.$call."),this.bridge.dispatchMessage({type:"ModuleCall",origin:this.label,target:"AppWorker",data:{method:e,params:t}},n,r,!0)},e.prototype.$navTo=function(e){return d("$navTo("+JSON.stringify(e)+")"),this.$callAsync("navigator.open",e)},e.prototype.$getAvailableModules=function(){return m};var y="[[EVENT_MAP]]";function g(e,t){var n=e[y];return Array.isArray(n[t])||(n[t]=[]),n[t]}var _,b=function(){d("Create new EventEmitter."),Object.defineProperty(this,y,{configurable:!1,enumerable:!1,writable:!1,value:{}})};function w(t){var n;try{n=JSON.stringify(t)}catch(e){n=t}u("failed to postMessage: "+n)}function k(e,t,n,r,o,i){var a=t+"."+n;return e.WindVane?e.WindVane.call(t,n,r,o,i):u("should have WindVane in global context"+(a?" to call "+a:"")+".")}b.prototype.on=function(e,t){d('EventEmitter: on("'+e+'")');var n=g(this,e);return n.push({listener:t,once:!1,callCount:0}),this},b.prototype.once=function(e,t){d('EventEmitter: once("'+e+'")');var n=g(this,e);return n.push({listener:t,once:!0,callCount:0}),this},b.prototype.off=function(e,t){d('EventEmitter: off("'+e+'"'+(t?", listener":"")+")");var n=this[y];if(t){var r=n[e];if(Array.isArray(r)){var o=r.findIndex(function(e){return e.listener===t});-1!==o&&r.splice(o,1)}}else delete n[e];return this},b.prototype.emit=function(t){for(var e=arguments,n=[],r=arguments.length-1;0<r--;)n[r]=e[r+1];d('EventEmitter: emit("'+t+'", '+JSON.stringify(n)+")");var o=this[y],i=o[t];return Array.isArray(i)&&(o[t]=i.filter(function(e){try{e.listener.apply(null,n),e.callCount+=1}catch(e){return v('Failed to emit "'+t+'" event.'),v(e.toString()),!0}return!e.once})),this};var S=!1,O=function(){this._messages=[]};O.prototype.postMessage=function(e){d("cache message in lazyMsgModule. "+JSON.stringify(e)),this._messages.push(e)},O.prototype.replaceWith=function(e){C=!1,this._messageModule=e,this._flush()},O.prototype._flush=function(){var t=this;this._messages.forEach(function(e){return t._messageModule.postMessage(e)})};var C,x,E=new O;function $(e,t){var n,r=e?(n=e).requireModule("@weex/windmill")||n.requireModule("windmill"):function(){if(!_){var t="undefined"!=typeof window?window:global;_={postMessage:function(e){return k(t,"Windmill","postMessage",e,function(){},w)},onmessage:function(e){if(console.debug("Set onMessage for webview."),!S)return S=!0,k(t,"Windmill","onMessage",{},e,w)}}}return _}();return r?("function"==typeof t&&r.onmessage(t),C&&E.replaceWith(r),r):(u("can't find message module ("+(e?"windmill module":"message module in webview")+")."),C=!0,E)}function A(e){var t=e.match(/([^@]+)(@\S+)/);return t&&t[1]||e}var j=function(e,t){var a=this;void 0===t&&(t={}),d("Create a new RendererBridge."),x=t.isWeex,this._emitter=new b,d("Register onmessage api for "+(x?"Weex windmill module":"webview")+"."),x&&(this._weex=e),this._onMessage=function(e){if(d("Receive message from the worker. (message: "+JSON.stringify(e)+")"),"Object"!==s(e)&&(v("The parameter of onmessage should be a plain object! Not "+s(e)),"string"==typeof e))try{e=JSON.parse(e)}catch(e){return void v("Failed to parse the message string. "+e.toString())}var t=e.type,n=e.data;void 0===n&&(n={});var r=e.origin,o=e.callbackId;switch(t){case"Callback":a._emitter.emit("callback@AppWorker:"+o,n);break;case"Event":var i=A(n.type);a._emitter.emit(t+"."+i,Object.assign({origin:r},n,{type:i}));break;case"Lifecycle":a._emitter.emit(t+"."+n.lifecycle,n.options);break;case"SetData":a._emitter.emit("Event.setdata",n);break;default:u('Unknown message type received from worker: "'+t+'"')}},$(e,this._onMessage)};j.prototype.dispatchMessage=function(t,n,r,e){d("Dispatch message to worker. (message: "+JSON.stringify(t)+")"),t.callbackId=this._genCallbackId(function(e){return e.status&&"SUCCESS"===e.status?n(e):(e.status,v("call API "+t.data.method+" from renderer failed: "+e.status+", "+e.error),r(e))},{keepAlive:e});try{t.keepAlive=!0,this.postMessage(t)}catch(e){r(e)}},j.prototype.postMessage=function(e){try{d("Call postMessage to worker. (message: "+JSON.stringify(e)+")"),$(this._weex,this._onMessage).postMessage(e)}catch(e){u(e.message||e.toString()||"postMessage failed.")}},j.prototype._genCallbackId=function(e,t){var n=t.keepAlive,r=t.callbackId,o=r||i();return this._emitter[n?"on":"once"]("callback@AppWorker:"+o,e),o},j.prototype.onReceiveMessage=function(e,t){var n=e.type,r=e.data;void 0===r&&(r={});var o=r.type;"Event"===n&&(o=A(o),r.type=o);var i=r.once?"once":"on";this._emitter[i](n+"."+o,t)},j.prototype.unbindEventListener=function(e,t){this._emitter.off(A(e),t)},j.prototype.emitEvent=function(e,t){void 0===t&&(t={});var n=A(e);this._emitter.emit("Event."+n,{type:n,data:t})};var I=function(n){function e(e,t){n.call(this),d("Create a new RendererRuntime."),this.bridge=new j(e,t)}return n&&(e.__proto__=n),(e.prototype=Object.create(n&&n.prototype)).constructor=e}(e),M=["$on","$once","$off","$emit","$cycle","$decycle","$call","$callAsync","$navTo","$getAvailableModules"];function T(e,t){var n=!(!e||!e.requireModule);!function(e){if(!e||!e.platform)return console.error("set logger environment failed.");Object.assign(a,e)}({platform:n&&e.config.env.platform,debugMode:n&&e.config.env.debugMode,isWeex:n}),d("Setup Windmill renderer framework."),e&&!e.requireModule&&(t=e,e=void 0),t||(t={}),d("Instantiate renderer in "+(((t=Object.assign({},t)).isWeex=n)?"Weex container":"WindVane container")+".");var o,i,r=new I(e,t);return d("Prepare runtime APIs: "+JSON.stringify(M)),o=r,i={},M.forEach(function(r){"function"==typeof o[r]&&(i[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)})}),i}var P=/^@(windmill|weex)\/([\w_-]+)/;function F(o,e){if(!o.config||"windmill"!==o.config.container)return o;if("function"!=typeof o.requireModule)return o;var i,t,n,a,s=o.requireModule,c=(i=function(){return e},n={},a=t||function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=i()).$call.apply(e,n)},function(o){if(!o)return d("Require a universal module proxy."),{call:a};var e=m[o];if(Array.isArray(e)){if(d('Require the "'+o+'" module.'),n[o])return n[o];var t={};return e.forEach(function(r){t[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.apply(void 0,[o+"."+r].concat(t))}}),n[o]=t}v('Require unknown module "'+o+"\".It may not exist or haven't been registered.")});return o.requireModule=function(e){var t="weex",n=e,r=P.exec(e);switch(r?(t=r[1],n=r[2]):"string"==typeof o.config.container&&(t=o.config.container),t){case"weex":return s.call(o,n);case"windmill":return c(n);default:console.error('[JS Framework] Failed to require scoped module ("'+n+'"), the scope ("'+t+'") is unknown.')}},o}function N(c,l,e){var u={},n=e&&e.normalizieEventName||function(e){return e},r=!(!e||!e.noTriggerWorker);function o(e,t,n,r){void 0===r&&(r=!1);var o,i,a=l.getId();o=a,(i=l.getVm())._clearWindmillPageBinding||(i._clearWindmillPageBinding=function(){var n=u[o];Object.keys(n).forEach(function(t){var e=n[t];e.forEach(function(e){f(t,e.handler)})})}),u[a]||(u[a]={});var s=u[a];if(s[e]||(s[e]=[]),s[e].push({handler:t,wrap:n}),r)return c.$once(e,n);c.$on(e,n)}function f(e,n){var t=l.getId(),r=u[t];if(r){var o=r[e];if(o){var i,a;if(!n)return(u[t]||(u[t]={}))[e]=[],c.$off(e);o.forEach(function(e,t){e.handler===n&&(i=e,a=t)}),i&&i.wrap&&(o.splice(a,1),c.$off(e,i.wrap))}else h("Unbind event '"+e+"' which has no event handler.")}else h("Unbind event from page "+t+" with no event handlers.")}var i={on:function(e,t){o(n(e),t,function(e){t.call(l.getVm(),e.data)})},once:function(e,t){o(n(e),t,function(e){t.call(l.getVm(),e.data)},!0)},off:function(e,t){f(n(e),t)},emit:function(e,t){c.$emit(n(e),t),r&&c.$emit(e+"@"+l.getId(),t,"AppWorker")},call:"default"},a=function(){};return["on","off","emit","once","call"].reduce(function(e,t){var o,n="$"+t,r=i[t];return e[n]="function"==typeof r?r:"default"===r?(o=n,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=c[o];return r.apply(void 0,t)}):a,e},{})}var D="[[WorkerPageReady]]",R="[[RendererPageReady]]",V="[[SendInitialState]]",J="[[ReceivedInitialState]]",L="[[WorkerPageStateChange]]",W="[[RendererPageStateChange]]",q="AppWorker";function U(e){switch(s(e)){case"Object":for(var t in e)U(e[t]);break;case"Array":e.forEach(U)}}return function(e){var a=e.createInstanceContext,t=Object.assign({},e);return t.createInstanceContext=function(e,t,n){var r=t&&t.weex;if(!r||"windmill"!==r.config.container)return a(e,t,n);var l,u,o=Object.assign({},a(e,t,n)),i=T(r);return o.weex=F(r,i),o.requireModule=function(e){return r.requireModule(e)},o.__vue_page__=(l=o,u=i,function(){function e(e,t){var n=this,r=t||l,o=r.Vue,i=r.weex,a=i.config,s=a.clientId,c=a.pageName;if(p("Create Page with id "+s+", pageName "+c+"."),this._id=i.config.clientId||null,this._name=i.config.pageName||null,this._vm=null,this._instanceContext=t||l,this._Vue=o,this._weex=i,this._windmill=u,this._hold=!1,this._options=e,this._state="function"==typeof e.data?e.data():e.data,e.data=function(){return n._state},o.prototype.$page=N(this._windmill,this),d("bind with $page: "+Object.keys(o.prototype.$page)),e._noLazy){p("Init vm instantly in Page constructor with no lazy.");try{this._initVm()}catch(e){v("[windmill-vue-renderer] init vm instantly failed: "+(e&&e.message))}}this._shakeHandsBeforeInit(),this._windmill.$once(V,this._onStateInit.bind(this))}return e.prototype.getVm=function(){return this._vm},e.prototype.getId=function(){return this._id},e.prototype._initVm=function(){var n=this,e=this._vm=new this._Vue(this._options),t=e.$options.data,r=0;e.$watch(function(){for(var e in t)U(t[e]);return r=(r+1)%2},function(e,t){n._hold?n._hold=!1:n._debouncedWatcherCb(e,t)},{sync:!0})},e.prototype._shakeHandsBeforeInit=function(){d("start handshaking with worker."),this._sendPageReady(),this._windmill.$once(D,this._onWorkerReady.bind(this))},e.prototype._sendPageReady=function(){d("Send "+R+" to worker."),this._windmill.$emit(R+"@"+this._id,{},q)},e.prototype._onWorkerReady=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(D+" event received: "+n+".");var e=t.data,r=e.clientId,o=e.pageName;r&&(this._id=r),o&&(this._name=o),this._sendPageReady()},e.prototype._onStateInit=function(t){var n,r=this;try{n=JSON.stringify(t)}catch(e){n=t+""}d(V+" event received: "+n),this._windmill.$off(D),this._windmill.$on(L,this._onDataSync.bind(this));var e=t.data,o=t.origin,i=e.clientId,a=e.pageName,s=i||o;s&&(this._id=s),a&&(this._name=a),this._state=Object.assign(this._state||{},e.initialState||{}),this._windmill.$emit(J+"@"+this._id,{},q);var c=this._vm;if(d("debounce watcher callback for page data watcher binding."),this._debouncedWatcherCb=f(function(e,t){d("emit "+W+" event."),r._windmill.$emit(W+"@"+r._id,r._vm&&r._vm.$options.data,q)},1e3/60),c)this._mergeData(e);else try{p("Init vm after "+V+"."),this._initVm()}catch(e){v("[windmill-vue-renderer] "+(e&&e.message))}},e.prototype._onDataSync=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(L+" event received: "+n);var e=t.data;this._mergeData(e,!0)},e.prototype._mergeData=function(e,t){void 0===t&&(t=!1);var n=this._vm,r=n.$options.data;for(var o in e)t&&(this._hold=!0),n.$set(r,o,e[o])},e}()),Object.freeze(o),o},t}}()});pi.Vue=gi(pi.Vue),function(e){var t=cr.init,n=cr.config;n.frameworks=e;var r=nn.native,o=nn.transformer;for(var i in dr)cr.service.register(i,dr[i]);cr.freezePrototype(),global.frameworkVersion=r,global.transformerVersion=o;var a=t(n),s=function(r){global[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=a[r].apply(a,e);return n instanceof Error&&console.error(n.toString()),n}};for(var c in a)s(c)}(pi),Object.freeze(Object),Object.freeze(Array),tn(di=Object.prototype,"__defineGetter__",hi="Object.prototype"),tn(di,"__defineSetter__",hi),tn(di,"__lookupGetter__",hi),tn(di,"__lookupSetter__",hi),tn(di,"constructor",hi),tn(di,"hasOwnProperty",hi),tn(di,"isPrototypeOf",hi),tn(di,"propertyIsEnumerable",hi),tn(di,"toLocaleString",hi),tn(di,"toString",hi),tn(di,"valueOf",hi),Object.seal(di),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),tn(vi=Error.prototype,"name",mi="Error.prototype"),tn(vi,"message",mi),tn(vi,"toString",mi),tn(vi,"constructor",mi),Object.seal(vi),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype),global.registerMethods(yi)});
//# sourceMappingURL=weex-js-framework.min.js.map
