or \n\t *\n\t * - dynamic:\n\t * \n\t */\n\t\n\t bind: function bind() {\n\t if (!this.el.__vue__) {\n\t // keep-alive cache\n\t this.keepAlive = this.params.keepAlive;\n\t if (this.keepAlive) {\n\t this.cache = {};\n\t }\n\t // check inline-template\n\t if (this.params.inlineTemplate) {\n\t // extract inline template as a DocumentFragment\n\t this.inlineTemplate = extractContent(this.el, true);\n\t }\n\t // component resolution related state\n\t this.pendingComponentCb = this.Component = null;\n\t // transition related state\n\t this.pendingRemovals = 0;\n\t this.pendingRemovalCb = null;\n\t // create a ref anchor\n\t this.anchor = createAnchor('v-component');\n\t replace(this.el, this.anchor);\n\t // remove is attribute.\n\t // this is removed during compilation, but because compilation is\n\t // cached, when the component is used elsewhere this attribute\n\t // will remain at link time.\n\t this.el.removeAttribute('is');\n\t this.el.removeAttribute(':is');\n\t // remove ref, same as above\n\t if (this.descriptor.ref) {\n\t this.el.removeAttribute('v-ref:' + hyphenate(this.descriptor.ref));\n\t }\n\t // if static, build right now.\n\t if (this.literal) {\n\t this.setComponent(this.expression);\n\t }\n\t } else {\n\t (\"production\") !== 'production' && warn('cannot mount component \"' + this.expression + '\" ' + 'on already mounted element: ' + this.el);\n\t }\n\t },\n\t\n\t /**\n\t * Public update, called by the watcher in the dynamic\n\t * literal scenario, e.g. \n\t */\n\t\n\t update: function update(value) {\n\t if (!this.literal) {\n\t this.setComponent(value);\n\t }\n\t },\n\t\n\t /**\n\t * Switch dynamic components. May resolve the component\n\t * asynchronously, and perform transition based on\n\t * specified transition mode. Accepts a few additional\n\t * arguments specifically for vue-router.\n\t *\n\t * The callback is called when the full transition is\n\t * finished.\n\t *\n\t * @param {String} value\n\t * @param {Function} [cb]\n\t */\n\t\n\t setComponent: function setComponent(value, cb) {\n\t this.invalidatePending();\n\t if (!value) {\n\t // just remove current\n\t this.unbuild(true);\n\t this.remove(this.childVM, cb);\n\t this.childVM = null;\n\t } else {\n\t var self = this;\n\t this.resolveComponent(value, function () {\n\t self.mountComponent(cb);\n\t });\n\t }\n\t },\n\t\n\t /**\n\t * Resolve the component constructor to use when creating\n\t * the child vm.\n\t *\n\t * @param {String|Function} value\n\t * @param {Function} cb\n\t */\n\t\n\t resolveComponent: function resolveComponent(value, cb) {\n\t var self = this;\n\t this.pendingComponentCb = cancellable(function (Component) {\n\t self.ComponentName = Component.options.name || (typeof value === 'string' ? value : null);\n\t self.Component = Component;\n\t cb();\n\t });\n\t this.vm._resolveComponent(value, this.pendingComponentCb);\n\t },\n\t\n\t /**\n\t * Create a new instance using the current constructor and\n\t * replace the existing instance. This method doesn't care\n\t * whether the new component and the old one are actually\n\t * the same.\n\t *\n\t * @param {Function} [cb]\n\t */\n\t\n\t mountComponent: function mountComponent(cb) {\n\t // actual mount\n\t this.unbuild(true);\n\t var self = this;\n\t var activateHooks = this.Component.options.activate;\n\t var cached = this.getCached();\n\t var newComponent = this.build();\n\t if (activateHooks && !cached) {\n\t this.waitingFor = newComponent;\n\t callActivateHooks(activateHooks, newComponent, function () {\n\t if (self.waitingFor !== newComponent) {\n\t return;\n\t }\n\t self.waitingFor = null;\n\t self.transition(newComponent, cb);\n\t });\n\t } else {\n\t // update ref for kept-alive component\n\t if (cached) {\n\t newComponent._updateRef();\n\t }\n\t this.transition(newComponent, cb);\n\t }\n\t },\n\t\n\t /**\n\t * When the component changes or unbinds before an async\n\t * constructor is resolved, we need to invalidate its\n\t * pending callback.\n\t */\n\t\n\t invalidatePending: function invalidatePending() {\n\t if (this.pendingComponentCb) {\n\t this.pendingComponentCb.cancel();\n\t this.pendingComponentCb = null;\n\t }\n\t },\n\t\n\t /**\n\t * Instantiate/insert a new child vm.\n\t * If keep alive and has cached instance, insert that\n\t * instance; otherwise build a new one and cache it.\n\t *\n\t * @param {Object} [extraOptions]\n\t * @return {Vue} - the created instance\n\t */\n\t\n\t build: function build(extraOptions) {\n\t var cached = this.getCached();\n\t if (cached) {\n\t return cached;\n\t }\n\t if (this.Component) {\n\t // default options\n\t var options = {\n\t name: this.ComponentName,\n\t el: cloneNode(this.el),\n\t template: this.inlineTemplate,\n\t // make sure to add the child with correct parent\n\t // if this is a transcluded component, its parent\n\t // should be the transclusion host.\n\t parent: this._host || this.vm,\n\t // if no inline-template, then the compiled\n\t // linker can be cached for better performance.\n\t _linkerCachable: !this.inlineTemplate,\n\t _ref: this.descriptor.ref,\n\t _asComponent: true,\n\t _isRouterView: this._isRouterView,\n\t // if this is a transcluded component, context\n\t // will be the common parent vm of this instance\n\t // and its host.\n\t _context: this.vm,\n\t // if this is inside an inline v-for, the scope\n\t // will be the intermediate scope created for this\n\t // repeat fragment. this is used for linking props\n\t // and container directives.\n\t _scope: this._scope,\n\t // pass in the owner fragment of this component.\n\t // this is necessary so that the fragment can keep\n\t // track of its contained components in order to\n\t // call attach/detach hooks for them.\n\t _frag: this._frag\n\t };\n\t // extra options\n\t // in 1.0.0 this is used by vue-router only\n\t /* istanbul ignore if */\n\t if (extraOptions) {\n\t extend(options, extraOptions);\n\t }\n\t var child = new this.Component(options);\n\t if (this.keepAlive) {\n\t this.cache[this.Component.cid] = child;\n\t }\n\t /* istanbul ignore if */\n\t if (false) {\n\t warn('Transitions will not work on a fragment instance. ' + 'Template: ' + child.$options.template, child);\n\t }\n\t return child;\n\t }\n\t },\n\t\n\t /**\n\t * Try to get a cached instance of the current component.\n\t *\n\t * @return {Vue|undefined}\n\t */\n\t\n\t getCached: function getCached() {\n\t return this.keepAlive && this.cache[this.Component.cid];\n\t },\n\t\n\t /**\n\t * Teardown the current child, but defers cleanup so\n\t * that we can separate the destroy and removal steps.\n\t *\n\t * @param {Boolean} defer\n\t */\n\t\n\t unbuild: function unbuild(defer) {\n\t if (this.waitingFor) {\n\t if (!this.keepAlive) {\n\t this.waitingFor.$destroy();\n\t }\n\t this.waitingFor = null;\n\t }\n\t var child = this.childVM;\n\t if (!child || this.keepAlive) {\n\t if (child) {\n\t // remove ref\n\t child._inactive = true;\n\t child._updateRef(true);\n\t }\n\t return;\n\t }\n\t // the sole purpose of `deferCleanup` is so that we can\n\t // \"deactivate\" the vm right now and perform DOM removal\n\t // later.\n\t child.$destroy(false, defer);\n\t },\n\t\n\t /**\n\t * Remove current destroyed child and manually do\n\t * the cleanup after removal.\n\t *\n\t * @param {Function} cb\n\t */\n\t\n\t remove: function remove(child, cb) {\n\t var keepAlive = this.keepAlive;\n\t if (child) {\n\t // we may have a component switch when a previous\n\t // component is still being transitioned out.\n\t // we want to trigger only one lastest insertion cb\n\t // when the existing transition finishes. (#1119)\n\t this.pendingRemovals++;\n\t this.pendingRemovalCb = cb;\n\t var self = this;\n\t child.$remove(function () {\n\t self.pendingRemovals--;\n\t if (!keepAlive) child._cleanup();\n\t if (!self.pendingRemovals && self.pendingRemovalCb) {\n\t self.pendingRemovalCb();\n\t self.pendingRemovalCb = null;\n\t }\n\t });\n\t } else if (cb) {\n\t cb();\n\t }\n\t },\n\t\n\t /**\n\t * Actually swap the components, depending on the\n\t * transition mode. Defaults to simultaneous.\n\t *\n\t * @param {Vue} target\n\t * @param {Function} [cb]\n\t */\n\t\n\t transition: function transition(target, cb) {\n\t var self = this;\n\t var current = this.childVM;\n\t // for devtool inspection\n\t if (current) current._inactive = true;\n\t target._inactive = false;\n\t this.childVM = target;\n\t switch (self.params.transitionMode) {\n\t case 'in-out':\n\t target.$before(self.anchor, function () {\n\t self.remove(current, cb);\n\t });\n\t break;\n\t case 'out-in':\n\t self.remove(current, function () {\n\t target.$before(self.anchor, cb);\n\t });\n\t break;\n\t default:\n\t self.remove(current);\n\t target.$before(self.anchor, cb);\n\t }\n\t },\n\t\n\t /**\n\t * Unbind.\n\t */\n\t\n\t unbind: function unbind() {\n\t this.invalidatePending();\n\t // Do not defer cleanup when unbinding\n\t this.unbuild();\n\t // destroy all keep-alive cached instances\n\t if (this.cache) {\n\t for (var key in this.cache) {\n\t this.cache[key].$destroy();\n\t }\n\t this.cache = null;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Call activate hooks in order (asynchronous)\n\t *\n\t * @param {Array} hooks\n\t * @param {Vue} vm\n\t * @param {Function} cb\n\t */\n\t\n\tfunction callActivateHooks(hooks, vm, cb) {\n\t var total = hooks.length;\n\t var called = 0;\n\t hooks[0].call(vm, next);\n\t function next() {\n\t if (++called >= total) {\n\t cb();\n\t } else {\n\t hooks[called].call(vm, next);\n\t }\n\t }\n\t}\n\t\n\tvar propBindingModes = config._propBindingModes;\n\tvar empty = {};\n\t\n\t// regexes\n\tvar identRE$1 = /^[$_a-zA-Z]+[\\w$]*$/;\n\tvar settablePathRE = /^[A-Za-z_$][\\w$]*(\\.[A-Za-z_$][\\w$]*|\\[[^\\[\\]]+\\])*$/;\n\t\n\t/**\n\t * Compile props on a root element and return\n\t * a props link function.\n\t *\n\t * @param {Element|DocumentFragment} el\n\t * @param {Array} propOptions\n\t * @param {Vue} vm\n\t * @return {Function} propsLinkFn\n\t */\n\t\n\tfunction compileProps(el, propOptions, vm) {\n\t var props = [];\n\t var names = Object.keys(propOptions);\n\t var i = names.length;\n\t var options, name, attr, value, path, parsed, prop;\n\t while (i--) {\n\t name = names[i];\n\t options = propOptions[name] || empty;\n\t\n\t if (false) {\n\t warn('Do not use $data as prop.', vm);\n\t continue;\n\t }\n\t\n\t // props could contain dashes, which will be\n\t // interpreted as minus calculations by the parser\n\t // so we need to camelize the path here\n\t path = camelize(name);\n\t if (!identRE$1.test(path)) {\n\t (\"production\") !== 'production' && warn('Invalid prop key: \"' + name + '\". Prop keys ' + 'must be valid identifiers.', vm);\n\t continue;\n\t }\n\t\n\t prop = {\n\t name: name,\n\t path: path,\n\t options: options,\n\t mode: propBindingModes.ONE_WAY,\n\t raw: null\n\t };\n\t\n\t attr = hyphenate(name);\n\t // first check dynamic version\n\t if ((value = getBindAttr(el, attr)) === null) {\n\t if ((value = getBindAttr(el, attr + '.sync')) !== null) {\n\t prop.mode = propBindingModes.TWO_WAY;\n\t } else if ((value = getBindAttr(el, attr + '.once')) !== null) {\n\t prop.mode = propBindingModes.ONE_TIME;\n\t }\n\t }\n\t if (value !== null) {\n\t // has dynamic binding!\n\t prop.raw = value;\n\t parsed = parseDirective(value);\n\t value = parsed.expression;\n\t prop.filters = parsed.filters;\n\t // check binding type\n\t if (isLiteral(value) && !parsed.filters) {\n\t // for expressions containing literal numbers and\n\t // booleans, there's no need to setup a prop binding,\n\t // so we can optimize them as a one-time set.\n\t prop.optimizedLiteral = true;\n\t } else {\n\t prop.dynamic = true;\n\t // check non-settable path for two-way bindings\n\t if (false) {\n\t prop.mode = propBindingModes.ONE_WAY;\n\t warn('Cannot bind two-way prop with non-settable ' + 'parent path: ' + value, vm);\n\t }\n\t }\n\t prop.parentPath = value;\n\t\n\t // warn required two-way\n\t if (false) {\n\t warn('Prop \"' + name + '\" expects a two-way binding type.', vm);\n\t }\n\t } else if ((value = getAttr(el, attr)) !== null) {\n\t // has literal binding!\n\t prop.raw = value;\n\t } else if (false) {\n\t // check possible camelCase prop usage\n\t var lowerCaseName = path.toLowerCase();\n\t value = /[A-Z\\-]/.test(name) && (el.getAttribute(lowerCaseName) || el.getAttribute(':' + lowerCaseName) || el.getAttribute('v-bind:' + lowerCaseName) || el.getAttribute(':' + lowerCaseName + '.once') || el.getAttribute('v-bind:' + lowerCaseName + '.once') || el.getAttribute(':' + lowerCaseName + '.sync') || el.getAttribute('v-bind:' + lowerCaseName + '.sync'));\n\t if (value) {\n\t warn('Possible usage error for prop `' + lowerCaseName + '` - ' + 'did you mean `' + attr + '`? HTML is case-insensitive, remember to use ' + 'kebab-case for props in templates.', vm);\n\t } else if (options.required) {\n\t // warn missing required\n\t warn('Missing required prop: ' + name, vm);\n\t }\n\t }\n\t // push prop\n\t props.push(prop);\n\t }\n\t return makePropsLinkFn(props);\n\t}\n\t\n\t/**\n\t * Build a function that applies props to a vm.\n\t *\n\t * @param {Array} props\n\t * @return {Function} propsLinkFn\n\t */\n\t\n\tfunction makePropsLinkFn(props) {\n\t return function propsLinkFn(vm, scope) {\n\t // store resolved props info\n\t vm._props = {};\n\t var inlineProps = vm.$options.propsData;\n\t var i = props.length;\n\t var prop, path, options, value, raw;\n\t while (i--) {\n\t prop = props[i];\n\t raw = prop.raw;\n\t path = prop.path;\n\t options = prop.options;\n\t vm._props[path] = prop;\n\t if (inlineProps && hasOwn(inlineProps, path)) {\n\t initProp(vm, prop, inlineProps[path]);\n\t }if (raw === null) {\n\t // initialize absent prop\n\t initProp(vm, prop, undefined);\n\t } else if (prop.dynamic) {\n\t // dynamic prop\n\t if (prop.mode === propBindingModes.ONE_TIME) {\n\t // one time binding\n\t value = (scope || vm._context || vm).$get(prop.parentPath);\n\t initProp(vm, prop, value);\n\t } else {\n\t if (vm._context) {\n\t // dynamic binding\n\t vm._bindDir({\n\t name: 'prop',\n\t def: propDef,\n\t prop: prop\n\t }, null, null, scope); // el, host, scope\n\t } else {\n\t // root instance\n\t initProp(vm, prop, vm.$get(prop.parentPath));\n\t }\n\t }\n\t } else if (prop.optimizedLiteral) {\n\t // optimized literal, cast it and just set once\n\t var stripped = stripQuotes(raw);\n\t value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;\n\t initProp(vm, prop, value);\n\t } else {\n\t // string literal, but we need to cater for\n\t // Boolean props with no value, or with same\n\t // literal value (e.g. disabled=\"disabled\")\n\t // see https://github.com/vuejs/vue-loader/issues/182\n\t value = options.type === Boolean && (raw === '' || raw === hyphenate(prop.name)) ? true : raw;\n\t initProp(vm, prop, value);\n\t }\n\t }\n\t };\n\t}\n\t\n\t/**\n\t * Process a prop with a rawValue, applying necessary coersions,\n\t * default values & assertions and call the given callback with\n\t * processed value.\n\t *\n\t * @param {Vue} vm\n\t * @param {Object} prop\n\t * @param {*} rawValue\n\t * @param {Function} fn\n\t */\n\t\n\tfunction processPropValue(vm, prop, rawValue, fn) {\n\t var isSimple = prop.dynamic && isSimplePath(prop.parentPath);\n\t var value = rawValue;\n\t if (value === undefined) {\n\t value = getPropDefaultValue(vm, prop);\n\t }\n\t value = coerceProp(prop, value);\n\t var coerced = value !== rawValue;\n\t if (!assertProp(prop, value, vm)) {\n\t value = undefined;\n\t }\n\t if (isSimple && !coerced) {\n\t withoutConversion(function () {\n\t fn(value);\n\t });\n\t } else {\n\t fn(value);\n\t }\n\t}\n\t\n\t/**\n\t * Set a prop's initial value on a vm and its data object.\n\t *\n\t * @param {Vue} vm\n\t * @param {Object} prop\n\t * @param {*} value\n\t */\n\t\n\tfunction initProp(vm, prop, value) {\n\t processPropValue(vm, prop, value, function (value) {\n\t defineReactive(vm, prop.path, value);\n\t });\n\t}\n\t\n\t/**\n\t * Update a prop's value on a vm.\n\t *\n\t * @param {Vue} vm\n\t * @param {Object} prop\n\t * @param {*} value\n\t */\n\t\n\tfunction updateProp(vm, prop, value) {\n\t processPropValue(vm, prop, value, function (value) {\n\t vm[prop.path] = value;\n\t });\n\t}\n\t\n\t/**\n\t * Get the default value of a prop.\n\t *\n\t * @param {Vue} vm\n\t * @param {Object} prop\n\t * @return {*}\n\t */\n\t\n\tfunction getPropDefaultValue(vm, prop) {\n\t // no default, return undefined\n\t var options = prop.options;\n\t if (!hasOwn(options, 'default')) {\n\t // absent boolean value defaults to false\n\t return options.type === Boolean ? false : undefined;\n\t }\n\t var def = options['default'];\n\t // warn against non-factory defaults for Object & Array\n\t if (isObject(def)) {\n\t (\"production\") !== 'production' && warn('Invalid default value for prop \"' + prop.name + '\": ' + 'Props with type Object/Array must use a factory function ' + 'to return the default value.', vm);\n\t }\n\t // call factory function for non-Function types\n\t return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;\n\t}\n\t\n\t/**\n\t * Assert whether a prop is valid.\n\t *\n\t * @param {Object} prop\n\t * @param {*} value\n\t * @param {Vue} vm\n\t */\n\t\n\tfunction assertProp(prop, value, vm) {\n\t if (!prop.options.required && ( // non-required\n\t prop.raw === null || // abscent\n\t value == null) // null or undefined\n\t ) {\n\t return true;\n\t }\n\t var options = prop.options;\n\t var type = options.type;\n\t var valid = !type;\n\t var expectedTypes = [];\n\t if (type) {\n\t if (!isArray(type)) {\n\t type = [type];\n\t }\n\t for (var i = 0; i < type.length && !valid; i++) {\n\t var assertedType = assertType(value, type[i]);\n\t expectedTypes.push(assertedType.expectedType);\n\t valid = assertedType.valid;\n\t }\n\t }\n\t if (!valid) {\n\t if (false) {\n\t warn('Invalid prop: type check failed for prop \"' + prop.name + '\".' + ' Expected ' + expectedTypes.map(formatType).join(', ') + ', got ' + formatValue(value) + '.', vm);\n\t }\n\t return false;\n\t }\n\t var validator = options.validator;\n\t if (validator) {\n\t if (!validator(value)) {\n\t (\"production\") !== 'production' && warn('Invalid prop: custom validator check failed for prop \"' + prop.name + '\".', vm);\n\t return false;\n\t }\n\t }\n\t return true;\n\t}\n\t\n\t/**\n\t * Force parsing value with coerce option.\n\t *\n\t * @param {*} value\n\t * @param {Object} options\n\t * @return {*}\n\t */\n\t\n\tfunction coerceProp(prop, value) {\n\t var coerce = prop.options.coerce;\n\t if (!coerce) {\n\t return value;\n\t }\n\t // coerce is a function\n\t return coerce(value);\n\t}\n\t\n\t/**\n\t * Assert the type of a value\n\t *\n\t * @param {*} value\n\t * @param {Function} type\n\t * @return {Object}\n\t */\n\t\n\tfunction assertType(value, type) {\n\t var valid;\n\t var expectedType;\n\t if (type === String) {\n\t expectedType = 'string';\n\t valid = typeof value === expectedType;\n\t } else if (type === Number) {\n\t expectedType = 'number';\n\t valid = typeof value === expectedType;\n\t } else if (type === Boolean) {\n\t expectedType = 'boolean';\n\t valid = typeof value === expectedType;\n\t } else if (type === Function) {\n\t expectedType = 'function';\n\t valid = typeof value === expectedType;\n\t } else if (type === Object) {\n\t expectedType = 'object';\n\t valid = isPlainObject(value);\n\t } else if (type === Array) {\n\t expectedType = 'array';\n\t valid = isArray(value);\n\t } else {\n\t valid = value instanceof type;\n\t }\n\t return {\n\t valid: valid,\n\t expectedType: expectedType\n\t };\n\t}\n\t\n\t/**\n\t * Format type for output\n\t *\n\t * @param {String} type\n\t * @return {String}\n\t */\n\t\n\tfunction formatType(type) {\n\t return type ? type.charAt(0).toUpperCase() + type.slice(1) : 'custom type';\n\t}\n\t\n\t/**\n\t * Format value\n\t *\n\t * @param {*} value\n\t * @return {String}\n\t */\n\t\n\tfunction formatValue(val) {\n\t return Object.prototype.toString.call(val).slice(8, -1);\n\t}\n\t\n\tvar bindingModes = config._propBindingModes;\n\t\n\tvar propDef = {\n\t\n\t bind: function bind() {\n\t var child = this.vm;\n\t var parent = child._context;\n\t // passed in from compiler directly\n\t var prop = this.descriptor.prop;\n\t var childKey = prop.path;\n\t var parentKey = prop.parentPath;\n\t var twoWay = prop.mode === bindingModes.TWO_WAY;\n\t\n\t var parentWatcher = this.parentWatcher = new Watcher(parent, parentKey, function (val) {\n\t updateProp(child, prop, val);\n\t }, {\n\t twoWay: twoWay,\n\t filters: prop.filters,\n\t // important: props need to be observed on the\n\t // v-for scope if present\n\t scope: this._scope\n\t });\n\t\n\t // set the child initial value.\n\t initProp(child, prop, parentWatcher.value);\n\t\n\t // setup two-way binding\n\t if (twoWay) {\n\t // important: defer the child watcher creation until\n\t // the created hook (after data observation)\n\t var self = this;\n\t child.$once('pre-hook:created', function () {\n\t self.childWatcher = new Watcher(child, childKey, function (val) {\n\t parentWatcher.set(val);\n\t }, {\n\t // ensure sync upward before parent sync down.\n\t // this is necessary in cases e.g. the child\n\t // mutates a prop array, then replaces it. (#1683)\n\t sync: true\n\t });\n\t });\n\t }\n\t },\n\t\n\t unbind: function unbind() {\n\t this.parentWatcher.teardown();\n\t if (this.childWatcher) {\n\t this.childWatcher.teardown();\n\t }\n\t }\n\t};\n\t\n\tvar queue$1 = [];\n\tvar queued = false;\n\t\n\t/**\n\t * Push a job into the queue.\n\t *\n\t * @param {Function} job\n\t */\n\t\n\tfunction pushJob(job) {\n\t queue$1.push(job);\n\t if (!queued) {\n\t queued = true;\n\t nextTick(flush);\n\t }\n\t}\n\t\n\t/**\n\t * Flush the queue, and do one forced reflow before\n\t * triggering transitions.\n\t */\n\t\n\tfunction flush() {\n\t // Force layout\n\t var f = document.documentElement.offsetHeight;\n\t for (var i = 0; i < queue$1.length; i++) {\n\t queue$1[i]();\n\t }\n\t queue$1 = [];\n\t queued = false;\n\t // dummy return, so js linters don't complain about\n\t // unused variable f\n\t return f;\n\t}\n\t\n\tvar TYPE_TRANSITION = 'transition';\n\tvar TYPE_ANIMATION = 'animation';\n\tvar transDurationProp = transitionProp + 'Duration';\n\tvar animDurationProp = animationProp + 'Duration';\n\t\n\t/**\n\t * If a just-entered element is applied the\n\t * leave class while its enter transition hasn't started yet,\n\t * and the transitioned property has the same value for both\n\t * enter/leave, then the leave transition will be skipped and\n\t * the transitionend event never fires. This function ensures\n\t * its callback to be called after a transition has started\n\t * by waiting for double raf.\n\t *\n\t * It falls back to setTimeout on devices that support CSS\n\t * transitions but not raf (e.g. Android 4.2 browser) - since\n\t * these environments are usually slow, we are giving it a\n\t * relatively large timeout.\n\t */\n\t\n\tvar raf = inBrowser && window.requestAnimationFrame;\n\tvar waitForTransitionStart = raf\n\t/* istanbul ignore next */\n\t? function (fn) {\n\t raf(function () {\n\t raf(fn);\n\t });\n\t} : function (fn) {\n\t setTimeout(fn, 50);\n\t};\n\t\n\t/**\n\t * A Transition object that encapsulates the state and logic\n\t * of the transition.\n\t *\n\t * @param {Element} el\n\t * @param {String} id\n\t * @param {Object} hooks\n\t * @param {Vue} vm\n\t */\n\tfunction Transition(el, id, hooks, vm) {\n\t this.id = id;\n\t this.el = el;\n\t this.enterClass = hooks && hooks.enterClass || id + '-enter';\n\t this.leaveClass = hooks && hooks.leaveClass || id + '-leave';\n\t this.hooks = hooks;\n\t this.vm = vm;\n\t // async state\n\t this.pendingCssEvent = this.pendingCssCb = this.cancel = this.pendingJsCb = this.op = this.cb = null;\n\t this.justEntered = false;\n\t this.entered = this.left = false;\n\t this.typeCache = {};\n\t // check css transition type\n\t this.type = hooks && hooks.type;\n\t /* istanbul ignore if */\n\t if (false) {\n\t if (this.type && this.type !== TYPE_TRANSITION && this.type !== TYPE_ANIMATION) {\n\t warn('invalid CSS transition type for transition=\"' + this.id + '\": ' + this.type, vm);\n\t }\n\t }\n\t // bind\n\t var self = this;['enterNextTick', 'enterDone', 'leaveNextTick', 'leaveDone'].forEach(function (m) {\n\t self[m] = bind(self[m], self);\n\t });\n\t}\n\t\n\tvar p$1 = Transition.prototype;\n\t\n\t/**\n\t * Start an entering transition.\n\t *\n\t * 1. enter transition triggered\n\t * 2. call beforeEnter hook\n\t * 3. add enter class\n\t * 4. insert/show element\n\t * 5. call enter hook (with possible explicit js callback)\n\t * 6. reflow\n\t * 7. based on transition type:\n\t * - transition:\n\t * remove class now, wait for transitionend,\n\t * then done if there's no explicit js callback.\n\t * - animation:\n\t * wait for animationend, remove class,\n\t * then done if there's no explicit js callback.\n\t * - no css transition:\n\t * done now if there's no explicit js callback.\n\t * 8. wait for either done or js callback, then call\n\t * afterEnter hook.\n\t *\n\t * @param {Function} op - insert/show the element\n\t * @param {Function} [cb]\n\t */\n\t\n\tp$1.enter = function (op, cb) {\n\t this.cancelPending();\n\t this.callHook('beforeEnter');\n\t this.cb = cb;\n\t addClass(this.el, this.enterClass);\n\t op();\n\t this.entered = false;\n\t this.callHookWithCb('enter');\n\t if (this.entered) {\n\t return; // user called done synchronously.\n\t }\n\t this.cancel = this.hooks && this.hooks.enterCancelled;\n\t pushJob(this.enterNextTick);\n\t};\n\t\n\t/**\n\t * The \"nextTick\" phase of an entering transition, which is\n\t * to be pushed into a queue and executed after a reflow so\n\t * that removing the class can trigger a CSS transition.\n\t */\n\t\n\tp$1.enterNextTick = function () {\n\t var _this = this;\n\t\n\t // prevent transition skipping\n\t this.justEntered = true;\n\t waitForTransitionStart(function () {\n\t _this.justEntered = false;\n\t });\n\t var enterDone = this.enterDone;\n\t var type = this.getCssTransitionType(this.enterClass);\n\t if (!this.pendingJsCb) {\n\t if (type === TYPE_TRANSITION) {\n\t // trigger transition by removing enter class now\n\t removeClass(this.el, this.enterClass);\n\t this.setupCssCb(transitionEndEvent, enterDone);\n\t } else if (type === TYPE_ANIMATION) {\n\t this.setupCssCb(animationEndEvent, enterDone);\n\t } else {\n\t enterDone();\n\t }\n\t } else if (type === TYPE_TRANSITION) {\n\t removeClass(this.el, this.enterClass);\n\t }\n\t};\n\t\n\t/**\n\t * The \"cleanup\" phase of an entering transition.\n\t */\n\t\n\tp$1.enterDone = function () {\n\t this.entered = true;\n\t this.cancel = this.pendingJsCb = null;\n\t removeClass(this.el, this.enterClass);\n\t this.callHook('afterEnter');\n\t if (this.cb) this.cb();\n\t};\n\t\n\t/**\n\t * Start a leaving transition.\n\t *\n\t * 1. leave transition triggered.\n\t * 2. call beforeLeave hook\n\t * 3. add leave class (trigger css transition)\n\t * 4. call leave hook (with possible explicit js callback)\n\t * 5. reflow if no explicit js callback is provided\n\t * 6. based on transition type:\n\t * - transition or animation:\n\t * wait for end event, remove class, then done if\n\t * there's no explicit js callback.\n\t * - no css transition:\n\t * done if there's no explicit js callback.\n\t * 7. wait for either done or js callback, then call\n\t * afterLeave hook.\n\t *\n\t * @param {Function} op - remove/hide the element\n\t * @param {Function} [cb]\n\t */\n\t\n\tp$1.leave = function (op, cb) {\n\t this.cancelPending();\n\t this.callHook('beforeLeave');\n\t this.op = op;\n\t this.cb = cb;\n\t addClass(this.el, this.leaveClass);\n\t this.left = false;\n\t this.callHookWithCb('leave');\n\t if (this.left) {\n\t return; // user called done synchronously.\n\t }\n\t this.cancel = this.hooks && this.hooks.leaveCancelled;\n\t // only need to handle leaveDone if\n\t // 1. the transition is already done (synchronously called\n\t // by the user, which causes this.op set to null)\n\t // 2. there's no explicit js callback\n\t if (this.op && !this.pendingJsCb) {\n\t // if a CSS transition leaves immediately after enter,\n\t // the transitionend event never fires. therefore we\n\t // detect such cases and end the leave immediately.\n\t if (this.justEntered) {\n\t this.leaveDone();\n\t } else {\n\t pushJob(this.leaveNextTick);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * The \"nextTick\" phase of a leaving transition.\n\t */\n\t\n\tp$1.leaveNextTick = function () {\n\t var type = this.getCssTransitionType(this.leaveClass);\n\t if (type) {\n\t var event = type === TYPE_TRANSITION ? transitionEndEvent : animationEndEvent;\n\t this.setupCssCb(event, this.leaveDone);\n\t } else {\n\t this.leaveDone();\n\t }\n\t};\n\t\n\t/**\n\t * The \"cleanup\" phase of a leaving transition.\n\t */\n\t\n\tp$1.leaveDone = function () {\n\t this.left = true;\n\t this.cancel = this.pendingJsCb = null;\n\t this.op();\n\t removeClass(this.el, this.leaveClass);\n\t this.callHook('afterLeave');\n\t if (this.cb) this.cb();\n\t this.op = null;\n\t};\n\t\n\t/**\n\t * Cancel any pending callbacks from a previously running\n\t * but not finished transition.\n\t */\n\t\n\tp$1.cancelPending = function () {\n\t this.op = this.cb = null;\n\t var hasPending = false;\n\t if (this.pendingCssCb) {\n\t hasPending = true;\n\t off(this.el, this.pendingCssEvent, this.pendingCssCb);\n\t this.pendingCssEvent = this.pendingCssCb = null;\n\t }\n\t if (this.pendingJsCb) {\n\t hasPending = true;\n\t this.pendingJsCb.cancel();\n\t this.pendingJsCb = null;\n\t }\n\t if (hasPending) {\n\t removeClass(this.el, this.enterClass);\n\t removeClass(this.el, this.leaveClass);\n\t }\n\t if (this.cancel) {\n\t this.cancel.call(this.vm, this.el);\n\t this.cancel = null;\n\t }\n\t};\n\t\n\t/**\n\t * Call a user-provided synchronous hook function.\n\t *\n\t * @param {String} type\n\t */\n\t\n\tp$1.callHook = function (type) {\n\t if (this.hooks && this.hooks[type]) {\n\t this.hooks[type].call(this.vm, this.el);\n\t }\n\t};\n\t\n\t/**\n\t * Call a user-provided, potentially-async hook function.\n\t * We check for the length of arguments to see if the hook\n\t * expects a `done` callback. If true, the transition's end\n\t * will be determined by when the user calls that callback;\n\t * otherwise, the end is determined by the CSS transition or\n\t * animation.\n\t *\n\t * @param {String} type\n\t */\n\t\n\tp$1.callHookWithCb = function (type) {\n\t var hook = this.hooks && this.hooks[type];\n\t if (hook) {\n\t if (hook.length > 1) {\n\t this.pendingJsCb = cancellable(this[type + 'Done']);\n\t }\n\t hook.call(this.vm, this.el, this.pendingJsCb);\n\t }\n\t};\n\t\n\t/**\n\t * Get an element's transition type based on the\n\t * calculated styles.\n\t *\n\t * @param {String} className\n\t * @return {Number}\n\t */\n\t\n\tp$1.getCssTransitionType = function (className) {\n\t /* istanbul ignore if */\n\t if (!transitionEndEvent ||\n\t // skip CSS transitions if page is not visible -\n\t // this solves the issue of transitionend events not\n\t // firing until the page is visible again.\n\t // pageVisibility API is supported in IE10+, same as\n\t // CSS transitions.\n\t document.hidden ||\n\t // explicit js-only transition\n\t this.hooks && this.hooks.css === false ||\n\t // element is hidden\n\t isHidden(this.el)) {\n\t return;\n\t }\n\t var type = this.type || this.typeCache[className];\n\t if (type) return type;\n\t var inlineStyles = this.el.style;\n\t var computedStyles = window.getComputedStyle(this.el);\n\t var transDuration = inlineStyles[transDurationProp] || computedStyles[transDurationProp];\n\t if (transDuration && transDuration !== '0s') {\n\t type = TYPE_TRANSITION;\n\t } else {\n\t var animDuration = inlineStyles[animDurationProp] || computedStyles[animDurationProp];\n\t if (animDuration && animDuration !== '0s') {\n\t type = TYPE_ANIMATION;\n\t }\n\t }\n\t if (type) {\n\t this.typeCache[className] = type;\n\t }\n\t return type;\n\t};\n\t\n\t/**\n\t * Setup a CSS transitionend/animationend callback.\n\t *\n\t * @param {String} event\n\t * @param {Function} cb\n\t */\n\t\n\tp$1.setupCssCb = function (event, cb) {\n\t this.pendingCssEvent = event;\n\t var self = this;\n\t var el = this.el;\n\t var onEnd = this.pendingCssCb = function (e) {\n\t if (e.target === el) {\n\t off(el, event, onEnd);\n\t self.pendingCssEvent = self.pendingCssCb = null;\n\t if (!self.pendingJsCb && cb) {\n\t cb();\n\t }\n\t }\n\t };\n\t on(el, event, onEnd);\n\t};\n\t\n\t/**\n\t * Check if an element is hidden - in that case we can just\n\t * skip the transition alltogether.\n\t *\n\t * @param {Element} el\n\t * @return {Boolean}\n\t */\n\t\n\tfunction isHidden(el) {\n\t if (/svg$/.test(el.namespaceURI)) {\n\t // SVG elements do not have offset(Width|Height)\n\t // so we need to check the client rect\n\t var rect = el.getBoundingClientRect();\n\t return !(rect.width || rect.height);\n\t } else {\n\t return !(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n\t }\n\t}\n\t\n\tvar transition$1 = {\n\t\n\t priority: TRANSITION,\n\t\n\t update: function update(id, oldId) {\n\t var el = this.el;\n\t // resolve on owner vm\n\t var hooks = resolveAsset(this.vm.$options, 'transitions', id);\n\t id = id || 'v';\n\t el.__v_trans = new Transition(el, id, hooks, this.vm);\n\t if (oldId) {\n\t removeClass(el, oldId + '-transition');\n\t }\n\t addClass(el, id + '-transition');\n\t }\n\t};\n\t\n\tvar internalDirectives = {\n\t style: style,\n\t 'class': vClass,\n\t component: component,\n\t prop: propDef,\n\t transition: transition$1\n\t};\n\t\n\t// special binding prefixes\n\tvar bindRE = /^v-bind:|^:/;\n\tvar onRE = /^v-on:|^@/;\n\tvar dirAttrRE = /^v-([^:]+)(?:$|:(.*)$)/;\n\tvar modifierRE = /\\.[^\\.]+/g;\n\tvar transitionRE = /^(v-bind:|:)?transition$/;\n\t\n\t// default directive priority\n\tvar DEFAULT_PRIORITY = 1000;\n\tvar DEFAULT_TERMINAL_PRIORITY = 2000;\n\t\n\t/**\n\t * Compile a template and return a reusable composite link\n\t * function, which recursively contains more link functions\n\t * inside. This top level compile function would normally\n\t * be called on instance root nodes, but can also be used\n\t * for partial compilation if the partial argument is true.\n\t *\n\t * The returned composite link function, when called, will\n\t * return an unlink function that tearsdown all directives\n\t * created during the linking phase.\n\t *\n\t * @param {Element|DocumentFragment} el\n\t * @param {Object} options\n\t * @param {Boolean} partial\n\t * @return {Function}\n\t */\n\t\n\tfunction compile(el, options, partial) {\n\t // link function for the node itself.\n\t var nodeLinkFn = partial || !options._asComponent ? compileNode(el, options) : null;\n\t // link function for the childNodes\n\t var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && !isScript(el) && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;\n\t\n\t /**\n\t * A composite linker function to be called on a already\n\t * compiled piece of DOM, which instantiates all directive\n\t * instances.\n\t *\n\t * @param {Vue} vm\n\t * @param {Element|DocumentFragment} el\n\t * @param {Vue} [host] - host vm of transcluded content\n\t * @param {Object} [scope] - v-for scope\n\t * @param {Fragment} [frag] - link context fragment\n\t * @return {Function|undefined}\n\t */\n\t\n\t return function compositeLinkFn(vm, el, host, scope, frag) {\n\t // cache childNodes before linking parent, fix #657\n\t var childNodes = toArray(el.childNodes);\n\t // link\n\t var dirs = linkAndCapture(function compositeLinkCapturer() {\n\t if (nodeLinkFn) nodeLinkFn(vm, el, host, scope, frag);\n\t if (childLinkFn) childLinkFn(vm, childNodes, host, scope, frag);\n\t }, vm);\n\t return makeUnlinkFn(vm, dirs);\n\t };\n\t}\n\t\n\t/**\n\t * Apply a linker to a vm/element pair and capture the\n\t * directives created during the process.\n\t *\n\t * @param {Function} linker\n\t * @param {Vue} vm\n\t */\n\t\n\tfunction linkAndCapture(linker, vm) {\n\t /* istanbul ignore if */\n\t if (true) {\n\t // reset directives before every capture in production\n\t // mode, so that when unlinking we don't need to splice\n\t // them out (which turns out to be a perf hit).\n\t // they are kept in development mode because they are\n\t // useful for Vue's own tests.\n\t vm._directives = [];\n\t }\n\t var originalDirCount = vm._directives.length;\n\t linker();\n\t var dirs = vm._directives.slice(originalDirCount);\n\t dirs.sort(directiveComparator);\n\t for (var i = 0, l = dirs.length; i < l; i++) {\n\t dirs[i]._bind();\n\t }\n\t return dirs;\n\t}\n\t\n\t/**\n\t * Directive priority sort comparator\n\t *\n\t * @param {Object} a\n\t * @param {Object} b\n\t */\n\t\n\tfunction directiveComparator(a, b) {\n\t a = a.descriptor.def.priority || DEFAULT_PRIORITY;\n\t b = b.descriptor.def.priority || DEFAULT_PRIORITY;\n\t return a > b ? -1 : a === b ? 0 : 1;\n\t}\n\t\n\t/**\n\t * Linker functions return an unlink function that\n\t * tearsdown all directives instances generated during\n\t * the process.\n\t *\n\t * We create unlink functions with only the necessary\n\t * information to avoid retaining additional closures.\n\t *\n\t * @param {Vue} vm\n\t * @param {Array} dirs\n\t * @param {Vue} [context]\n\t * @param {Array} [contextDirs]\n\t * @return {Function}\n\t */\n\t\n\tfunction makeUnlinkFn(vm, dirs, context, contextDirs) {\n\t function unlink(destroying) {\n\t teardownDirs(vm, dirs, destroying);\n\t if (context && contextDirs) {\n\t teardownDirs(context, contextDirs);\n\t }\n\t }\n\t // expose linked directives\n\t unlink.dirs = dirs;\n\t return unlink;\n\t}\n\t\n\t/**\n\t * Teardown partial linked directives.\n\t *\n\t * @param {Vue} vm\n\t * @param {Array} dirs\n\t * @param {Boolean} destroying\n\t */\n\t\n\tfunction teardownDirs(vm, dirs, destroying) {\n\t var i = dirs.length;\n\t while (i--) {\n\t dirs[i]._teardown();\n\t if (false) {\n\t vm._directives.$remove(dirs[i]);\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Compile link props on an instance.\n\t *\n\t * @param {Vue} vm\n\t * @param {Element} el\n\t * @param {Object} props\n\t * @param {Object} [scope]\n\t * @return {Function}\n\t */\n\t\n\tfunction compileAndLinkProps(vm, el, props, scope) {\n\t var propsLinkFn = compileProps(el, props, vm);\n\t var propDirs = linkAndCapture(function () {\n\t propsLinkFn(vm, scope);\n\t }, vm);\n\t return makeUnlinkFn(vm, propDirs);\n\t}\n\t\n\t/**\n\t * Compile the root element of an instance.\n\t *\n\t * 1. attrs on context container (context scope)\n\t * 2. attrs on the component template root node, if\n\t * replace:true (child scope)\n\t *\n\t * If this is a fragment instance, we only need to compile 1.\n\t *\n\t * @param {Element} el\n\t * @param {Object} options\n\t * @param {Object} contextOptions\n\t * @return {Function}\n\t */\n\t\n\tfunction compileRoot(el, options, contextOptions) {\n\t var containerAttrs = options._containerAttrs;\n\t var replacerAttrs = options._replacerAttrs;\n\t var contextLinkFn, replacerLinkFn;\n\t\n\t // only need to compile other attributes for\n\t // non-fragment instances\n\t if (el.nodeType !== 11) {\n\t // for components, container and replacer need to be\n\t // compiled separately and linked in different scopes.\n\t if (options._asComponent) {\n\t // 2. container attributes\n\t if (containerAttrs && contextOptions) {\n\t contextLinkFn = compileDirectives(containerAttrs, contextOptions);\n\t }\n\t if (replacerAttrs) {\n\t // 3. replacer attributes\n\t replacerLinkFn = compileDirectives(replacerAttrs, options);\n\t }\n\t } else {\n\t // non-component, just compile as a normal element.\n\t replacerLinkFn = compileDirectives(el.attributes, options);\n\t }\n\t } else if (false) {\n\t // warn container directives for fragment instances\n\t var names = containerAttrs.filter(function (attr) {\n\t // allow vue-loader/vueify scoped css attributes\n\t return attr.name.indexOf('_v-') < 0 &&\n\t // allow event listeners\n\t !onRE.test(attr.name) &&\n\t // allow slots\n\t attr.name !== 'slot';\n\t }).map(function (attr) {\n\t return '\"' + attr.name + '\"';\n\t });\n\t if (names.length) {\n\t var plural = names.length > 1;\n\t warn('Attribute' + (plural ? 's ' : ' ') + names.join(', ') + (plural ? ' are' : ' is') + ' ignored on component ' + '<' + options.el.tagName.toLowerCase() + '> because ' + 'the component is a fragment instance: ' + 'http://vuejs.org/guide/components.html#Fragment-Instance');\n\t }\n\t }\n\t\n\t options._containerAttrs = options._replacerAttrs = null;\n\t return function rootLinkFn(vm, el, scope) {\n\t // link context scope dirs\n\t var context = vm._context;\n\t var contextDirs;\n\t if (context && contextLinkFn) {\n\t contextDirs = linkAndCapture(function () {\n\t contextLinkFn(context, el, null, scope);\n\t }, context);\n\t }\n\t\n\t // link self\n\t var selfDirs = linkAndCapture(function () {\n\t if (replacerLinkFn) replacerLinkFn(vm, el);\n\t }, vm);\n\t\n\t // return the unlink function that tearsdown context\n\t // container directives.\n\t return makeUnlinkFn(vm, selfDirs, context, contextDirs);\n\t };\n\t}\n\t\n\t/**\n\t * Compile a node and return a nodeLinkFn based on the\n\t * node type.\n\t *\n\t * @param {Node} node\n\t * @param {Object} options\n\t * @return {Function|null}\n\t */\n\t\n\tfunction compileNode(node, options) {\n\t var type = node.nodeType;\n\t if (type === 1 && !isScript(node)) {\n\t return compileElement(node, options);\n\t } else if (type === 3 && node.data.trim()) {\n\t return compileTextNode(node, options);\n\t } else {\n\t return null;\n\t }\n\t}\n\t\n\t/**\n\t * Compile an element and return a nodeLinkFn.\n\t *\n\t * @param {Element} el\n\t * @param {Object} options\n\t * @return {Function|null}\n\t */\n\t\n\tfunction compileElement(el, options) {\n\t // preprocess textareas.\n\t // textarea treats its text content as the initial value.\n\t // just bind it as an attr directive for value.\n\t if (el.tagName === 'TEXTAREA') {\n\t var tokens = parseText(el.value);\n\t if (tokens) {\n\t el.setAttribute(':value', tokensToExp(tokens));\n\t el.value = '';\n\t }\n\t }\n\t var linkFn;\n\t var hasAttrs = el.hasAttributes();\n\t var attrs = hasAttrs && toArray(el.attributes);\n\t // check terminal directives (for & if)\n\t if (hasAttrs) {\n\t linkFn = checkTerminalDirectives(el, attrs, options);\n\t }\n\t // check element directives\n\t if (!linkFn) {\n\t linkFn = checkElementDirectives(el, options);\n\t }\n\t // check component\n\t if (!linkFn) {\n\t linkFn = checkComponent(el, options);\n\t }\n\t // normal directives\n\t if (!linkFn && hasAttrs) {\n\t linkFn = compileDirectives(attrs, options);\n\t }\n\t return linkFn;\n\t}\n\t\n\t/**\n\t * Compile a textNode and return a nodeLinkFn.\n\t *\n\t * @param {TextNode} node\n\t * @param {Object} options\n\t * @return {Function|null} textNodeLinkFn\n\t */\n\t\n\tfunction compileTextNode(node, options) {\n\t // skip marked text nodes\n\t if (node._skip) {\n\t return removeText;\n\t }\n\t\n\t var tokens = parseText(node.wholeText);\n\t if (!tokens) {\n\t return null;\n\t }\n\t\n\t // mark adjacent text nodes as skipped,\n\t // because we are using node.wholeText to compile\n\t // all adjacent text nodes together. This fixes\n\t // issues in IE where sometimes it splits up a single\n\t // text node into multiple ones.\n\t var next = node.nextSibling;\n\t while (next && next.nodeType === 3) {\n\t next._skip = true;\n\t next = next.nextSibling;\n\t }\n\t\n\t var frag = document.createDocumentFragment();\n\t var el, token;\n\t for (var i = 0, l = tokens.length; i < l; i++) {\n\t token = tokens[i];\n\t el = token.tag ? processTextToken(token, options) : document.createTextNode(token.value);\n\t frag.appendChild(el);\n\t }\n\t return makeTextNodeLinkFn(tokens, frag, options);\n\t}\n\t\n\t/**\n\t * Linker for an skipped text node.\n\t *\n\t * @param {Vue} vm\n\t * @param {Text} node\n\t */\n\t\n\tfunction removeText(vm, node) {\n\t remove(node);\n\t}\n\t\n\t/**\n\t * Process a single text token.\n\t *\n\t * @param {Object} token\n\t * @param {Object} options\n\t * @return {Node}\n\t */\n\t\n\tfunction processTextToken(token, options) {\n\t var el;\n\t if (token.oneTime) {\n\t el = document.createTextNode(token.value);\n\t } else {\n\t if (token.html) {\n\t el = document.createComment('v-html');\n\t setTokenType('html');\n\t } else {\n\t // IE will clean up empty textNodes during\n\t // frag.cloneNode(true), so we have to give it\n\t // something here...\n\t el = document.createTextNode(' ');\n\t setTokenType('text');\n\t }\n\t }\n\t function setTokenType(type) {\n\t if (token.descriptor) return;\n\t var parsed = parseDirective(token.value);\n\t token.descriptor = {\n\t name: type,\n\t def: directives[type],\n\t expression: parsed.expression,\n\t filters: parsed.filters\n\t };\n\t }\n\t return el;\n\t}\n\t\n\t/**\n\t * Build a function that processes a textNode.\n\t *\n\t * @param {Array