{"version":3,"file":"ractive.min.js","sources":["ractive.js"],"sourcesContent":["/*\n\tRactive.js v0.8.14\n\tTue May 23 2017 18:45:38 GMT+0000 (UTC) - commit 9cf380262b870f4fd676e2fd42accf8be9a22c5b\n\n\thttp://ractivejs.org\n\thttp://twitter.com/RactiveJS\n\n\tReleased under the MIT License.\n*/\n\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t((function() { var current = global.Ractive; var next = factory(); next.noConflict = function() { global.Ractive = current; return next; }; return global.Ractive = next; })());\n}(this, function () { 'use strict';\n\n\tvar defaults = {\n\t\t// render placement:\n\t\tel:                     void 0,\n\t\tappend:\t\t\t\t    false,\n\n\t\t// template:\n\t\ttemplate:               null,\n\n\t\t// parse:\n\t\tdelimiters:             [ '{{', '}}' ],\n\t\ttripleDelimiters:       [ '{{{', '}}}' ],\n\t\tstaticDelimiters:       [ '[[', ']]' ],\n\t\tstaticTripleDelimiters: [ '[[[', ']]]' ],\n\t\tcsp: \t\t\t\t\ttrue,\n\t\tinterpolate:            false,\n\t\tpreserveWhitespace:     false,\n\t\tsanitize:               false,\n\t\tstripComments:          true,\n\t\tcontextLines:           0,\n\n\t\t// data & binding:\n\t\tdata:                   {},\n\t\tcomputed:               {},\n\t\tmagic:                  false,\n\t\tmodifyArrays:           false,\n\t\tadapt:                  [],\n\t\tisolated:               false,\n\t\ttwoway:                 true,\n\t\tlazy:                   false,\n\n\t\t// transitions:\n\t\tnoIntro:                false,\n\t\ttransitionsEnabled:     true,\n\t\tcomplete:               void 0,\n\n\t\t// css:\n\t\tcss:                    null,\n\t\tnoCssTransform:         false\n\t};\n\n\t// These are a subset of the easing equations found at\n\t// https://raw.github.com/danro/easing-js - license info\n\t// follows:\n\n\t// --------------------------------------------------\n\t// easing.js v0.5.4\n\t// Generic set of easing functions with AMD support\n\t// https://github.com/danro/easing-js\n\t// This code may be freely distributed under the MIT license\n\t// http://danro.mit-license.org/\n\t// --------------------------------------------------\n\t// All functions adapted from Thomas Fuchs & Jeremy Kahn\n\t// Easing Equations (c) 2003 Robert Penner, BSD license\n\t// https://raw.github.com/danro/easing-js/master/LICENSE\n\t// --------------------------------------------------\n\n\t// In that library, the functions named easeIn, easeOut, and\n\t// easeInOut below are named easeInCubic, easeOutCubic, and\n\t// (you guessed it) easeInOutCubic.\n\t//\n\t// You can add additional easing functions to this list, and they\n\t// will be globally available.\n\n\n\tvar easing = {\n\t\tlinear: function ( pos ) { return pos; },\n\t\teaseIn: function ( pos ) { return Math.pow( pos, 3 ); },\n\t\teaseOut: function ( pos ) { return ( Math.pow( ( pos - 1 ), 3 ) + 1 ); },\n\t\teaseInOut: function ( pos ) {\n\t\t\tif ( ( pos /= 0.5 ) < 1 ) { return ( 0.5 * Math.pow( pos, 3 ) ); }\n\t\t\treturn ( 0.5 * ( Math.pow( ( pos - 2 ), 3 ) + 2 ) );\n\t\t}\n\t};\n\n\tvar legacy = null;\n\n\t/*global console, navigator */\n\n\tvar win = typeof window !== 'undefined' ? window : null;\n\tvar doc = win ? document : null;\n\n\tvar isClient = !!doc;\n\tvar isJsdom = ( typeof navigator !== 'undefined' && /jsDom/.test( navigator.appName ) );\n\tvar hasConsole = ( typeof console !== 'undefined' && typeof console.warn === 'function' && typeof console.warn.apply === 'function' );\n\n\tvar magicSupported;\n\ttry {\n\t\tObject.defineProperty({}, 'test', { value: 0 });\n\t\tmagicSupported = true;\n\t} catch ( e ) {\n\t\tmagicSupported = false;\n\t}\n\n\tvar svg = doc ?\n\t\tdoc.implementation.hasFeature( 'http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1' ) :\n\t\tfalse;\n\n\tvar vendors = [ 'o', 'ms', 'moz', 'webkit' ];\n\n\tvar html   = 'http://www.w3.org/1999/xhtml';\n\tvar mathml = 'http://www.w3.org/1998/Math/MathML';\n\tvar svg$1    = 'http://www.w3.org/2000/svg';\n\tvar xlink  = 'http://www.w3.org/1999/xlink';\n\tvar xml    = 'http://www.w3.org/XML/1998/namespace';\n\tvar xmlns  = 'http://www.w3.org/2000/xmlns';\n\n\tvar namespaces = { html: html, mathml: mathml, svg: svg$1, xlink: xlink, xml: xml, xmlns: xmlns };\n\n\tvar createElement;\n\tvar matches;\n\tvar div;\n\tvar methodNames;\n\tvar unprefixed;\n\tvar prefixed;\n\tvar i;\n\tvar j;\n\tvar makeFunction;\n\t// Test for SVG support\n\tif ( !svg ) {\n\t\tcreateElement = function ( type, ns, extend ) {\n\t\t\tif ( ns && ns !== html ) {\n\t\t\t\tthrow 'This browser does not support namespaces other than http://www.w3.org/1999/xhtml. The most likely cause of this error is that you\\'re trying to render SVG in an older browser. See http://docs.ractivejs.org/latest/svg-and-older-browsers for more information';\n\t\t\t}\n\n\t\t\treturn extend ?\n\t\t\t\tdoc.createElement( type, extend ) :\n\t\t\t\tdoc.createElement( type );\n\t\t};\n\t} else {\n\t\tcreateElement = function ( type, ns, extend ) {\n\t\t\tif ( !ns || ns === html ) {\n\t\t\t\treturn extend ?\n\t\t\t\t\tdoc.createElement( type, extend ) :\n\t\t\t\t\tdoc.createElement( type );\n\t\t\t}\n\n\t\t\treturn extend ?\n\t\t\t\tdoc.createElementNS( ns, type, extend ) :\n\t\t\t\tdoc.createElementNS( ns, type );\n\t\t};\n\t}\n\n\tfunction createDocumentFragment () {\n\t\treturn doc.createDocumentFragment();\n\t}\n\n\tfunction getElement ( input ) {\n\t\tvar output;\n\n\t\tif ( !input || typeof input === 'boolean' ) { return; }\n\n\t\tif ( !win || !doc || !input ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// We already have a DOM node - no work to do. (Duck typing alert!)\n\t\tif ( input.nodeType ) {\n\t\t\treturn input;\n\t\t}\n\n\t\t// Get node from string\n\t\tif ( typeof input === 'string' ) {\n\t\t\t// try ID first\n\t\t\toutput = doc.getElementById( input );\n\n\t\t\t// then as selector, if possible\n\t\t\tif ( !output && doc.querySelector ) {\n\t\t\t\toutput = doc.querySelector( input );\n\t\t\t}\n\n\t\t\t// did it work?\n\t\t\tif ( output && output.nodeType ) {\n\t\t\t\treturn output;\n\t\t\t}\n\t\t}\n\n\t\t// If we've been given a collection (jQuery, Zepto etc), extract the first item\n\t\tif ( input[0] && input[0].nodeType ) {\n\t\t\treturn input[0];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tif ( !isClient ) {\n\t\tmatches = null;\n\t} else {\n\t\tdiv = createElement( 'div' );\n\t\tmethodNames = [ 'matches', 'matchesSelector' ];\n\n\t\tmakeFunction = function ( methodName ) {\n\t\t\treturn function ( node, selector ) {\n\t\t\t\treturn node[ methodName ]( selector );\n\t\t\t};\n\t\t};\n\n\t\ti = methodNames.length;\n\n\t\twhile ( i-- && !matches ) {\n\t\t\tunprefixed = methodNames[i];\n\n\t\t\tif ( div[ unprefixed ] ) {\n\t\t\t\tmatches = makeFunction( unprefixed );\n\t\t\t} else {\n\t\t\t\tj = vendors.length;\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\tprefixed = vendors[i] + unprefixed.substr( 0, 1 ).toUpperCase() + unprefixed.substring( 1 );\n\n\t\t\t\t\tif ( div[ prefixed ] ) {\n\t\t\t\t\t\tmatches = makeFunction( prefixed );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE8...\n\t\tif ( !matches ) {\n\t\t\tmatches = function ( node, selector ) {\n\t\t\t\tvar nodes, parentNode, i;\n\n\t\t\t\tparentNode = node.parentNode;\n\n\t\t\t\tif ( !parentNode ) {\n\t\t\t\t\t// empty dummy <div>\n\t\t\t\t\tdiv.innerHTML = '';\n\n\t\t\t\t\tparentNode = div;\n\t\t\t\t\tnode = node.cloneNode();\n\n\t\t\t\t\tdiv.appendChild( node );\n\t\t\t\t}\n\n\t\t\t\tnodes = parentNode.querySelectorAll( selector );\n\n\t\t\t\ti = nodes.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( nodes[i] === node ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction detachNode ( node ) {\n\t\tif ( node && typeof node.parentNode !== 'unknown' && node.parentNode ) {\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tfunction safeToStringValue ( value ) {\n\t\treturn ( value == null || !value.toString ) ? '' : '' + value;\n\t}\n\n\tfunction safeAttributeString ( string ) {\n\t\treturn safeToStringValue( string )\n\t\t\t.replace( /&/g, '&amp;' )\n\t\t\t.replace( /\"/g, '&quot;' )\n\t\t\t.replace( /'/g, '&#39;' );\n\t}\n\n\tvar decamel = /[A-Z]/g;\n\tfunction decamelize ( string ) {\n\t\treturn string.replace( decamel, function ( s ) { return (\"-\" + (s.toLowerCase())); } );\n\t}\n\n\tvar create;\n\tvar defineProperty;\n\tvar defineProperties;\n\ttry {\n\t\tObject.defineProperty({}, 'test', { get: function() {}, set: function() {} });\n\n\t\tif ( doc ) {\n\t\t\tObject.defineProperty( createElement( 'div' ), 'test', { value: 0 });\n\t\t}\n\n\t\tdefineProperty = Object.defineProperty;\n\t} catch ( err ) {\n\t\t// Object.defineProperty doesn't exist, or we're in IE8 where you can\n\t\t// only use it with DOM objects (what were you smoking, MSFT?)\n\t\tdefineProperty = function ( obj, prop, desc ) {\n\t\t\tif ( desc.get ) obj[ prop ] = desc.get();\n\t\t\telse obj[ prop ] = desc.value;\n\t\t};\n\t}\n\n\ttry {\n\t\ttry {\n\t\t\tObject.defineProperties({}, { test: { value: 0 } });\n\t\t} catch ( err ) {\n\t\t\t// TODO how do we account for this? noMagic = true;\n\t\t\tthrow err;\n\t\t}\n\n\t\tif ( doc ) {\n\t\t\tObject.defineProperties( createElement( 'div' ), { test: { value: 0 } });\n\t\t}\n\n\t\tdefineProperties = Object.defineProperties;\n\t} catch ( err ) {\n\t\tdefineProperties = function ( obj, props ) {\n\t\t\tvar prop;\n\n\t\t\tfor ( prop in props ) {\n\t\t\t\tif ( props.hasOwnProperty( prop ) ) {\n\t\t\t\t\tdefineProperty( obj, prop, props[ prop ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\ttry {\n\t\tObject.create( null );\n\n\t\tcreate = Object.create;\n\t} catch ( err ) {\n\t\t// sigh\n\t\tcreate = (function () {\n\t\t\tvar F = function () {};\n\n\t\t\treturn function ( proto, props ) {\n\t\t\t\tvar obj;\n\n\t\t\t\tif ( proto === null ) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\n\t\t\t\tF.prototype = proto;\n\t\t\t\tobj = new F();\n\n\t\t\t\tif ( props ) {\n\t\t\t\t\tObject.defineProperties( obj, props );\n\t\t\t\t}\n\n\t\t\t\treturn obj;\n\t\t\t};\n\t\t}());\n\t}\n\n\tfunction extendObj ( target ) {\n\t\tvar sources = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n\t\tvar prop;\n\n\t\tsources.forEach( function ( source ) {\n\t\t\tfor ( prop in source ) {\n\t\t\t\tif ( hasOwn.call( source, prop ) ) {\n\t\t\t\t\ttarget[ prop ] = source[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn target;\n\t}\n\n\tfunction fillGaps ( target ) {\n\t\tvar sources = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n\t\tsources.forEach( function ( s ) {\n\t\t\tfor ( var key in s ) {\n\t\t\t\tif ( hasOwn.call( s, key ) && !( key in target ) ) {\n\t\t\t\t\ttarget[ key ] = s[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn target;\n\t}\n\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\n\tvar toString = Object.prototype.toString;\n\t// thanks, http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/\n\tfunction isArray ( thing ) {\n\t\treturn toString.call( thing ) === '[object Array]';\n\t}\n\n\tfunction isEqual ( a, b ) {\n\t\tif ( a === null && b === null ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( typeof a === 'object' || typeof b === 'object' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a === b;\n\t}\n\n\t// http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric\n\tfunction isNumeric ( thing ) {\n\t\treturn !isNaN( parseFloat( thing ) ) && isFinite( thing );\n\t}\n\n\tfunction isObject ( thing ) {\n\t\treturn ( thing && toString.call( thing ) === '[object Object]' );\n\t}\n\n\tfunction noop () {}\n\n\tvar alreadyWarned = {};\n\tvar log;\n\tvar printWarning;\n\tvar welcome;\n\tif ( hasConsole ) {\n\t\tvar welcomeIntro = [\n\t\t\t(\"%cRactive.js %c0.8.14 %cin debug mode, %cmore...\"),\n\t\t\t'color: rgb(114, 157, 52); font-weight: normal;',\n\t\t\t'color: rgb(85, 85, 85); font-weight: normal;',\n\t\t\t'color: rgb(85, 85, 85); font-weight: normal;',\n\t\t\t'color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;'\n\t\t];\n\t\tvar welcomeMessage = \"You're running Ractive 0.8.14 in debug mode - messages will be printed to the console to help you fix problems and optimise your application.\\n\\nTo disable debug mode, add this line at the start of your app:\\n  Ractive.DEBUG = false;\\n\\nTo disable debug mode when your app is minified, add this snippet:\\n  Ractive.DEBUG = /unminified/.test(function(){/*unminified*/});\\n\\nGet help and support:\\n  http://docs.ractivejs.org\\n  http://stackoverflow.com/questions/tagged/ractivejs\\n  http://groups.google.com/forum/#!forum/ractive-js\\n  http://twitter.com/ractivejs\\n\\nFound a bug? Raise an issue:\\n  https://github.com/ractivejs/ractive/issues\\n\\n\";\n\n\t\twelcome = function () {\n\t\t\tif ( Ractive.WELCOME_MESSAGE === false ) {\n\t\t\t\twelcome = noop;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar message = 'WELCOME_MESSAGE' in Ractive ? Ractive.WELCOME_MESSAGE : welcomeMessage;\n\t\t\tvar hasGroup = !!console.groupCollapsed;\n\t\t\tif ( hasGroup ) console.groupCollapsed.apply( console, welcomeIntro );\n\t\t\tconsole.log( message );\n\t\t\tif ( hasGroup ) {\n\t\t\t\tconsole.groupEnd( welcomeIntro );\n\t\t\t}\n\n\t\t\twelcome = noop;\n\t\t};\n\n\t\tprintWarning = function ( message, args ) {\n\t\t\twelcome();\n\n\t\t\t// extract information about the instance this message pertains to, if applicable\n\t\t\tif ( typeof args[ args.length - 1 ] === 'object' ) {\n\t\t\t\tvar options = args.pop();\n\t\t\t\tvar ractive = options ? options.ractive : null;\n\n\t\t\t\tif ( ractive ) {\n\t\t\t\t\t// if this is an instance of a component that we know the name of, add\n\t\t\t\t\t// it to the message\n\t\t\t\t\tvar name;\n\t\t\t\t\tif ( ractive.component && ( name = ractive.component.name ) ) {\n\t\t\t\t\t\tmessage = \"<\" + name + \"> \" + message;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar node;\n\t\t\t\t\tif ( node = ( options.node || ( ractive.fragment && ractive.fragment.rendered && ractive.find( '*' ) ) ) ) {\n\t\t\t\t\t\targs.push( node );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconsole.warn.apply( console, [ '%cRactive.js: %c' + message, 'color: rgb(114, 157, 52);', 'color: rgb(85, 85, 85);' ].concat( args ) );\n\t\t};\n\n\t\tlog = function () {\n\t\t\tconsole.log.apply( console, arguments );\n\t\t};\n\t} else {\n\t\tprintWarning = log = welcome = noop;\n\t}\n\n\tfunction format ( message, args ) {\n\t\treturn message.replace( /%s/g, function () { return args.shift(); } );\n\t}\n\n\tfunction fatal ( message ) {\n\t\tvar args = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t\tmessage = format( message, args );\n\t\tthrow new Error( message );\n\t}\n\n\tfunction logIfDebug () {\n\t\tif ( Ractive.DEBUG ) {\n\t\t\tlog.apply( null, arguments );\n\t\t}\n\t}\n\n\tfunction warn ( message ) {\n\t\tvar args = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t\tmessage = format( message, args );\n\t\tprintWarning( message, args );\n\t}\n\n\tfunction warnOnce ( message ) {\n\t\tvar args = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t\tmessage = format( message, args );\n\n\t\tif ( alreadyWarned[ message ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\talreadyWarned[ message ] = true;\n\t\tprintWarning( message, args );\n\t}\n\n\tfunction warnIfDebug () {\n\t\tif ( Ractive.DEBUG ) {\n\t\t\twarn.apply( null, arguments );\n\t\t}\n\t}\n\n\tfunction warnOnceIfDebug () {\n\t\tif ( Ractive.DEBUG ) {\n\t\t\twarnOnce.apply( null, arguments );\n\t\t}\n\t}\n\n\t// Error messages that are used (or could be) in multiple places\n\tvar badArguments = 'Bad arguments';\n\tvar noRegistryFunctionReturn = 'A function was specified for \"%s\" %s, but no %s was returned';\n\tvar missingPlugin = function ( name, type ) { return (\"Missing \\\"\" + name + \"\\\" \" + type + \" plugin. You may need to download a plugin via http://docs.ractivejs.org/latest/plugins#\" + type + \"s\"); };\n\n\tfunction findInViewHierarchy ( registryName, ractive, name ) {\n\t\tvar instance = findInstance( registryName, ractive, name );\n\t\treturn instance ? instance[ registryName ][ name ] : null;\n\t}\n\n\tfunction findInstance ( registryName, ractive, name ) {\n\t\twhile ( ractive ) {\n\t\t\tif ( name in ractive[ registryName ] ) {\n\t\t\t\treturn ractive;\n\t\t\t}\n\n\t\t\tif ( ractive.isolated ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tractive = ractive.parent;\n\t\t}\n\t}\n\n\tfunction interpolate ( from, to, ractive, type ) {\n\t\tif ( from === to ) return null;\n\n\t\tif ( type ) {\n\t\t\tvar interpol = findInViewHierarchy( 'interpolators', ractive, type );\n\t\t\tif ( interpol ) return interpol( from, to ) || null;\n\n\t\t\tfatal( missingPlugin( type, 'interpolator' ) );\n\t\t}\n\n\t\treturn interpolators.number( from, to ) ||\n\t\t       interpolators.array( from, to ) ||\n\t\t       interpolators.object( from, to ) ||\n\t\t       null;\n\t}\n\n\tfunction snap ( to ) {\n\t\treturn function () { return to; };\n\t}\n\n\tvar interpolators = {\n\t\tnumber: function ( from, to ) {\n\t\t\tvar delta;\n\n\t\t\tif ( !isNumeric( from ) || !isNumeric( to ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfrom = +from;\n\t\t\tto = +to;\n\n\t\t\tdelta = to - from;\n\n\t\t\tif ( !delta ) {\n\t\t\t\treturn function () { return from; };\n\t\t\t}\n\n\t\t\treturn function ( t ) {\n\t\t\t\treturn from + ( t * delta );\n\t\t\t};\n\t\t},\n\n\t\tarray: function ( from, to ) {\n\t\t\tvar intermediate, interpolators, len, i;\n\n\t\t\tif ( !isArray( from ) || !isArray( to ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tintermediate = [];\n\t\t\tinterpolators = [];\n\n\t\t\ti = len = Math.min( from.length, to.length );\n\t\t\twhile ( i-- ) {\n\t\t\t\tinterpolators[i] = interpolate( from[i], to[i] );\n\t\t\t}\n\n\t\t\t// surplus values - don't interpolate, but don't exclude them either\n\t\t\tfor ( i=len; i<from.length; i+=1 ) {\n\t\t\t\tintermediate[i] = from[i];\n\t\t\t}\n\n\t\t\tfor ( i=len; i<to.length; i+=1 ) {\n\t\t\t\tintermediate[i] = to[i];\n\t\t\t}\n\n\t\t\treturn function ( t ) {\n\t\t\t\tvar i = len;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tintermediate[i] = interpolators[i]( t );\n\t\t\t\t}\n\n\t\t\t\treturn intermediate;\n\t\t\t};\n\t\t},\n\n\t\tobject: function ( from, to ) {\n\t\t\tvar properties, len, interpolators, intermediate, prop;\n\n\t\t\tif ( !isObject( from ) || !isObject( to ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tproperties = [];\n\t\t\tintermediate = {};\n\t\t\tinterpolators = {};\n\n\t\t\tfor ( prop in from ) {\n\t\t\t\tif ( hasOwn.call( from, prop ) ) {\n\t\t\t\t\tif ( hasOwn.call( to, prop ) ) {\n\t\t\t\t\t\tproperties.push( prop );\n\t\t\t\t\t\tinterpolators[ prop ] = interpolate( from[ prop ], to[ prop ] ) || snap( to[ prop ] );\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\t\t\t\t\t\tintermediate[ prop ] = from[ prop ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( prop in to ) {\n\t\t\t\tif ( hasOwn.call( to, prop ) && !hasOwn.call( from, prop ) ) {\n\t\t\t\t\tintermediate[ prop ] = to[ prop ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlen = properties.length;\n\n\t\t\treturn function ( t ) {\n\t\t\t\tvar i = len, prop;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tprop = properties[i];\n\n\t\t\t\t\tintermediate[ prop ] = interpolators[ prop ]( t );\n\t\t\t\t}\n\n\t\t\t\treturn intermediate;\n\t\t\t};\n\t\t}\n\t};\n\n\t// TODO: deprecate in future release\n\tvar deprecations = {\n\t\tconstruct: {\n\t\t\tdeprecated: 'beforeInit',\n\t\t\treplacement: 'onconstruct'\n\t\t},\n\t\trender: {\n\t\t\tdeprecated: 'init',\n\t\t\tmessage: 'The \"init\" method has been deprecated ' +\n\t\t\t\t'and will likely be removed in a future release. ' +\n\t\t\t\t'You can either use the \"oninit\" method which will fire ' +\n\t\t\t\t'only once prior to, and regardless of, any eventual ractive ' +\n\t\t\t\t'instance being rendered, or if you need to access the ' +\n\t\t\t\t'rendered DOM, use \"onrender\" instead. ' +\n\t\t\t\t'See http://docs.ractivejs.org/latest/migrating for more information.'\n\t\t},\n\t\tcomplete: {\n\t\t\tdeprecated: 'complete',\n\t\t\treplacement: 'oncomplete'\n\t\t}\n\t};\n\n\tvar Hook = function Hook ( event ) {\n\t\tthis.event = event;\n\t\tthis.method = 'on' + event;\n\t\tthis.deprecate = deprecations[ event ];\n\t};\n\n\tHook.prototype.call = function call ( method, ractive, arg ) {\n\t\tif ( ractive[ method ] ) {\n\t\t\targ ? ractive[ method ]( arg ) : ractive[ method ]();\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tHook.prototype.fire = function fire ( ractive, arg ) {\n\t\tthis.call( this.method, ractive, arg );\n\n\t\t// handle deprecations\n\t\tif ( !ractive[ this.method ] && this.deprecate && this.call( this.deprecate.deprecated, ractive, arg ) ) {\n\t\t\tif ( this.deprecate.message ) {\n\t\t\t\twarnIfDebug( this.deprecate.message );\n\t\t\t} else {\n\t\t\t\twarnIfDebug( 'The method \"%s\" has been deprecated in favor of \"%s\" and will likely be removed in a future release. See http://docs.ractivejs.org/latest/migrating for more information.', this.deprecate.deprecated, this.deprecate.replacement );\n\t\t\t}\n\t\t}\n\n\t\t// TODO should probably use internal method, in case ractive.fire was overwritten\n\t\targ ? ractive.fire( this.event, arg ) : ractive.fire( this.event );\n\t};\n\n\tfunction addToArray ( array, value ) {\n\t\tvar index = array.indexOf( value );\n\n\t\tif ( index === -1 ) {\n\t\t\tarray.push( value );\n\t\t}\n\t}\n\n\tfunction arrayContains ( array, value ) {\n\t\tfor ( var i = 0, c = array.length; i < c; i++ ) {\n\t\t\tif ( array[i] == value ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction arrayContentsMatch ( a, b ) {\n\t\tvar i;\n\n\t\tif ( !isArray( a ) || !isArray( b ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( a.length !== b.length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ti = a.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( a[i] !== b[i] ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction ensureArray ( x ) {\n\t\tif ( typeof x === 'string' ) {\n\t\t\treturn [ x ];\n\t\t}\n\n\t\tif ( x === undefined ) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn x;\n\t}\n\n\tfunction lastItem ( array ) {\n\t\treturn array[ array.length - 1 ];\n\t}\n\n\tfunction removeFromArray ( array, member ) {\n\t\tif ( !array ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar index = array.indexOf( member );\n\n\t\tif ( index !== -1 ) {\n\t\t\tarray.splice( index, 1 );\n\t\t}\n\t}\n\n\tfunction toArray ( arrayLike ) {\n\t\tvar array = [], i = arrayLike.length;\n\t\twhile ( i-- ) {\n\t\t\tarray[i] = arrayLike[i];\n\t\t}\n\n\t\treturn array;\n\t}\n\n\tvar _Promise;\n\tvar PENDING = {};\n\tvar FULFILLED = {};\n\tvar REJECTED = {};\n\tif ( typeof Promise === 'function' ) {\n\t\t// use native Promise\n\t\t_Promise = Promise;\n\t} else {\n\t\t_Promise = function ( callback ) {\n\t\t\tvar fulfilledHandlers = [],\n\t\t\t\trejectedHandlers = [],\n\t\t\t\tstate = PENDING,\n\n\t\t\t\tresult,\n\t\t\t\tdispatchHandlers,\n\t\t\t\tmakeResolver,\n\t\t\t\tfulfil,\n\t\t\t\treject,\n\n\t\t\t\tpromise;\n\n\t\t\tmakeResolver = function ( newState ) {\n\t\t\t\treturn function ( value ) {\n\t\t\t\t\tif ( state !== PENDING ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tresult = value;\n\t\t\t\t\tstate = newState;\n\n\t\t\t\t\tdispatchHandlers = makeDispatcher( ( state === FULFILLED ? fulfilledHandlers : rejectedHandlers ), result );\n\n\t\t\t\t\t// dispatch onFulfilled and onRejected handlers asynchronously\n\t\t\t\t\twait( dispatchHandlers );\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfulfil = makeResolver( FULFILLED );\n\t\t\treject = makeResolver( REJECTED );\n\n\t\t\ttry {\n\t\t\t\tcallback( fulfil, reject );\n\t\t\t} catch ( err ) {\n\t\t\t\treject( err );\n\t\t\t}\n\n\t\t\tpromise = {\n\t\t\t\t// `then()` returns a Promise - 2.2.7\n\t\t\t\tthen: function ( onFulfilled, onRejected ) {\n\t\t\t\t\tvar promise2 = new _Promise( function ( fulfil, reject ) {\n\n\t\t\t\t\t\tvar processResolutionHandler = function ( handler, handlers, forward ) {\n\n\t\t\t\t\t\t\t// 2.2.1.1\n\t\t\t\t\t\t\tif ( typeof handler === 'function' ) {\n\t\t\t\t\t\t\t\thandlers.push( function ( p1result ) {\n\t\t\t\t\t\t\t\t\tvar x;\n\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tx = handler( p1result );\n\t\t\t\t\t\t\t\t\t\tresolve( promise2, x, fulfil, reject );\n\t\t\t\t\t\t\t\t\t} catch ( err ) {\n\t\t\t\t\t\t\t\t\t\treject( err );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Forward the result of promise1 to promise2, if resolution handlers\n\t\t\t\t\t\t\t\t// are not given\n\t\t\t\t\t\t\t\thandlers.push( forward );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// 2.2\n\t\t\t\t\t\tprocessResolutionHandler( onFulfilled, fulfilledHandlers, fulfil );\n\t\t\t\t\t\tprocessResolutionHandler( onRejected, rejectedHandlers, reject );\n\n\t\t\t\t\t\tif ( state !== PENDING ) {\n\t\t\t\t\t\t\t// If the promise has resolved already, dispatch the appropriate handlers asynchronously\n\t\t\t\t\t\t\twait( dispatchHandlers );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\n\t\t\t\t\treturn promise2;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tpromise[ 'catch' ] = function ( onRejected ) {\n\t\t\t\treturn this.then( null, onRejected );\n\t\t\t};\n\n\t\t\treturn promise;\n\t\t};\n\n\t\t_Promise.all = function ( promises ) {\n\t\t\treturn new _Promise( function ( fulfil, reject ) {\n\t\t\t\tvar result = [], pending, i, processPromise;\n\n\t\t\t\tif ( !promises.length ) {\n\t\t\t\t\tfulfil( result );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tprocessPromise = function ( promise, i ) {\n\t\t\t\t\tif ( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\tpromise.then( function ( value ) {\n\t\t\t\t\t\t\tresult[i] = value;\n\t\t\t\t\t\t\t--pending || fulfil( result );\n\t\t\t\t\t\t}, reject );\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\t\t\t\t\t\tresult[i] = promise;\n\t\t\t\t\t\t--pending || fulfil( result );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tpending = i = promises.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tprocessPromise( promises[i], i );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t_Promise.resolve = function ( value ) {\n\t\t\treturn new _Promise( function ( fulfil ) {\n\t\t\t\tfulfil( value );\n\t\t\t});\n\t\t};\n\n\t\t_Promise.reject = function ( reason ) {\n\t\t\treturn new _Promise( function ( fulfil, reject ) {\n\t\t\t\treject( reason );\n\t\t\t});\n\t\t};\n\t}\n\n\tvar Promise$1 = _Promise;\n\n\t// TODO use MutationObservers or something to simulate setImmediate\n\tfunction wait ( callback ) {\n\t\tsetTimeout( callback, 0 );\n\t}\n\n\tfunction makeDispatcher ( handlers, result ) {\n\t\treturn function () {\n\t\t\tvar handler;\n\n\t\t\twhile ( handler = handlers.shift() ) {\n\t\t\t\thandler( result );\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction resolve ( promise, x, fulfil, reject ) {\n\t\t// Promise Resolution Procedure\n\t\tvar then;\n\n\t\t// 2.3.1\n\t\tif ( x === promise ) {\n\t\t\tthrow new TypeError( 'A promise\\'s fulfillment handler cannot return the same promise' );\n\t\t}\n\n\t\t// 2.3.2\n\t\tif ( x instanceof _Promise ) {\n\t\t\tx.then( fulfil, reject );\n\t\t}\n\n\t\t// 2.3.3\n\t\telse if ( x && ( typeof x === 'object' || typeof x === 'function' ) ) {\n\t\t\ttry {\n\t\t\t\tthen = x.then; // 2.3.3.1\n\t\t\t} catch ( e ) {\n\t\t\t\treject( e ); // 2.3.3.2\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// 2.3.3.3\n\t\t\tif ( typeof then === 'function' ) {\n\t\t\t\tvar called, resolvePromise, rejectPromise;\n\n\t\t\t\tresolvePromise = function ( y ) {\n\t\t\t\t\tif ( called ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tresolve( promise, y, fulfil, reject );\n\t\t\t\t};\n\n\t\t\t\trejectPromise = function ( r ) {\n\t\t\t\t\tif ( called ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcalled = true;\n\t\t\t\t\treject( r );\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tthen.call( x, resolvePromise, rejectPromise );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( !called ) { // 2.3.3.3.4.1\n\t\t\t\t\t\treject( e ); // 2.3.3.3.4.2\n\t\t\t\t\t\tcalled = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tfulfil( x );\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tfulfil( x );\n\t\t}\n\t}\n\n\tvar TransitionManager = function TransitionManager ( callback, parent ) {\n\t\tthis.callback = callback;\n\t\tthis.parent = parent;\n\n\t\tthis.intros = [];\n\t\tthis.outros = [];\n\n\t\tthis.children = [];\n\t\tthis.totalChildren = this.outroChildren = 0;\n\n\t\tthis.detachQueue = [];\n\t\tthis.outrosComplete = false;\n\n\t\tif ( parent ) {\n\t\t\tparent.addChild( this );\n\t\t}\n\t};\n\n\tTransitionManager.prototype.add = function add ( transition ) {\n\t\tvar list = transition.isIntro ? this.intros : this.outros;\n\t\tlist.push( transition );\n\t};\n\n\tTransitionManager.prototype.addChild = function addChild ( child ) {\n\t\tthis.children.push( child );\n\n\t\tthis.totalChildren += 1;\n\t\tthis.outroChildren += 1;\n\t};\n\n\tTransitionManager.prototype.decrementOutros = function decrementOutros () {\n\t\tthis.outroChildren -= 1;\n\t\tcheck( this );\n\t};\n\n\tTransitionManager.prototype.decrementTotal = function decrementTotal () {\n\t\tthis.totalChildren -= 1;\n\t\tcheck( this );\n\t};\n\n\tTransitionManager.prototype.detachNodes = function detachNodes () {\n\t\tthis.detachQueue.forEach( detach );\n\t\tthis.children.forEach( _detachNodes );\n\t\tthis.detachQueue = [];\n\t};\n\n\tTransitionManager.prototype.ready = function ready () {\n\t\tdetachImmediate( this );\n\t};\n\n\tTransitionManager.prototype.remove = function remove ( transition ) {\n\t\tvar list = transition.isIntro ? this.intros : this.outros;\n\t\tremoveFromArray( list, transition );\n\t\tcheck( this );\n\t};\n\n\tTransitionManager.prototype.start = function start () {\n\t\tthis.children.forEach( function ( c ) { return c.start(); } );\n\t\tthis.intros.concat( this.outros ).forEach( function ( t ) { return t.start(); } );\n\t\tthis.ready = true;\n\t\tcheck( this );\n\t};\n\n\tfunction detach ( element ) {\n\t\telement.detach();\n\t}\n\n\tfunction _detachNodes ( tm ) { // _ to avoid transpiler quirk\n\t\ttm.detachNodes();\n\t}\n\n\tfunction check ( tm ) {\n\t\tif ( !tm.ready || tm.outros.length || tm.outroChildren ) return;\n\n\t\t// If all outros are complete, and we haven't already done this,\n\t\t// we notify the parent if there is one, otherwise\n\t\t// start detaching nodes\n\t\tif ( !tm.outrosComplete ) {\n\t\t\ttm.outrosComplete = true;\n\n\t\t\tif ( tm.parent && !tm.parent.outrosComplete ) {\n\t\t\t\ttm.parent.decrementOutros( tm );\n\t\t\t} else {\n\t\t\t\ttm.detachNodes();\n\t\t\t}\n\t\t}\n\n\t\t// Once everything is done, we can notify parent transition\n\t\t// manager and call the callback\n\t\tif ( !tm.intros.length && !tm.totalChildren ) {\n\t\t\tif ( typeof tm.callback === 'function' ) {\n\t\t\t\ttm.callback();\n\t\t\t}\n\n\t\t\tif ( tm.parent && !tm.notifiedTotal ) {\n\t\t\t\ttm.notifiedTotal = true;\n\t\t\t\ttm.parent.decrementTotal();\n\t\t\t}\n\t\t}\n\t}\n\n\t// check through the detach queue to see if a node is up or downstream from a\n\t// transition and if not, go ahead and detach it\n\tfunction detachImmediate ( manager ) {\n\t\tvar queue = manager.detachQueue;\n\t\tvar outros = collectAllOutros( manager );\n\n\t\tvar i = queue.length, j = 0, node, trans;\n\t\tstart: while ( i-- ) {\n\t\t\tnode = queue[i].node;\n\t\t\tj = outros.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\ttrans = outros[j].element.node;\n\t\t\t\t// check to see if the node is, contains, or is contained by the transitioning node\n\t\t\t\tif ( trans === node || trans.contains( node ) || node.contains( trans ) ) continue start;\n\t\t\t}\n\n\t\t\t// no match, we can drop it\n\t\t\tqueue[i].detach();\n\t\t\tqueue.splice( i, 1 );\n\t\t}\n\t}\n\n\tfunction collectAllOutros ( manager, list ) {\n\t\tif ( !list ) {\n\t\t\tlist = [];\n\t\t\tvar parent = manager;\n\t\t\twhile ( parent.parent ) parent = parent.parent;\n\t\t\treturn collectAllOutros( parent, list );\n\t\t} else {\n\t\t\tvar i = manager.children.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tlist = collectAllOutros( manager.children[i], list );\n\t\t\t}\n\t\t\tlist = list.concat( manager.outros );\n\t\t\treturn list;\n\t\t}\n\t}\n\n\tvar changeHook = new Hook( 'change' );\n\n\tvar batch;\n\n\tvar runloop = {\n\t\tstart: function ( instance, returnPromise ) {\n\t\t\tvar promise, fulfilPromise;\n\n\t\t\tif ( returnPromise ) {\n\t\t\t\tpromise = new Promise$1( function ( f ) { return ( fulfilPromise = f ); } );\n\t\t\t}\n\n\t\t\tbatch = {\n\t\t\t\tpreviousBatch: batch,\n\t\t\t\ttransitionManager: new TransitionManager( fulfilPromise, batch && batch.transitionManager ),\n\t\t\t\tfragments: [],\n\t\t\t\ttasks: [],\n\t\t\t\timmediateObservers: [],\n\t\t\t\tdeferredObservers: [],\n\t\t\t\tractives: [],\n\t\t\t\tinstance: instance\n\t\t\t};\n\n\t\t\treturn promise;\n\t\t},\n\n\t\tend: function () {\n\t\t\tflushChanges();\n\n\t\t\tif ( !batch.previousBatch ) batch.transitionManager.start();\n\n\t\t\tbatch = batch.previousBatch;\n\t\t},\n\n\t\taddFragment: function ( fragment ) {\n\t\t\taddToArray( batch.fragments, fragment );\n\t\t},\n\n\t\t// TODO: come up with a better way to handle fragments that trigger their own update\n\t\taddFragmentToRoot: function ( fragment ) {\n\t\t\tif ( !batch ) return;\n\n\t\t\tvar b = batch;\n\t\t\twhile ( b.previousBatch ) {\n\t\t\t\tb = b.previousBatch;\n\t\t\t}\n\n\t\t\taddToArray( b.fragments, fragment );\n\t\t},\n\n\t\taddInstance: function ( instance ) {\n\t\t\tif ( batch ) addToArray( batch.ractives, instance );\n\t\t},\n\n\t\taddObserver: function ( observer, defer ) {\n\t\t\taddToArray( defer ? batch.deferredObservers : batch.immediateObservers, observer );\n\t\t},\n\n\t\tregisterTransition: function ( transition ) {\n\t\t\ttransition._manager = batch.transitionManager;\n\t\t\tbatch.transitionManager.add( transition );\n\t\t},\n\n\t\t// synchronise node detachments with transition ends\n\t\tdetachWhenReady: function ( thing ) {\n\t\t\tbatch.transitionManager.detachQueue.push( thing );\n\t\t},\n\n\t\tscheduleTask: function ( task, postRender ) {\n\t\t\tvar _batch;\n\n\t\t\tif ( !batch ) {\n\t\t\t\ttask();\n\t\t\t} else {\n\t\t\t\t_batch = batch;\n\t\t\t\twhile ( postRender && _batch.previousBatch ) {\n\t\t\t\t\t// this can't happen until the DOM has been fully updated\n\t\t\t\t\t// otherwise in some situations (with components inside elements)\n\t\t\t\t\t// transitions and decorators will initialise prematurely\n\t\t\t\t\t_batch = _batch.previousBatch;\n\t\t\t\t}\n\n\t\t\t\t_batch.tasks.push( task );\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction dispatch ( observer ) {\n\t\tobserver.dispatch();\n\t}\n\n\tfunction flushChanges () {\n\t\tvar which = batch.immediateObservers;\n\t\tbatch.immediateObservers = [];\n\t\twhich.forEach( dispatch );\n\n\t\t// Now that changes have been fully propagated, we can update the DOM\n\t\t// and complete other tasks\n\t\tvar i = batch.fragments.length;\n\t\tvar fragment;\n\n\t\twhich = batch.fragments;\n\t\tbatch.fragments = [];\n\t\tvar ractives = batch.ractives;\n\t\tbatch.ractives = [];\n\n\t\twhile ( i-- ) {\n\t\t\tfragment = which[i];\n\n\t\t\t// TODO deprecate this. It's annoying and serves no useful function\n\t\t\tvar ractive = fragment.ractive;\n\t\t\tif ( Object.keys( ractive.viewmodel.changes ).length ) {\n\t\t\t\tchangeHook.fire( ractive, ractive.viewmodel.changes );\n\t\t\t}\n\t\t\tractive.viewmodel.changes = {};\n\t\t\tremoveFromArray( ractives, ractive );\n\n\t\t\tfragment.update();\n\t\t}\n\n\t\ti = ractives.length;\n\t\twhile ( i-- ) {\n\t\t\tvar ractive$1 = ractives[i];\n\t\t\tchangeHook.fire( ractive$1, ractive$1.viewmodel.changes );\n\t\t\tractive$1.viewmodel.changes = {};\n\t\t}\n\n\t\tbatch.transitionManager.ready();\n\n\t\twhich = batch.deferredObservers;\n\t\tbatch.deferredObservers = [];\n\t\twhich.forEach( dispatch );\n\n\t\tvar tasks = batch.tasks;\n\t\tbatch.tasks = [];\n\n\t\tfor ( i = 0; i < tasks.length; i += 1 ) {\n\t\t\ttasks[i]();\n\t\t}\n\n\t\t// If updating the view caused some model blowback - e.g. a triple\n\t\t// containing <option> elements caused the binding on the <select>\n\t\t// to update - then we start over\n\t\tif ( batch.fragments.length || batch.immediateObservers.length || batch.deferredObservers.length || batch.ractives.length || batch.tasks.length ) return flushChanges();\n\t}\n\n\tvar refPattern = /\\[\\s*(\\*|[0-9]|[1-9][0-9]+)\\s*\\]/g;\n\tvar splitPattern = /([^\\\\](?:\\\\\\\\)*)\\./;\n\tvar escapeKeyPattern = /\\\\|\\./g;\n\tvar unescapeKeyPattern = /((?:\\\\)+)\\1|\\\\(\\.)/g;\n\n\tfunction escapeKey ( key ) {\n\t\tif ( typeof key === 'string' ) {\n\t\t\treturn key.replace( escapeKeyPattern, '\\\\$&' );\n\t\t}\n\n\t\treturn key;\n\t}\n\n\tfunction normalise ( ref ) {\n\t\treturn ref ? ref.replace( refPattern, '.$1' ) : '';\n\t}\n\n\tfunction splitKeypathI ( keypath ) {\n\t\tvar result = [],\n\t\t\tmatch;\n\n\t\tkeypath = normalise( keypath );\n\n\t\twhile ( match = splitPattern.exec( keypath ) ) {\n\t\t\tvar index = match.index + match[1].length;\n\t\t\tresult.push( keypath.substr( 0, index ) );\n\t\t\tkeypath = keypath.substr( index + 1 );\n\t\t}\n\n\t\tresult.push(keypath);\n\n\t\treturn result;\n\t}\n\n\tfunction unescapeKey ( key ) {\n\t\tif ( typeof key === 'string' ) {\n\t\t\treturn key.replace( unescapeKeyPattern, '$1$2' );\n\t\t}\n\n\t\treturn key;\n\t}\n\n\tvar fnBind = Function.prototype.bind;\n\n\tfunction bind ( fn, context ) {\n\t\tif ( !/this/.test( fn.toString() ) ) return fn;\n\n\t\tvar bound = fnBind.call( fn, context );\n\t\tfor ( var prop in fn ) bound[ prop ] = fn[ prop ];\n\n\t\treturn bound;\n\t}\n\n\tfunction set ( ractive, pairs ) {\n\t\tvar promise = runloop.start( ractive, true );\n\n\t\tvar i = pairs.length;\n\t\twhile ( i-- ) {\n\t\t\tvar ref = pairs[i], model = ref[0], value = ref[1];\n\t\t\tif ( typeof value === 'function' ) value = bind( value, ractive );\n\t\t\tmodel.set( value );\n\t\t}\n\n\t\trunloop.end();\n\n\t\treturn promise;\n\t}\n\n\tvar star = /\\*/;\n\tfunction gather ( ractive, keypath, base ) {\n\t\tif ( base === void 0 ) base = ractive.viewmodel;\n\n\t\tif ( star.test( keypath ) ) {\n\t\t\treturn base.findMatches( splitKeypathI( keypath ) );\n\t\t} else {\n\t\t\treturn [ base.joinAll( splitKeypathI( keypath ) ) ];\n\t\t}\n\t}\n\n\tfunction build ( ractive, keypath, value ) {\n\t\tvar sets = [];\n\n\t\t// set multiple keypaths in one go\n\t\tif ( isObject( keypath ) ) {\n\t\t\tvar loop = function ( k ) {\n\t\t\t\tif ( keypath.hasOwnProperty( k ) ) {\n\t\t\t\t\tsets.push.apply( sets, gather( ractive, k ).map( function ( m ) { return [ m, keypath[k] ]; } ) );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor ( var k in keypath ) loop( k );\n\n\t\t}\n\t\t// set a single keypath\n\t\telse {\n\t\t\tsets.push.apply( sets, gather( ractive, keypath ).map( function ( m ) { return [ m, value ]; } ) );\n\t\t}\n\n\t\treturn sets;\n\t}\n\n\tvar errorMessage = 'Cannot add to a non-numeric value';\n\n\tfunction add ( ractive, keypath, d ) {\n\t\tif ( typeof keypath !== 'string' || !isNumeric( d ) ) {\n\t\t\tthrow new Error( 'Bad arguments' );\n\t\t}\n\n\t\tvar sets = build( ractive, keypath, d );\n\n\t\treturn set( ractive, sets.map( function ( pair ) {\n\t\t\tvar model = pair[0], add = pair[1], value = model.get();\n\t\t\tif ( !isNumeric( add ) || !isNumeric( value ) ) throw new Error( errorMessage );\n\t\t\treturn [ model, value + add ];\n\t\t}));\n\t}\n\n\tfunction Ractive$add ( keypath, d ) {\n\t\treturn add( this, keypath, ( d === undefined ? 1 : +d ) );\n\t}\n\n\tvar noAnimation = Promise$1.resolve();\n\tdefineProperty( noAnimation, 'stop', { value: noop });\n\n\tvar linear = easing.linear;\n\n\tfunction getOptions ( options, instance ) {\n\t\toptions = options || {};\n\n\t\tvar easing;\n\t\tif ( options.easing ) {\n\t\t\teasing = typeof options.easing === 'function' ?\n\t\t\t\toptions.easing :\n\t\t\t\tinstance.easing[ options.easing ];\n\t\t}\n\n\t\treturn {\n\t\t\teasing: easing || linear,\n\t\t\tduration: 'duration' in options ? options.duration : 400,\n\t\t\tcomplete: options.complete || noop,\n\t\t\tstep: options.step || noop\n\t\t};\n\t}\n\n\tfunction protoAnimate ( ractive, model, to, options ) {\n\t\toptions = getOptions( options, ractive );\n\t\tvar from = model.get();\n\n\t\t// don't bother animating values that stay the same\n\t\tif ( isEqual( from, to ) ) {\n\t\t\toptions.complete( options.to );\n\t\t\treturn noAnimation; // TODO should this have .then and .catch methods?\n\t\t}\n\n\t\tvar interpolator = interpolate( from, to, ractive, options.interpolator );\n\n\t\t// if we can't interpolate the value, set it immediately\n\t\tif ( !interpolator ) {\n\t\t\trunloop.start();\n\t\t\tmodel.set( to );\n\t\t\trunloop.end();\n\n\t\t\treturn noAnimation;\n\t\t}\n\n\t\treturn model.animate( from, to, options, interpolator );\n\t}\n\n\tfunction Ractive$animate ( keypath, to, options ) {\n\t\tif ( typeof keypath === 'object' ) {\n\t\t\tvar keys = Object.keys( keypath );\n\n\t\t\tthrow new Error( (\"ractive.animate(...) no longer supports objects. Instead of ractive.animate({\\n  \" + (keys.map( function ( key ) { return (\"'\" + key + \"': \" + (keypath[ key ])); } ).join( '\\n  ' )) + \"\\n}, {...}), do\\n\\n\" + (keys.map( function ( key ) { return (\"ractive.animate('\" + key + \"', \" + (keypath[ key ]) + \", {...});\"); } ).join( '\\n' )) + \"\\n\") );\n\t\t}\n\n\n\t\treturn protoAnimate( this, this.viewmodel.joinAll( splitKeypathI( keypath ) ), to, options );\n\t}\n\n\tvar detachHook = new Hook( 'detach' );\n\n\tfunction Ractive$detach () {\n\t\tif ( this.isDetached ) {\n\t\t\treturn this.el;\n\t\t}\n\n\t\tif ( this.el ) {\n\t\t\tremoveFromArray( this.el.__ractive_instances__, this );\n\t\t}\n\n\t\tthis.el = this.fragment.detach();\n\t\tthis.isDetached = true;\n\n\t\tdetachHook.fire( this );\n\t\treturn this.el;\n\t}\n\n\tfunction Ractive$find ( selector ) {\n\t\tif ( !this.el ) throw new Error( (\"Cannot call ractive.find('\" + selector + \"') unless instance is rendered to the DOM\") );\n\n\t\treturn this.fragment.find( selector );\n\t}\n\n\tfunction sortByDocumentPosition ( node, otherNode ) {\n\t\tif ( node.compareDocumentPosition ) {\n\t\t\tvar bitmask = node.compareDocumentPosition( otherNode );\n\t\t\treturn ( bitmask & 2 ) ? 1 : -1;\n\t\t}\n\n\t\t// In old IE, we can piggy back on the mechanism for\n\t\t// comparing component positions\n\t\treturn sortByItemPosition( node, otherNode );\n\t}\n\n\tfunction sortByItemPosition ( a, b ) {\n\t\tvar ancestryA = getAncestry( a.component || a._ractive.proxy );\n\t\tvar ancestryB = getAncestry( b.component || b._ractive.proxy );\n\n\t\tvar oldestA = lastItem( ancestryA );\n\t\tvar oldestB = lastItem( ancestryB );\n\t\tvar mutualAncestor;\n\n\t\t// remove items from the end of both ancestries as long as they are identical\n\t\t// - the final one removed is the closest mutual ancestor\n\t\twhile ( oldestA && ( oldestA === oldestB ) ) {\n\t\t\tancestryA.pop();\n\t\t\tancestryB.pop();\n\n\t\t\tmutualAncestor = oldestA;\n\n\t\t\toldestA = lastItem( ancestryA );\n\t\t\toldestB = lastItem( ancestryB );\n\t\t}\n\n\t\t// now that we have the mutual ancestor, we can find which is earliest\n\t\toldestA = oldestA.component || oldestA;\n\t\toldestB = oldestB.component || oldestB;\n\n\t\tvar fragmentA = oldestA.parentFragment;\n\t\tvar fragmentB = oldestB.parentFragment;\n\n\t\t// if both items share a parent fragment, our job is easy\n\t\tif ( fragmentA === fragmentB ) {\n\t\t\tvar indexA = fragmentA.items.indexOf( oldestA );\n\t\t\tvar indexB = fragmentB.items.indexOf( oldestB );\n\n\t\t\t// if it's the same index, it means one contains the other,\n\t\t\t// so we see which has the longest ancestry\n\t\t\treturn ( indexA - indexB ) || ancestryA.length - ancestryB.length;\n\t\t}\n\n\t\t// if mutual ancestor is a section, we first test to see which section\n\t\t// fragment comes first\n\t\tvar fragments = mutualAncestor.iterations;\n\t\tif ( fragments ) {\n\t\t\tvar indexA$1 = fragments.indexOf( fragmentA );\n\t\t\tvar indexB$1 = fragments.indexOf( fragmentB );\n\n\t\t\treturn ( indexA$1 - indexB$1 ) || ancestryA.length - ancestryB.length;\n\t\t}\n\n\t\tthrow new Error( 'An unexpected condition was met while comparing the position of two components. Please file an issue at https://github.com/ractivejs/ractive/issues - thanks!' );\n\t}\n\n\tfunction getParent ( item ) {\n\t\tvar parentFragment = item.parentFragment;\n\n\t\tif ( parentFragment ) return parentFragment.owner;\n\n\t\tif ( item.component && ( parentFragment = item.component.parentFragment ) ) {\n\t\t\treturn parentFragment.owner;\n\t\t}\n\t}\n\n\tfunction getAncestry ( item ) {\n\t\tvar ancestry = [ item ];\n\t\tvar ancestor = getParent( item );\n\n\t\twhile ( ancestor ) {\n\t\t\tancestry.push( ancestor );\n\t\t\tancestor = getParent( ancestor );\n\t\t}\n\n\t\treturn ancestry;\n\t}\n\n\n\tvar Query = function Query ( ractive, selector, live, isComponentQuery ) {\n\t\tthis.ractive = ractive;\n\t\tthis.selector = selector;\n\t\tthis.live = live;\n\t\tthis.isComponentQuery = isComponentQuery;\n\n\t\tthis.result = [];\n\n\t\tthis.dirty = true;\n\t};\n\n\tQuery.prototype.add = function add ( item ) {\n\t\tthis.result.push( item );\n\t\tthis.makeDirty();\n\t};\n\n\tQuery.prototype.cancel = function cancel () {\n\t\tvar liveQueries = this._root[ this.isComponentQuery ? 'liveComponentQueries' : 'liveQueries' ];\n\t\tvar selector = this.selector;\n\n\t\tvar index = liveQueries.indexOf( selector );\n\n\t\tif ( index !== -1 ) {\n\t\t\tliveQueries.splice( index, 1 );\n\t\t\tliveQueries[ selector ] = null;\n\t\t}\n\t};\n\n\tQuery.prototype.init = function init () {\n\t\tthis.dirty = false;\n\t};\n\n\tQuery.prototype.makeDirty = function makeDirty () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !this.dirty ) {\n\t\t\tthis.dirty = true;\n\n\t\t\t// Once the DOM has been updated, ensure the query\n\t\t\t// is correctly ordered\n\t\t\trunloop.scheduleTask( function () { return this$1.update(); } );\n\t\t}\n\t};\n\n\tQuery.prototype.remove = function remove ( nodeOrComponent ) {\n\t\tvar index = this.result.indexOf( this.isComponentQuery ? nodeOrComponent.instance : nodeOrComponent );\n\t\tif ( index !== -1 ) this.result.splice( index, 1 );\n\t};\n\n\tQuery.prototype.update = function update () {\n\t\tthis.result.sort( this.isComponentQuery ? sortByItemPosition : sortByDocumentPosition );\n\t\tthis.dirty = false;\n\t};\n\n\tQuery.prototype.test = function test ( item ) {\n\t\treturn this.isComponentQuery ?\n\t\t\t( !this.selector || item.name === this.selector ) :\n\t\t\t( item ? matches( item, this.selector ) : null );\n\t};\n\n\tfunction Ractive$findAll ( selector, options ) {\n\t\tif ( !this.el ) throw new Error( (\"Cannot call ractive.findAll('\" + selector + \"', ...) unless instance is rendered to the DOM\") );\n\n\t\toptions = options || {};\n\t\tvar liveQueries = this._liveQueries;\n\n\t\t// Shortcut: if we're maintaining a live query with this\n\t\t// selector, we don't need to traverse the parallel DOM\n\t\tvar query = liveQueries[ selector ];\n\t\tif ( query ) {\n\t\t\t// Either return the exact same query, or (if not live) a snapshot\n\t\t\treturn ( options && options.live ) ? query : query.slice();\n\t\t}\n\n\t\tquery = new Query( this, selector, !!options.live, false );\n\n\t\t// Add this to the list of live queries Ractive needs to maintain,\n\t\t// if applicable\n\t\tif ( query.live ) {\n\t\t\tliveQueries.push( selector );\n\t\t\tliveQueries[ '_' + selector ] = query;\n\t\t}\n\n\t\tthis.fragment.findAll( selector, query );\n\n\t\tquery.init();\n\t\treturn query.result;\n\t}\n\n\tfunction Ractive$findAllComponents ( selector, options ) {\n\t\toptions = options || {};\n\t\tvar liveQueries = this._liveComponentQueries;\n\n\t\t// Shortcut: if we're maintaining a live query with this\n\t\t// selector, we don't need to traverse the parallel DOM\n\t\tvar query = liveQueries[ selector ];\n\t\tif ( query ) {\n\t\t\t// Either return the exact same query, or (if not live) a snapshot\n\t\t\treturn ( options && options.live ) ? query : query.slice();\n\t\t}\n\n\t\tquery = new Query( this, selector, !!options.live, true );\n\n\t\t// Add this to the list of live queries Ractive needs to maintain,\n\t\t// if applicable\n\t\tif ( query.live ) {\n\t\t\tliveQueries.push( selector );\n\t\t\tliveQueries[ '_' + selector ] = query;\n\t\t}\n\n\t\tthis.fragment.findAllComponents( selector, query );\n\n\t\tquery.init();\n\t\treturn query.result;\n\t}\n\n\tfunction Ractive$findComponent ( selector ) {\n\t\treturn this.fragment.findComponent( selector );\n\t}\n\n\tfunction Ractive$findContainer ( selector ) {\n\t\tif ( this.container ) {\n\t\t\tif ( this.container.component && this.container.component.name === selector ) {\n\t\t\t\treturn this.container;\n\t\t\t} else {\n\t\t\t\treturn this.container.findContainer( selector );\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction Ractive$findParent ( selector ) {\n\n\t\tif ( this.parent ) {\n\t\t\tif ( this.parent.component && this.parent.component.name === selector ) {\n\t\t\t\treturn this.parent;\n\t\t\t} else {\n\t\t\t\treturn this.parent.findParent ( selector );\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction enqueue ( ractive, event ) {\n\t\tif ( ractive.event ) {\n\t\t\tractive._eventQueue.push( ractive.event );\n\t\t}\n\n\t\tractive.event = event;\n\t}\n\n\tfunction dequeue ( ractive ) {\n\t\tif ( ractive._eventQueue.length ) {\n\t\t\tractive.event = ractive._eventQueue.pop();\n\t\t} else {\n\t\t\tractive.event = null;\n\t\t}\n\t}\n\n\tvar starMaps = {};\n\n\t// This function takes a keypath such as 'foo.bar.baz', and returns\n\t// all the variants of that keypath that include a wildcard in place\n\t// of a key, such as 'foo.bar.*', 'foo.*.baz', 'foo.*.*' and so on.\n\t// These are then checked against the dependants map (ractive.viewmodel.depsMap)\n\t// to see if any pattern observers are downstream of one or more of\n\t// these wildcard keypaths (e.g. 'foo.bar.*.status')\n\tfunction getPotentialWildcardMatches ( keypath ) {\n\t\tvar keys, starMap, mapper, i, result, wildcardKeypath;\n\n\t\tkeys = splitKeypathI( keypath );\n\t\tif( !( starMap = starMaps[ keys.length ]) ) {\n\t\t\tstarMap = getStarMap( keys.length );\n\t\t}\n\n\t\tresult = [];\n\n\t\tmapper = function ( star, i ) {\n\t\t\treturn star ? '*' : keys[i];\n\t\t};\n\n\t\ti = starMap.length;\n\t\twhile ( i-- ) {\n\t\t\twildcardKeypath = starMap[i].map( mapper ).join( '.' );\n\n\t\t\tif ( !result.hasOwnProperty( wildcardKeypath ) ) {\n\t\t\t\tresult.push( wildcardKeypath );\n\t\t\t\tresult[ wildcardKeypath ] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// This function returns all the possible true/false combinations for\n\t// a given number - e.g. for two, the possible combinations are\n\t// [ true, true ], [ true, false ], [ false, true ], [ false, false ].\n\t// It does so by getting all the binary values between 0 and e.g. 11\n\tfunction getStarMap ( num ) {\n\t\tvar ones = '', max, binary, starMap, mapper, i, j, l, map;\n\n\t\tif ( !starMaps[ num ] ) {\n\t\t\tstarMap = [];\n\n\t\t\twhile ( ones.length < num ) {\n\t\t\t\tones += 1;\n\t\t\t}\n\n\t\t\tmax = parseInt( ones, 2 );\n\n\t\t\tmapper = function ( digit ) {\n\t\t\t\treturn digit === '1';\n\t\t\t};\n\n\t\t\tfor ( i = 0; i <= max; i += 1 ) {\n\t\t\t\tbinary = i.toString( 2 );\n\t\t\t\twhile ( binary.length < num ) {\n\t\t\t\t\tbinary = '0' + binary;\n\t\t\t\t}\n\n\t\t\t\tmap = [];\n\t\t\t\tl = binary.length;\n\t\t\t\tfor (j = 0; j < l; j++) {\n\t\t\t\t\tmap.push( mapper( binary[j] ) );\n\t\t\t\t}\n\t\t\t\tstarMap[i] = map;\n\t\t\t}\n\n\t\t\tstarMaps[ num ] = starMap;\n\t\t}\n\n\t\treturn starMaps[ num ];\n\t}\n\n\tvar wildcardCache = {};\n\n\tfunction fireEvent ( ractive, eventName, options ) {\n\t\tif ( options === void 0 ) options = {};\n\n\t\tif ( !eventName ) { return; }\n\n\t\tif ( !options.event ) {\n\t\t\toptions.event = {\n\t\t\t\tname: eventName,\n\t\t\t\t// until event not included as argument default\n\t\t\t\t_noArg: true\n\t\t\t};\n\t\t} else {\n\t\t\toptions.event.name = eventName;\n\t\t}\n\n\t\tvar eventNames = getWildcardNames( eventName );\n\n\t\treturn fireEventAs( ractive, eventNames, options.event, options.args, true );\n\t}\n\n\tfunction getWildcardNames ( eventName ) {\n\t\tif ( wildcardCache.hasOwnProperty( eventName ) ) {\n\t\t\treturn wildcardCache[ eventName ];\n\t\t} else {\n\t\t\treturn wildcardCache[ eventName ] = getPotentialWildcardMatches( eventName );\n\t\t}\n\t}\n\n\tfunction fireEventAs  ( ractive, eventNames, event, args, initialFire ) {\n\n\t\tif ( initialFire === void 0 ) initialFire = false;\n\n\t\tvar subscribers, i, bubble = true;\n\n\t\tenqueue( ractive, event );\n\n\t\tfor ( i = eventNames.length; i >= 0; i-- ) {\n\t\t\tsubscribers = ractive._subs[ eventNames[ i ] ];\n\n\t\t\tif ( subscribers ) {\n\t\t\t\tbubble = notifySubscribers( ractive, subscribers, event, args ) && bubble;\n\t\t\t}\n\t\t}\n\n\t\tdequeue( ractive );\n\n\t\tif ( ractive.parent && bubble ) {\n\n\t\t\tif ( initialFire && ractive.component ) {\n\t\t\t\tvar fullName = ractive.component.name + '.' + eventNames[ eventNames.length-1 ];\n\t\t\t\teventNames = getWildcardNames( fullName );\n\n\t\t\t\tif( event && !event.component ) {\n\t\t\t\t\tevent.component = ractive;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbubble = fireEventAs( ractive.parent, eventNames, event, args );\n\t\t}\n\n\t\treturn bubble;\n\t}\n\n\tfunction notifySubscribers ( ractive, subscribers, event, args ) {\n\t\tvar originalEvent = null, stopEvent = false;\n\n\t\tif ( event && !event._noArg ) {\n\t\t\targs = [ event ].concat( args );\n\t\t}\n\n\t\t// subscribers can be modified inflight, e.g. \"once\" functionality\n\t\t// so we need to copy to make sure everyone gets called\n\t\tsubscribers = subscribers.slice();\n\n\t\tfor ( var i = 0, len = subscribers.length; i < len; i += 1 ) {\n\t\t\tif ( !subscribers[ i ].off && subscribers[ i ].callback.apply( ractive, args ) === false ) {\n\t\t\t\tstopEvent = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( event && !event._noArg && stopEvent && ( originalEvent = event.original ) ) {\n\t\t\toriginalEvent.preventDefault && originalEvent.preventDefault();\n\t\t\toriginalEvent.stopPropagation && originalEvent.stopPropagation();\n\t\t}\n\n\t\treturn !stopEvent;\n\t}\n\n\tfunction Ractive$fire ( eventName ) {\n\t\tvar args = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t\treturn fireEvent( this, eventName, { args: args });\n\t}\n\n\tfunction badReference ( key ) {\n\t\tthrow new Error( (\"An index or key reference (\" + key + \") cannot have child properties\") );\n\t}\n\n\tfunction resolveAmbiguousReference ( fragment, ref ) {\n\t\tvar localViewmodel = fragment.findContext().root;\n\t\tvar keys = splitKeypathI( ref );\n\t\tvar key = keys[0];\n\n\t\tvar hasContextChain;\n\t\tvar crossedComponentBoundary;\n\t\tvar aliases;\n\n\t\twhile ( fragment ) {\n\t\t\t// repeated fragments\n\t\t\tif ( fragment.isIteration ) {\n\t\t\t\tif ( key === fragment.parent.keyRef ) {\n\t\t\t\t\tif ( keys.length > 1 ) badReference( key );\n\t\t\t\t\treturn fragment.context.getKeyModel( fragment.key );\n\t\t\t\t}\n\n\t\t\t\tif ( key === fragment.parent.indexRef ) {\n\t\t\t\t\tif ( keys.length > 1 ) badReference( key );\n\t\t\t\t\treturn fragment.context.getKeyModel( fragment.index );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// alias node or iteration\n\t\t\tif ( ( ( aliases = fragment.owner.aliases ) || ( aliases = fragment.aliases ) ) && aliases.hasOwnProperty( key ) ) {\n\t\t\t\tvar model = aliases[ key ];\n\n\t\t\t\tif ( keys.length === 1 ) return model;\n\t\t\t\telse if ( typeof model.joinAll === 'function' ) {\n\t\t\t\t\treturn model.joinAll( keys.slice( 1 ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fragment.context ) {\n\t\t\t\t// TODO better encapsulate the component check\n\t\t\t\tif ( !fragment.isRoot || fragment.ractive.component ) hasContextChain = true;\n\n\t\t\t\tif ( fragment.context.has( key ) ) {\n\t\t\t\t\tif ( crossedComponentBoundary ) {\n\t\t\t\t\t\treturn localViewmodel.createLink( key, fragment.context.joinKey( keys.shift() ), key ).joinAll( keys );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fragment.context.joinAll( keys );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fragment.componentParent && !fragment.ractive.isolated ) {\n\t\t\t\t// ascend through component boundary\n\t\t\t\tfragment = fragment.componentParent;\n\t\t\t\tcrossedComponentBoundary = true;\n\t\t\t} else {\n\t\t\t\tfragment = fragment.parent;\n\t\t\t}\n\t\t}\n\n\t\tif ( !hasContextChain ) {\n\t\t\treturn localViewmodel.joinAll( keys );\n\t\t}\n\t}\n\n\tvar stack = [];\n\tvar captureGroup;\n\n\tfunction startCapturing () {\n\t\tstack.push( captureGroup = [] );\n\t}\n\n\tfunction stopCapturing () {\n\t\tvar dependencies = stack.pop();\n\t\tcaptureGroup = stack[ stack.length - 1 ];\n\t\treturn dependencies;\n\t}\n\n\tfunction capture ( model ) {\n\t\tif ( captureGroup ) {\n\t\t\tcaptureGroup.push( model );\n\t\t}\n\t}\n\n\tvar KeyModel = function KeyModel ( key, parent ) {\n\t\tthis.value = key;\n\t\tthis.isReadonly = this.isKey = true;\n\t\tthis.deps = [];\n\t\tthis.links = [];\n\t\tthis.parent = parent;\n\t};\n\n\tKeyModel.prototype.get = function get ( shouldCapture ) {\n\t\tif ( shouldCapture ) capture( this );\n\t\treturn unescapeKey( this.value );\n\t};\n\n\tKeyModel.prototype.getKeypath = function getKeypath () {\n\t\treturn unescapeKey( this.value );\n\t};\n\n\tKeyModel.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar i = this.deps.length;\n\t\twhile ( i-- ) this$1.deps[i].rebinding( next, previous, false );\n\n\t\ti = this.links.length;\n\t\twhile ( i-- ) this$1.links[i].rebinding( next, previous, false );\n\t};\n\n\tKeyModel.prototype.register = function register ( dependant ) {\n\t\tthis.deps.push( dependant );\n\t};\n\n\tKeyModel.prototype.registerLink = function registerLink ( link ) {\n\t\taddToArray( this.links, link );\n\t};\n\n\tKeyModel.prototype.unregister = function unregister ( dependant ) {\n\t\tremoveFromArray( this.deps, dependant );\n\t};\n\n\tKeyModel.prototype.unregisterLink = function unregisterLink ( link ) {\n\t\tremoveFromArray( this.links, link );\n\t};\n\n\tKeyModel.prototype.reference = noop;\n\tKeyModel.prototype.unreference = noop;\n\n\tfunction bind$1               ( x ) { x.bind(); }\n\tfunction cancel             ( x ) { x.cancel(); }\n\tfunction handleChange       ( x ) { x.handleChange(); }\n\tfunction mark               ( x ) { x.mark(); }\n\tfunction marked             ( x ) { x.marked(); }\n\tfunction markedAll          ( x ) { x.markedAll(); }\n\tfunction notifiedUpstream   ( x ) { x.notifiedUpstream(); }\n\tfunction render             ( x ) { x.render(); }\n\tfunction teardown           ( x ) { x.teardown(); }\n\tfunction unbind             ( x ) { x.unbind(); }\n\tfunction unrender           ( x ) { x.unrender(); }\n\tfunction unrenderAndDestroy ( x ) { x.unrender( true ); }\n\tfunction update             ( x ) { x.update(); }\n\tfunction toString$1           ( x ) { return x.toString(); }\n\tfunction toEscapedString    ( x ) { return x.toString( true ); }\n\n\tvar KeypathModel = function KeypathModel ( parent, ractive ) {\n\t\tthis.parent = parent;\n\t\tthis.ractive = ractive;\n\t\tthis.value = ractive ? parent.getKeypath( ractive ) : parent.getKeypath();\n\t\tthis.deps = [];\n\t\tthis.children = {};\n\t\tthis.isReadonly = this.isKeypath = true;\n\t};\n\n\tKeypathModel.prototype.get = function get ( shouldCapture ) {\n\t\tif ( shouldCapture ) capture( this );\n\t\treturn this.value;\n\t};\n\n\tKeypathModel.prototype.getChild = function getChild ( ractive ) {\n\t\tif ( !( ractive._guid in this.children ) ) {\n\t\t\tvar model = new KeypathModel( this.parent, ractive );\n\t\t\tthis.children[ ractive._guid ] = model;\n\t\t\tmodel.owner = this;\n\t\t}\n\t\treturn this.children[ ractive._guid ];\n\t};\n\n\tKeypathModel.prototype.getKeypath = function getKeypath () {\n\t\treturn this.value;\n\t};\n\n\tKeypathModel.prototype.handleChange = function handleChange$1 () {\n\t\tvar this$1 = this;\n\n\t\t\tvar keys = Object.keys( this.children );\n\t\tvar i = keys.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.children[ keys[i] ].handleChange();\n\t\t}\n\n\t\tthis.deps.forEach( handleChange );\n\t};\n\n\tKeypathModel.prototype.rebindChildren = function rebindChildren ( next ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar keys = Object.keys( this.children );\n\t\tvar i = keys.length;\n\t\twhile ( i-- ) {\n\t\t\tvar child = this$1.children[keys[i]];\n\t\t\tchild.value = next.getKeypath( child.ractive );\n\t\t\tchild.handleChange();\n\t\t}\n\t};\n\n\tKeypathModel.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar model = next ? next.getKeypathModel( this.ractive ) : undefined;\n\n\t\tvar keys = Object.keys( this.children );\n\t\tvar i = keys.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.children[ keys[i] ].rebinding( next, previous, false );\n\t\t}\n\n\t\ti = this.deps.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.deps[i].rebinding( model, this$1, false );\n\t\t}\n\t};\n\n\tKeypathModel.prototype.register = function register ( dep ) {\n\t\tthis.deps.push( dep );\n\t};\n\n\tKeypathModel.prototype.removeChild = function removeChild( model ) {\n\t\tif ( model.ractive ) delete this.children[ model.ractive._guid ];\n\t};\n\n\tKeypathModel.prototype.teardown = function teardown () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.owner ) this.owner.removeChild( this );\n\n\t\tvar keys = Object.keys( this.children );\n\t\tvar i = keys.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.children[ keys[i] ].teardown();\n\t\t}\n\t};\n\n\tKeypathModel.prototype.unregister = function unregister ( dep ) {\n\t\tremoveFromArray( this.deps, dep );\n\t\tif ( !this.deps.length ) this.teardown();\n\t};\n\n\tKeypathModel.prototype.reference = noop;\n\tKeypathModel.prototype.unreference = noop;\n\n\tvar hasProp = Object.prototype.hasOwnProperty;\n\n\tvar shuffleTasks = { early: [], mark: [] };\n\tvar registerQueue = { early: [], mark: [] };\n\n\tvar ModelBase = function ModelBase ( parent ) {\n\t\tthis.deps = [];\n\n\t\tthis.children = [];\n\t\tthis.childByKey = {};\n\t\tthis.links = [];\n\n\t\tthis.keyModels = {};\n\n\t\tthis.unresolved = [];\n\t\tthis.unresolvedByKey = {};\n\n\t\tthis.bindings = [];\n\t\tthis.patternObservers = [];\n\n\t\tif ( parent ) {\n\t\t\tthis.parent = parent;\n\t\t\tthis.root = parent.root;\n\t\t}\n\t};\n\n\tModelBase.prototype.addUnresolved = function addUnresolved ( key, resolver ) {\n\t\tif ( !this.unresolvedByKey[ key ] ) {\n\t\t\tthis.unresolved.push( key );\n\t\t\tthis.unresolvedByKey[ key ] = [];\n\t\t}\n\n\t\tthis.unresolvedByKey[ key ].push( resolver );\n\t};\n\n\tModelBase.prototype.addShuffleTask = function addShuffleTask ( task, stage ) { if ( stage === void 0 ) stage = 'early';\n\n\t\tshuffleTasks[stage].push( task ); };\n\tModelBase.prototype.addShuffleRegister = function addShuffleRegister ( item, stage ) { if ( stage === void 0 ) stage = 'early';\n\n\t\tregisterQueue[stage].push({ model: this, item: item }); };\n\n\tModelBase.prototype.clearUnresolveds = function clearUnresolveds ( specificKey ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar i = this.unresolved.length;\n\n\t\twhile ( i-- ) {\n\t\t\tvar key = this$1.unresolved[i];\n\n\t\t\tif ( specificKey && key !== specificKey ) continue;\n\n\t\t\tvar resolvers = this$1.unresolvedByKey[ key ];\n\t\t\tvar hasKey = this$1.has( key );\n\n\t\t\tvar j = resolvers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\tif ( hasKey ) resolvers[j].attemptResolution();\n\t\t\t\tif ( resolvers[j].resolved ) resolvers.splice( j, 1 );\n\t\t\t}\n\n\t\t\tif ( !resolvers.length ) {\n\t\t\t\tthis$1.unresolved.splice( i, 1 );\n\t\t\t\tthis$1.unresolvedByKey[ key ] = null;\n\t\t\t}\n\t\t}\n\t};\n\n\tModelBase.prototype.findMatches = function findMatches ( keys ) {\n\t\tvar len = keys.length;\n\n\t\tvar existingMatches = [ this ];\n\t\tvar matches;\n\t\tvar i;\n\n\t\tvar loop = function (  ) {\n\t\t\tvar key = keys[i];\n\n\t\t\tif ( key === '*' ) {\n\t\t\t\tmatches = [];\n\t\t\t\texistingMatches.forEach( function ( model ) {\n\t\t\t\t\tmatches.push.apply( matches, model.getValueChildren( model.get() ) );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmatches = existingMatches.map( function ( model ) { return model.joinKey( key ); } );\n\t\t\t}\n\n\t\t\texistingMatches = matches;\n\t\t};\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) loop(  );\n\n\t\treturn matches;\n\t};\n\n\tModelBase.prototype.getKeyModel = function getKeyModel ( key, skip ) {\n\t\tif ( key !== undefined && !skip ) return this.parent.getKeyModel( key, true );\n\n\t\tif ( !( key in this.keyModels ) ) this.keyModels[ key ] = new KeyModel( escapeKey( key ), this );\n\n\t\treturn this.keyModels[ key ];\n\t};\n\n\tModelBase.prototype.getKeypath = function getKeypath ( ractive ) {\n\t\tif ( ractive !== this.ractive && this._link ) return this._link.target.getKeypath( ractive );\n\n\t\tif ( !this.keypath ) {\n\t\t\tthis.keypath = this.parent.isRoot ? this.key : (\"\" + (this.parent.getKeypath( ractive )) + \".\" + (escapeKey( this.key )));\n\t\t}\n\n\t\treturn this.keypath;\n\t};\n\n\tModelBase.prototype.getValueChildren = function getValueChildren ( value ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar children;\n\t\tif ( isArray( value ) ) {\n\t\t\tchildren = [];\n\t\t\tif ( 'length' in this && this.length !== value.length ) {\n\t\t\t\tchildren.push( this.joinKey( 'length' ) );\n\t\t\t}\n\t\t\tvalue.forEach( function ( m, i ) {\n\t\t\t\tchildren.push( this$1.joinKey( i ) );\n\t\t\t});\n\t\t}\n\n\t\telse if ( isObject( value ) || typeof value === 'function' ) {\n\t\t\tchildren = Object.keys( value ).map( function ( key ) { return this$1.joinKey( key ); } );\n\t\t}\n\n\t\telse if ( value != null ) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn children;\n\t};\n\n\tModelBase.prototype.getVirtual = function getVirtual ( shouldCapture ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar value = this.get( shouldCapture, { virtual: false } );\n\t\tif ( isObject( value ) ) {\n\t\t\tvar result = isArray( value ) ? [] : {};\n\n\t\t\tvar keys = Object.keys( value );\n\t\t\tvar i = keys.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar child = this$1.childByKey[ keys[i] ];\n\t\t\t\tif ( !child ) result[ keys[i] ] = value[ keys[i] ];\n\t\t\t\telse if ( child._link ) result[ keys[i] ] = child._link.getVirtual();\n\t\t\t\telse result[ keys[i] ] = child.getVirtual();\n\t\t\t}\n\n\t\t\ti = this.children.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar child$1 = this$1.children[i];\n\t\t\t\tif ( !( child$1.key in result ) && child$1._link ) {\n\t\t\t\t\tresult[ child$1.key ] = child$1._link.getVirtual();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} else return value;\n\t};\n\n\tModelBase.prototype.has = function has ( key ) {\n\t\tif ( this._link ) return this._link.has( key );\n\n\t\tvar value = this.get();\n\t\tif ( !value ) return false;\n\n\t\tkey = unescapeKey( key );\n\t\tif ( hasProp.call( value, key ) ) return true;\n\n\t\t// We climb up the constructor chain to find if one of them contains the key\n\t\tvar constructor = value.constructor;\n\t\twhile ( constructor !== Function && constructor !== Array && constructor !== Object ) {\n\t\t\tif ( hasProp.call( constructor.prototype, key ) ) return true;\n\t\t\tconstructor = constructor.constructor;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tModelBase.prototype.joinAll = function joinAll ( keys, opts ) {\n\t\tvar model = this;\n\t\tfor ( var i = 0; i < keys.length; i += 1 ) {\n\t\t\tif ( opts && opts.lastLink === false && i + 1 === keys.length && model.childByKey[keys[i]] && model.childByKey[keys[i]]._link ) return model.childByKey[keys[i]];\n\t\t\tmodel = model.joinKey( keys[i], opts );\n\t\t}\n\n\t\treturn model;\n\t};\n\n\tModelBase.prototype.notifyUpstream = function notifyUpstream () {\n\t\tvar parent = this.parent, path = [ this.key ];\n\t\twhile ( parent ) {\n\t\t\tif ( parent.patternObservers.length ) parent.patternObservers.forEach( function ( o ) { return o.notify( path.slice() ); } );\n\t\t\tpath.unshift( parent.key );\n\t\t\tparent.links.forEach( notifiedUpstream );\n\t\t\tparent.deps.forEach( handleChange );\n\t\t\tparent = parent.parent;\n\t\t}\n\t};\n\n\tModelBase.prototype.rebinding = function rebinding ( next, previous, safe ) {\n\t\t// tell the deps to move to the new target\n\t\tvar this$1 = this;\n\n\t\t\tvar i = this.deps.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( this$1.deps[i].rebinding ) this$1.deps[i].rebinding( next, previous, safe );\n\t\t}\n\n\t\ti = this.links.length;\n\t\twhile ( i-- ) {\n\t\t\tvar link = this$1.links[i];\n\t\t\t// only relink the root of the link tree\n\t\t\tif ( link.owner._link ) link.relinking( next, true, safe );\n\t\t}\n\n\t\ti = this.children.length;\n\t\twhile ( i-- ) {\n\t\t\tvar child = this$1.children[i];\n\t\t\tchild.rebinding( next ? next.joinKey( child.key ) : undefined, child, safe );\n\t\t}\n\n\t\ti = this.unresolved.length;\n\t\twhile ( i-- ) {\n\t\t\tvar unresolved = this$1.unresolvedByKey[ this$1.unresolved[i] ];\n\t\t\tvar c = unresolved.length;\n\t\t\twhile ( c-- ) {\n\t\t\t\tunresolved[c].rebinding( next, previous );\n\t\t\t}\n\t\t}\n\n\t\tif ( this.keypathModel ) this.keypathModel.rebinding( next, previous, false );\n\n\t\ti = this.bindings.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.bindings[i].rebinding( next, previous, safe );\n\t\t}\n\t};\n\n\tModelBase.prototype.reference = function reference () {\n\t\t'refs' in this ? this.refs++ : this.refs = 1;\n\t};\n\n\tModelBase.prototype.register = function register ( dep ) {\n\t\tthis.deps.push( dep );\n\t};\n\n\tModelBase.prototype.registerChange = function registerChange ( key, value ) {\n\t\tif ( !this.isRoot ) {\n\t\t\tthis.root.registerChange( key, value );\n\t\t} else {\n\t\t\tthis.changes[ key ] = value;\n\t\t\trunloop.addInstance( this.root.ractive );\n\t\t}\n\t};\n\n\tModelBase.prototype.registerLink = function registerLink ( link ) {\n\t\taddToArray( this.links, link );\n\t};\n\n\tModelBase.prototype.registerPatternObserver = function registerPatternObserver ( observer ) {\n\t\tthis.patternObservers.push( observer );\n\t\tthis.register( observer );\n\t};\n\n\tModelBase.prototype.registerTwowayBinding = function registerTwowayBinding ( binding ) {\n\t\tthis.bindings.push( binding );\n\t};\n\n\tModelBase.prototype.removeUnresolved = function removeUnresolved ( key, resolver ) {\n\t\tvar resolvers = this.unresolvedByKey[ key ];\n\n\t\tif ( resolvers ) {\n\t\t\tremoveFromArray( resolvers, resolver );\n\t\t}\n\t};\n\n\tModelBase.prototype.shuffled = function shuffled () {\n\t\tvar this$1 = this;\n\n\t\t\tvar i = this.children.length;\n\t\twhile ( i-- ) {\n\t\t\tthis$1.children[i].shuffled();\n\t\t}\n\t\tif ( this.wrapper ) {\n\t\t\tthis.wrapper.teardown();\n\t\t\tthis.wrapper = null;\n\t\t\tthis.rewrap = true;\n\t\t}\n\t};\n\n\tModelBase.prototype.unreference = function unreference () {\n\t\tif ( 'refs' in this ) this.refs--;\n\t};\n\n\tModelBase.prototype.unregister = function unregister ( dep ) {\n\t\tremoveFromArray( this.deps, dep );\n\t};\n\n\tModelBase.prototype.unregisterLink = function unregisterLink ( link ) {\n\t\tremoveFromArray( this.links, link );\n\t};\n\n\tModelBase.prototype.unregisterPatternObserver = function unregisterPatternObserver ( observer ) {\n\t\tremoveFromArray( this.patternObservers, observer );\n\t\tthis.unregister( observer );\n\t};\n\n\tModelBase.prototype.unregisterTwowayBinding = function unregisterTwowayBinding ( binding ) {\n\t\tremoveFromArray( this.bindings, binding );\n\t};\n\n\tModelBase.prototype.updateFromBindings = function updateFromBindings$1 ( cascade ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar i = this.bindings.length;\n\t\twhile ( i-- ) {\n\t\t\tvar value = this$1.bindings[i].getValue();\n\t\t\tif ( value !== this$1.value ) this$1.set( value );\n\t\t}\n\n\t\t// check for one-way bindings if there are no two-ways\n\t\tif ( !this.bindings.length ) {\n\t\t\tvar oneway = findBoundValue( this.deps );\n\t\t\tif ( oneway && oneway.value !== this.value ) this.set( oneway.value );\n\t\t}\n\n\t\tif ( cascade ) {\n\t\t\tthis.children.forEach( updateFromBindings );\n\t\t\tthis.links.forEach( updateFromBindings );\n\t\t\tif ( this._link ) this._link.updateFromBindings( cascade );\n\t\t}\n\t};\n\n\tfunction updateFromBindings ( model ) {\n\t\tmodel.updateFromBindings( true );\n\t}\n\n\tfunction findBoundValue( list ) {\n\t\tvar i = list.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( list[i].bound ) {\n\t\t\t\tvar owner = list[i].owner;\n\t\t\t\tif ( owner ) {\n\t\t\t\t\tvar value = owner.name === 'checked' ?\n\t\t\t\t\t\towner.node.checked :\n\t\t\t\t\t\towner.node.value;\n\t\t\t\t\treturn { value: value };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction fireShuffleTasks ( stage ) {\n\t\tif ( !stage ) {\n\t\t\tfireShuffleTasks( 'early' );\n\t\t\tfireShuffleTasks( 'mark' );\n\t\t} else {\n\t\t\tvar tasks = shuffleTasks[stage];\n\t\t\tshuffleTasks[stage] = [];\n\t\t\tvar i = tasks.length;\n\t\t\twhile ( i-- ) tasks[i]();\n\n\t\t\tvar register = registerQueue[stage];\n\t\t\tregisterQueue[stage] = [];\n\t\t\ti = register.length;\n\t\t\twhile ( i-- ) register[i].model.register( register[i].item );\n\t\t}\n\t}\n\n\tKeyModel.prototype.addShuffleTask = ModelBase.prototype.addShuffleTask;\n\tKeyModel.prototype.addShuffleRegister = ModelBase.prototype.addShuffleRegister;\n\tKeypathModel.prototype.addShuffleTask = ModelBase.prototype.addShuffleTask;\n\tKeypathModel.prototype.addShuffleRegister = ModelBase.prototype.addShuffleRegister;\n\n\t// this is the dry method of checking to see if a rebind applies to\n\t// a particular keypath because in some cases, a dep may be bound\n\t// directly to a particular keypath e.g. foo.bars.0.baz and need\n\t// to avoid getting kicked to foo.bars.1.baz if foo.bars is unshifted\n\tfunction rebindMatch ( template, next, previous ) {\n\t\tvar keypath = template.r || template;\n\n\t\t// no valid keypath, go with next\n\t\tif ( !keypath || typeof keypath !== 'string' ) return next;\n\n\t\t// completely contextual ref, go with next\n\t\tif ( keypath === '.' || keypath[0] === '@' || (next || previous).isKey || (next || previous).isKeypath ) return next;\n\n\t\tvar parts = keypath.split( '/' );\n\t\tvar keys = splitKeypathI( parts[ parts.length - 1 ] );\n\n\t\t// check the keypath against the model keypath to see if it matches\n\t\tvar model = next || previous;\n\t\tvar i = keys.length;\n\t\tvar match = true, shuffling = false;\n\n\t\twhile ( model && i-- ) {\n\t\t\tif ( model.shuffling ) shuffling = true;\n\t\t\t// non-strict comparison to account for indices in keypaths\n\t\t\tif ( keys[i] != model.key ) match = false;\n\t\t\tmodel = model.parent;\n\t\t}\n\n\t\t// next is undefined, but keypath is shuffling and previous matches\n\t\tif ( !next && match && shuffling ) return previous;\n\t\t// next is defined, but doesn't match the keypath\n\t\telse if ( next && !match && shuffling ) return previous;\n\t\telse return next;\n\t}\n\n\tvar LinkModel = (function (ModelBase) {\n\t\tfunction LinkModel ( parent, owner, target, key ) {\n\t\t\tModelBase.call( this, parent );\n\n\t\t\tthis.owner = owner;\n\t\t\tthis.target = target;\n\t\t\tthis.key = key === undefined ? owner.key : key;\n\t\t\tif ( owner.isLink ) this.sourcePath = \"\" + (owner.sourcePath) + \".\" + (this.key);\n\n\t\t\ttarget.registerLink( this );\n\n\t\t\tthis.isReadonly = parent.isReadonly;\n\n\t\t\tthis.isLink = true;\n\t\t}\n\n\t\tLinkModel.prototype = Object.create( ModelBase && ModelBase.prototype );\n\t\tLinkModel.prototype.constructor = LinkModel;\n\n\t\tLinkModel.prototype.animate = function animate ( from, to, options, interpolator ) {\n\t\t\treturn this.target.animate( from, to, options, interpolator );\n\t\t};\n\n\t\tLinkModel.prototype.applyValue = function applyValue ( value ) {\n\t\t\tthis.target.applyValue( value );\n\t\t};\n\n\t\tLinkModel.prototype.get = function get ( shouldCapture, opts ) {\n\t\t\tif ( shouldCapture ) {\n\t\t\t\tcapture( this );\n\n\t\t\t\t// may need to tell the target to unwrap\n\t\t\t\topts = opts || {};\n\t\t\t\topts.unwrap = true;\n\t\t\t}\n\n\t\t\treturn this.target.get( false, opts );\n\t\t};\n\n\t\tLinkModel.prototype.getKeypath = function getKeypath ( ractive ) {\n\t\t\tif ( ractive && ractive !== this.root.ractive ) return this.target.getKeypath( ractive );\n\n\t\t\treturn ModelBase.prototype.getKeypath.call( this, ractive );\n\t\t};\n\n\t\tLinkModel.prototype.getKeypathModel = function getKeypathModel ( ractive ) {\n\t\t\tif ( !this.keypathModel ) this.keypathModel = new KeypathModel( this );\n\t\t\tif ( ractive && ractive !== this.root.ractive ) return this.keypathModel.getChild( ractive );\n\t\t\treturn this.keypathModel;\n\t\t};\n\n\t\tLinkModel.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.links.forEach( handleChange );\n\t\t\tthis.notifyUpstream();\n\t\t};\n\n\t\tLinkModel.prototype.joinKey = function joinKey ( key ) {\n\t\t\t// TODO: handle nested links\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new LinkModel( this, this, this.target.joinKey( key ), key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tLinkModel.prototype.mark = function mark () {\n\t\t\tthis.target.mark();\n\t\t};\n\n\t\tLinkModel.prototype.marked = function marked$1 () {\n\t\t\tthis.links.forEach( marked );\n\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.clearUnresolveds();\n\t\t};\n\n\t\tLinkModel.prototype.markedAll = function markedAll$1 () {\n\t\t\tthis.children.forEach( markedAll );\n\t\t\tthis.marked();\n\t\t};\n\n\t\tLinkModel.prototype.notifiedUpstream = function notifiedUpstream$1 () {\n\t\t\tthis.links.forEach( notifiedUpstream );\n\t\t\tthis.deps.forEach( handleChange );\n\t\t};\n\n\t\tLinkModel.prototype.relinked = function relinked () {\n\t\t\tthis.target.registerLink( this );\n\t\t\tthis.children.forEach( function ( c ) { return c.relinked(); } );\n\t\t};\n\n\t\tLinkModel.prototype.relinking = function relinking ( target, root, safe ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( root && this.sourcePath ) target = rebindMatch( this.sourcePath, target, this.target );\n\t\t\tif ( !target || this.target === target ) return;\n\n\t\t\tthis.target.unregisterLink( this );\n\t\t\tif ( this.keypathModel ) this.keypathModel.rebindChildren( target );\n\n\t\t\tthis.target = target;\n\t\t\tthis.children.forEach( function ( c ) {\n\t\t\t\tc.relinking( target.joinKey( c.key ), false, safe );\n\t\t\t});\n\n\t\t\tif ( root ) this.addShuffleTask( function () {\n\t\t\t\tthis$1.relinked();\n\t\t\t\tif ( !safe ) this$1.notifyUpstream();\n\t\t\t});\n\t\t};\n\n\t\tLinkModel.prototype.set = function set ( value ) {\n\t\t\tthis.target.set( value );\n\t\t};\n\n\t\tLinkModel.prototype.shuffle = function shuffle ( newIndices ) {\n\t\t\t// watch for extra shuffles caused by a shuffle in a downstream link\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( this.shuffling ) return;\n\n\t\t\t// let the real model handle firing off shuffles\n\t\t\tif ( !this.target.shuffling ) {\n\t\t\t\tthis.target.shuffle( newIndices );\n\t\t\t} else {\n\t\t\t\tthis.shuffling = true;\n\n\t\t\t\tvar i = newIndices.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tvar idx = newIndices[ i ];\n\t\t\t\t\t// nothing is actually changing, so move in the index and roll on\n\t\t\t\t\tif ( i === idx ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// rebind the children on i to idx\n\t\t\t\t\tif ( i in this$1.childByKey ) this$1.childByKey[ i ].rebinding( !~idx ? undefined : this$1.joinKey( idx ), this$1.childByKey[ i ], true );\n\n\t\t\t\t\tif ( !~idx && this$1.keyModels[ i ] ) {\n\t\t\t\t\t\tthis$1.keyModels[i].rebinding( undefined, this$1.keyModels[i], false );\n\t\t\t\t\t} else if ( ~idx && this$1.keyModels[ i ] ) {\n\t\t\t\t\t\tif ( !this$1.keyModels[ idx ] ) this$1.childByKey[ idx ].getKeyModel( idx );\n\t\t\t\t\t\tthis$1.keyModels[i].rebinding( this$1.keyModels[ idx ], this$1.keyModels[i], false );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar upstream = this.source().length !== this.source().value.length;\n\n\t\t\t\tthis.links.forEach( function ( l ) { return l.shuffle( newIndices ); } );\n\n\t\t\t\ti = this.deps.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( this$1.deps[i].shuffle ) this$1.deps[i].shuffle( newIndices );\n\t\t\t\t}\n\n\t\t\t\tthis.marked();\n\n\t\t\t\tif ( upstream ) this.notifyUpstream();\n\n\t\t\t\tthis.shuffling = false;\n\t\t\t}\n\n\t\t};\n\n\t\tLinkModel.prototype.source = function source () {\n\t\t\tif ( this.target.source ) return this.target.source();\n\t\t\telse return this.target;\n\t\t};\n\n\t\tLinkModel.prototype.teardown = function teardown$1 () {\n\t\t\tif ( this._link ) this._link.teardown();\n\t\t\tthis.target.unregisterLink( this );\n\t\t\tthis.children.forEach( teardown );\n\t\t};\n\n\t\treturn LinkModel;\n\t}(ModelBase));\n\n\tModelBase.prototype.link = function link ( model, keypath ) {\n\t\tvar lnk = this._link || new LinkModel( this.parent, this, model, this.key );\n\t\tlnk.sourcePath = keypath;\n\t\tif ( this._link ) this._link.relinking( model, true, false );\n\t\tthis.rebinding( lnk, this, false );\n\t\tfireShuffleTasks();\n\n\t\tvar unresolved = !this._link;\n\t\tthis._link = lnk;\n\t\tif ( unresolved ) this.parent.clearUnresolveds();\n\t\tlnk.markedAll();\n\t\treturn lnk;\n\t};\n\n\tModelBase.prototype.unlink = function unlink () {\n\t\tif ( this._link ) {\n\t\t\tvar ln = this._link;\n\t\t\tthis._link = undefined;\n\t\t\tln.rebinding( this, this._link );\n\t\t\tfireShuffleTasks();\n\t\t\tln.teardown();\n\t\t}\n\t};\n\n\tvar requestAnimationFrame;\n\n\t// If window doesn't exist, we don't need requestAnimationFrame\n\tif ( !win ) {\n\t\trequestAnimationFrame = null;\n\t} else {\n\t\t// https://gist.github.com/paulirish/1579671\n\t\t(function(vendors, lastTime, win) {\n\n\t\t\tvar x, setTimeout;\n\n\t\t\tif ( win.requestAnimationFrame ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( x = 0; x < vendors.length && !win.requestAnimationFrame; ++x ) {\n\t\t\t\twin.requestAnimationFrame = win[vendors[x]+'RequestAnimationFrame'];\n\t\t\t}\n\n\t\t\tif ( !win.requestAnimationFrame ) {\n\t\t\t\tsetTimeout = win.setTimeout;\n\n\t\t\t\twin.requestAnimationFrame = function(callback) {\n\t\t\t\t\tvar currTime, timeToCall, id;\n\n\t\t\t\t\tcurrTime = Date.now();\n\t\t\t\t\ttimeToCall = Math.max( 0, 16 - (currTime - lastTime ) );\n\t\t\t\t\tid = setTimeout( function() { callback(currTime + timeToCall); }, timeToCall );\n\n\t\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\t\treturn id;\n\t\t\t\t};\n\t\t\t}\n\n\t\t}( vendors, 0, win ));\n\n\t\trequestAnimationFrame = win.requestAnimationFrame;\n\t}\n\n\tvar rAF = requestAnimationFrame;\n\n\tvar getTime = ( win && win.performance && typeof win.performance.now === 'function' ) ?\n\t\tfunction () { return win.performance.now(); } :\n\t\tfunction () { return Date.now(); };\n\n\t// TODO what happens if a transition is aborted?\n\n\tvar tickers = [];\n\tvar running = false;\n\n\tfunction tick () {\n\t\trunloop.start();\n\n\t\tvar now = getTime();\n\n\t\tvar i;\n\t\tvar ticker;\n\n\t\tfor ( i = 0; i < tickers.length; i += 1 ) {\n\t\t\tticker = tickers[i];\n\n\t\t\tif ( !ticker.tick( now ) ) {\n\t\t\t\t// ticker is complete, remove it from the stack, and decrement i so we don't miss one\n\t\t\t\ttickers.splice( i--, 1 );\n\t\t\t}\n\t\t}\n\n\t\trunloop.end();\n\n\t\tif ( tickers.length ) {\n\t\t\trAF( tick );\n\t\t} else {\n\t\t\trunning = false;\n\t\t}\n\t}\n\n\tvar Ticker = function Ticker ( options ) {\n\t\tthis.duration = options.duration;\n\t\tthis.step = options.step;\n\t\tthis.complete = options.complete;\n\t\tthis.easing = options.easing;\n\n\t\tthis.start = getTime();\n\t\tthis.end = this.start + this.duration;\n\n\t\tthis.running = true;\n\n\t\ttickers.push( this );\n\t\tif ( !running ) rAF( tick );\n\t};\n\n\tTicker.prototype.tick = function tick$1 ( now ) {\n\t\tif ( !this.running ) return false;\n\n\t\tif ( now > this.end ) {\n\t\t\tif ( this.step ) this.step( 1 );\n\t\t\tif ( this.complete ) this.complete( 1 );\n\n\t\t\treturn false;\n\t\t}\n\n\t\tvar elapsed = now - this.start;\n\t\tvar eased = this.easing( elapsed / this.duration );\n\n\t\tif ( this.step ) this.step( eased );\n\n\t\treturn true;\n\t};\n\n\tTicker.prototype.stop = function stop () {\n\t\tif ( this.abort ) this.abort();\n\t\tthis.running = false;\n\t};\n\n\tvar prefixers = {};\n\n\t// TODO this is legacy. sooner we can replace the old adaptor API the better\n\tfunction prefixKeypath ( obj, prefix ) {\n\t\tvar prefixed = {}, key;\n\n\t\tif ( !prefix ) {\n\t\t\treturn obj;\n\t\t}\n\n\t\tprefix += '.';\n\n\t\tfor ( key in obj ) {\n\t\t\tif ( obj.hasOwnProperty( key ) ) {\n\t\t\t\tprefixed[ prefix + key ] = obj[ key ];\n\t\t\t}\n\t\t}\n\n\t\treturn prefixed;\n\t}\n\n\tfunction getPrefixer ( rootKeypath ) {\n\t\tvar rootDot;\n\n\t\tif ( !prefixers[ rootKeypath ] ) {\n\t\t\trootDot = rootKeypath ? rootKeypath + '.' : '';\n\n\t\t\tprefixers[ rootKeypath ] = function ( relativeKeypath, value ) {\n\t\t\t\tvar obj;\n\n\t\t\t\tif ( typeof relativeKeypath === 'string' ) {\n\t\t\t\t\tobj = {};\n\t\t\t\t\tobj[ rootDot + relativeKeypath ] = value;\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\n\t\t\t\tif ( typeof relativeKeypath === 'object' ) {\n\t\t\t\t\t// 'relativeKeypath' is in fact a hash, not a keypath\n\t\t\t\t\treturn rootDot ? prefixKeypath( relativeKeypath, rootKeypath ) : relativeKeypath;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\treturn prefixers[ rootKeypath ];\n\t}\n\n\tvar Model = (function (ModelBase) {\n\t\tfunction Model ( parent, key ) {\n\t\t\tModelBase.call( this, parent );\n\n\t\t\tthis.ticker = null;\n\n\t\t\tif ( parent ) {\n\t\t\t\tthis.key = unescapeKey( key );\n\t\t\t\tthis.isReadonly = parent.isReadonly;\n\n\t\t\t\tif ( parent.value ) {\n\t\t\t\t\tthis.value = parent.value[ this.key ];\n\t\t\t\t\tif ( isArray( this.value ) ) this.length = this.value.length;\n\t\t\t\t\tthis.adapt();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tModel.prototype = Object.create( ModelBase && ModelBase.prototype );\n\t\tModel.prototype.constructor = Model;\n\n\t\tModel.prototype.adapt = function adapt () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar adaptors = this.root.adaptors;\n\t\t\tvar len = adaptors.length;\n\n\t\t\tthis.rewrap = false;\n\n\t\t\t// Exit early if no adaptors\n\t\t\tif ( len === 0 ) return;\n\n\t\t\tvar value = this.wrapper ? ( 'newWrapperValue' in this ? this.newWrapperValue : this.wrapperValue ) : this.value;\n\n\t\t\t// TODO remove this legacy nonsense\n\t\t\tvar ractive = this.root.ractive;\n\t\t\tvar keypath = this.getKeypath();\n\n\t\t\t// tear previous adaptor down if present\n\t\t\tif ( this.wrapper ) {\n\t\t\t\tvar shouldTeardown = this.wrapperValue === value ? false : !this.wrapper.reset || this.wrapper.reset( value ) === false;\n\n\t\t\t\tif ( shouldTeardown ) {\n\t\t\t\t\tthis.wrapper.teardown();\n\t\t\t\t\tthis.wrapper = null;\n\n\t\t\t\t\t// don't branch for undefined values\n\t\t\t\t\tif ( this.value !== undefined ) {\n\t\t\t\t\t\tvar parentValue = this.parent.value || this.parent.createBranch( this.key );\n\t\t\t\t\t\tif ( parentValue[ this.key ] !== value ) parentValue[ this.key ] = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdelete this.newWrapperValue;\n\t\t\t\t\tthis.wrapperValue = value;\n\t\t\t\t\tthis.value = this.wrapper.get();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar i;\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar adaptor = adaptors[i];\n\t\t\t\tif ( adaptor.filter( value, keypath, ractive ) ) {\n\t\t\t\t\tthis$1.wrapper = adaptor.wrap( ractive, value, keypath, getPrefixer( keypath ) );\n\t\t\t\t\tthis$1.wrapperValue = value;\n\t\t\t\t\tthis$1.wrapper.__model = this$1; // massive temporary hack to enable array adaptor\n\n\t\t\t\t\tthis$1.value = this$1.wrapper.get();\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tModel.prototype.animate = function animate ( from, to, options, interpolator ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( this.ticker ) this.ticker.stop();\n\n\t\t\tvar fulfilPromise;\n\t\t\tvar promise = new Promise$1( function ( fulfil ) { return fulfilPromise = fulfil; } );\n\n\t\t\tthis.ticker = new Ticker({\n\t\t\t\tduration: options.duration,\n\t\t\t\teasing: options.easing,\n\t\t\t\tstep: function ( t ) {\n\t\t\t\t\tvar value = interpolator( t );\n\t\t\t\t\tthis$1.applyValue( value );\n\t\t\t\t\tif ( options.step ) options.step( t, value );\n\t\t\t\t},\n\t\t\t\tcomplete: function () {\n\t\t\t\t\tthis$1.applyValue( to );\n\t\t\t\t\tif ( options.complete ) options.complete( to );\n\n\t\t\t\t\tthis$1.ticker = null;\n\t\t\t\t\tfulfilPromise();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpromise.stop = this.ticker.stop;\n\t\t\treturn promise;\n\t\t};\n\n\t\tModel.prototype.applyValue = function applyValue ( value ) {\n\t\t\tif ( isEqual( value, this.value ) ) return;\n\n\t\t\t// TODO deprecate this nonsense\n\t\t\tthis.registerChange( this.getKeypath(), value );\n\n\t\t\tif ( this.parent.wrapper && this.parent.wrapper.set ) {\n\t\t\t\tthis.parent.wrapper.set( this.key, value );\n\t\t\t\tthis.parent.value = this.parent.wrapper.get();\n\n\t\t\t\tthis.value = this.parent.value[ this.key ];\n\t\t\t\tif ( this.wrapper ) this.newWrapperValue = this.value;\n\t\t\t\tthis.adapt();\n\t\t\t} else if ( this.wrapper ) {\n\t\t\t\tthis.newWrapperValue = value;\n\t\t\t\tthis.adapt();\n\t\t\t} else {\n\t\t\t\tvar parentValue = this.parent.value || this.parent.createBranch( this.key );\n\t\t\t\tparentValue[ this.key ] = value;\n\n\t\t\t\tthis.value = value;\n\t\t\t\tthis.adapt();\n\t\t\t}\n\n\t\t\tthis.parent.clearUnresolveds();\n\t\t\tthis.clearUnresolveds();\n\n\t\t\t// keep track of array stuff\n\t\t\tif ( isArray( value ) ) {\n\t\t\t\tthis.length = value.length;\n\t\t\t\tthis.isArray = true;\n\t\t\t} else {\n\t\t\t\tthis.isArray = false;\n\t\t\t}\n\n\t\t\t// notify dependants\n\t\t\tthis.links.forEach( handleChange );\n\t\t\tthis.children.forEach( mark );\n\t\t\tthis.deps.forEach( handleChange );\n\n\t\t\tthis.notifyUpstream();\n\n\t\t\tif ( this.parent.isArray ) {\n\t\t\t\tif ( this.key === 'length' ) this.parent.length = value;\n\t\t\t\telse this.parent.joinKey( 'length' ).mark();\n\t\t\t}\n\t\t};\n\n\t\tModel.prototype.createBranch = function createBranch ( key ) {\n\t\t\tvar branch = isNumeric( key ) ? [] : {};\n\t\t\tthis.set( branch );\n\n\t\t\treturn branch;\n\t\t};\n\n\t\tModel.prototype.get = function get ( shouldCapture, opts ) {\n\t\t\tif ( this._link ) return this._link.get( shouldCapture, opts );\n\t\t\tif ( shouldCapture ) capture( this );\n\t\t\t// if capturing, this value needs to be unwrapped because it's for external use\n\t\t\tif ( opts && opts.virtual ) return this.getVirtual( false );\n\t\t\treturn ( shouldCapture || ( opts && opts.unwrap ) ) && this.wrapper ? this.wrapperValue : this.value;\n\t\t};\n\n\t\tModel.prototype.getKeypathModel = function getKeypathModel ( ractive ) {\n\t\t\tif ( !this.keypathModel ) this.keypathModel = new KeypathModel( this );\n\t\t\treturn this.keypathModel;\n\t\t};\n\n\t\tModel.prototype.joinKey = function joinKey ( key, opts ) {\n\t\t\tif ( this._link ) {\n\t\t\t\tif ( opts && !opts.lastLink === false && ( key === undefined || key === '' ) ) return this;\n\t\t\t\treturn this._link.joinKey( key );\n\t\t\t}\n\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new Model( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\tif ( this.childByKey[ key ]._link ) return this.childByKey[ key ]._link;\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tModel.prototype.mark = function mark$1 () {\n\t\t\tif ( this._link ) return this._link.mark();\n\n\t\t\tvar value = this.retrieve();\n\n\t\t\tif ( !isEqual( value, this.value ) ) {\n\t\t\t\tvar old = this.value;\n\t\t\t\tthis.value = value;\n\n\t\t\t\t// make sure the wrapper stays in sync\n\t\t\t\tif ( old !== value || this.rewrap ) {\n\t\t\t\t\tif ( this.wrapper ) this.newWrapperValue = value;\n\t\t\t\t\tthis.adapt();\n\t\t\t\t}\n\n\t\t\t\t// keep track of array stuff\n\t\t\t\tif ( isArray( value ) ) {\n\t\t\t\t\tthis.length = value.length;\n\t\t\t\t\tthis.isArray = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.isArray = false;\n\t\t\t\t}\n\n\t\t\t\tthis.children.forEach( mark );\n\t\t\t\tthis.links.forEach( marked );\n\n\t\t\t\tthis.deps.forEach( handleChange );\n\t\t\t\tthis.clearUnresolveds();\n\t\t\t}\n\t\t};\n\n\t\tModel.prototype.merge = function merge ( array, comparator ) {\n\t\t\tvar oldArray = this.value, newArray = array;\n\t\t\tif ( oldArray === newArray ) oldArray = recreateArray( this );\n\t\t\tif ( comparator ) {\n\t\t\t\toldArray = oldArray.map( comparator );\n\t\t\t\tnewArray = newArray.map( comparator );\n\t\t\t}\n\n\t\t\tvar oldLength = oldArray.length;\n\n\t\t\tvar usedIndices = {};\n\t\t\tvar firstUnusedIndex = 0;\n\n\t\t\tvar newIndices = oldArray.map( function ( item ) {\n\t\t\t\tvar index;\n\t\t\t\tvar start = firstUnusedIndex;\n\n\t\t\t\tdo {\n\t\t\t\t\tindex = newArray.indexOf( item, start );\n\n\t\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\n\t\t\t\t\tstart = index + 1;\n\t\t\t\t} while ( ( usedIndices[ index ] === true ) && start < oldLength );\n\n\t\t\t\t// keep track of the first unused index, so we don't search\n\t\t\t\t// the whole of newArray for each item in oldArray unnecessarily\n\t\t\t\tif ( index === firstUnusedIndex ) {\n\t\t\t\t\tfirstUnusedIndex += 1;\n\t\t\t\t}\n\t\t\t\t// allow next instance of next \"equal\" to be found item\n\t\t\t\tusedIndices[ index ] = true;\n\t\t\t\treturn index;\n\t\t\t});\n\n\t\t\tthis.parent.value[ this.key ] = array;\n\t\t\tthis.shuffle( newIndices );\n\t\t};\n\n\t\tModel.prototype.retrieve = function retrieve () {\n\t\t\treturn this.parent.value ? this.parent.value[ this.key ] : undefined;\n\t\t};\n\n\t\tModel.prototype.set = function set ( value ) {\n\t\t\tif ( this.ticker ) this.ticker.stop();\n\t\t\tthis.applyValue( value );\n\t\t};\n\n\t\tModel.prototype.shuffle = function shuffle ( newIndices ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.shuffling = true;\n\t\t\tvar i = newIndices.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar idx = newIndices[ i ];\n\t\t\t\t// nothing is actually changing, so move in the index and roll on\n\t\t\t\tif ( i === idx ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// rebind the children on i to idx\n\t\t\t\tif ( i in this$1.childByKey ) this$1.childByKey[ i ].rebinding( !~idx ? undefined : this$1.joinKey( idx ), this$1.childByKey[ i ], true );\n\n\t\t\t\tif ( !~idx && this$1.keyModels[ i ] ) {\n\t\t\t\t\tthis$1.keyModels[i].rebinding( undefined, this$1.keyModels[i], false );\n\t\t\t\t} else if ( ~idx && this$1.keyModels[ i ] ) {\n\t\t\t\t\tif ( !this$1.keyModels[ idx ] ) this$1.childByKey[ idx ].getKeyModel( idx );\n\t\t\t\t\tthis$1.keyModels[i].rebinding( this$1.keyModels[ idx ], this$1.keyModels[i], false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar upstream = this.length !== this.value.length;\n\n\t\t\tthis.links.forEach( function ( l ) { return l.shuffle( newIndices ); } );\n\t\t\tfireShuffleTasks( 'early' );\n\n\t\t\ti = this.deps.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( this$1.deps[i].shuffle ) this$1.deps[i].shuffle( newIndices );\n\t\t\t}\n\n\t\t\tthis.mark();\n\t\t\tfireShuffleTasks( 'mark' );\n\n\t\t\tif ( upstream ) this.notifyUpstream();\n\t\t\tthis.shuffling = false;\n\t\t};\n\n\t\tModel.prototype.teardown = function teardown$1 () {\n\t\t\tif ( this._link ) this._link.teardown();\n\t\t\tthis.children.forEach( teardown );\n\t\t\tif ( this.wrapper ) this.wrapper.teardown();\n\t\t\tif ( this.keypathModel ) this.keypathModel.teardown();\n\t\t};\n\n\t\treturn Model;\n\t}(ModelBase));\n\n\tfunction recreateArray( model ) {\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < model.length; i++ ) {\n\t\t\tarray[ i ] = (model.childByKey[i] || {}).value;\n\t\t}\n\n\t\treturn array;\n\t}\n\n\tvar GlobalModel = (function (Model) {\n\t\tfunction GlobalModel ( ) {\n\t\t\tModel.call( this, null, '@global' );\n\t\t\tthis.value = typeof global !== 'undefined' ? global : window;\n\t\t\tthis.isRoot = true;\n\t\t\tthis.root = this;\n\t\t\tthis.adaptors = [];\n\t\t}\n\n\t\tGlobalModel.prototype = Object.create( Model && Model.prototype );\n\t\tGlobalModel.prototype.constructor = GlobalModel;\n\n\t\tGlobalModel.prototype.getKeypath = function getKeypath() {\n\t\t\treturn '@global';\n\t\t};\n\n\t\t// global model doesn't contribute changes events because it has no instance\n\t\tGlobalModel.prototype.registerChange = function registerChange () {};\n\n\t\treturn GlobalModel;\n\t}(Model));\n\n\tvar GlobalModel$1 = new GlobalModel();\n\n\tvar keypathExpr = /^@[^\\(]+\\(([^\\)]+)\\)/;\n\n\tfunction resolveReference ( fragment, ref ) {\n\t\tvar context = fragment.findContext();\n\n\t\t// special references\n\t\t// TODO does `this` become `.` at parse time?\n\t\tif ( ref === '.' || ref === 'this' ) return context;\n\t\tif ( ref.indexOf( '@keypath' ) === 0 ) {\n\t\t\tvar match = keypathExpr.exec( ref );\n\t\t\tif ( match && match[1] ) {\n\t\t\t\tvar model = resolveReference( fragment, match[1] );\n\t\t\t\tif ( model ) return model.getKeypathModel();\n\t\t\t}\n\t\t\treturn context.getKeypathModel();\n\t\t}\n\t\tif ( ref.indexOf( '@rootpath' ) === 0 ) {\n\t\t\t// check to see if this is an empty component root\n\t\t\twhile ( context.isRoot && context.ractive.component ) {\n\t\t\t\tcontext = context.ractive.component.parentFragment.findContext();\n\t\t\t}\n\n\t\t\tvar match$1 = keypathExpr.exec( ref );\n\t\t\tif ( match$1 && match$1[1] ) {\n\t\t\t\tvar model$1 = resolveReference( fragment, match$1[1] );\n\t\t\t\tif ( model$1 ) return model$1.getKeypathModel( fragment.ractive.root );\n\t\t\t}\n\t\t\treturn context.getKeypathModel( fragment.ractive.root );\n\t\t}\n\t\tif ( ref === '@index' || ref === '@key' ) {\n\t\t\tvar repeater = fragment.findRepeatingFragment();\n\t\t\t// make sure the found fragment is actually an iteration\n\t\t\tif ( !repeater.isIteration ) return;\n\t\t\treturn repeater.context.getKeyModel( repeater[ ref[1] === 'i' ? 'index' : 'key' ] );\n\t\t}\n\t\tif ( ref === '@this' ) {\n\t\t\treturn fragment.ractive.viewmodel.getRactiveModel();\n\t\t}\n\t\tif ( ref === '@global' ) {\n\t\t\treturn GlobalModel$1;\n\t\t}\n\n\t\t// ancestor references\n\t\tif ( ref[0] === '~' ) return fragment.ractive.viewmodel.joinAll( splitKeypathI( ref.slice( 2 ) ) );\n\t\tif ( ref[0] === '.' ) {\n\t\t\tvar parts = ref.split( '/' );\n\n\t\t\twhile ( parts[0] === '.' || parts[0] === '..' ) {\n\t\t\t\tvar part = parts.shift();\n\n\t\t\t\tif ( part === '..' ) {\n\t\t\t\t\tcontext = context.parent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tref = parts.join( '/' );\n\n\t\t\t// special case - `{{.foo}}` means the same as `{{./foo}}`\n\t\t\tif ( ref[0] === '.' ) ref = ref.slice( 1 );\n\t\t\treturn context.joinAll( splitKeypathI( ref ) );\n\t\t}\n\n\t\treturn resolveAmbiguousReference( fragment, ref );\n\t}\n\n\tfunction Ractive$get ( keypath, opts ) {\n\t\tif ( typeof keypath !== 'string' ) return this.viewmodel.get( true, keypath );\n\n\t\tvar keys = splitKeypathI( keypath );\n\t\tvar key = keys[0];\n\n\t\tvar model;\n\n\t\tif ( !this.viewmodel.has( key ) ) {\n\t\t\t// if this is an inline component, we may need to create\n\t\t\t// an implicit mapping\n\t\t\tif ( this.component && !this.isolated ) {\n\t\t\t\tmodel = resolveReference( this.component.parentFragment, key );\n\n\t\t\t\tif ( model ) {\n\t\t\t\t\tthis.viewmodel.map( key, model );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmodel = this.viewmodel.joinAll( keys );\n\t\treturn model.get( true, opts );\n\t}\n\n\tfunction gatherRefs( fragment ) {\n\t\tvar key = {}, index = {};\n\n\t\t// walk up the template gather refs as we go\n\t\twhile ( fragment ) {\n\t\t\tif ( fragment.parent && ( fragment.parent.indexRef || fragment.parent.keyRef ) ) {\n\t\t\t\tvar ref = fragment.parent.indexRef;\n\t\t\t\tif ( ref && !( ref in index ) ) index[ref] = fragment.index;\n\t\t\t\tref = fragment.parent.keyRef;\n\t\t\t\tif ( ref && !( ref in key ) ) key[ref] = fragment.key;\n\t\t\t}\n\n\t\t\tif ( fragment.componentParent && !fragment.ractive.isolated ) {\n\t\t\t\tfragment = fragment.componentParent;\n\t\t\t} else {\n\t\t\t\tfragment = fragment.parent;\n\t\t\t}\n\t\t}\n\n\t\treturn { key: key, index: index };\n\t}\n\n\t// This function takes an array, the name of a mutator method, and the\n\t// arguments to call that mutator method with, and returns an array that\n\t// maps the old indices to their new indices.\n\n\t// So if you had something like this...\n\t//\n\t//     array = [ 'a', 'b', 'c', 'd' ];\n\t//     array.push( 'e' );\n\t//\n\t// ...you'd get `[ 0, 1, 2, 3 ]` - in other words, none of the old indices\n\t// have changed. If you then did this...\n\t//\n\t//     array.unshift( 'z' );\n\t//\n\t// ...the indices would be `[ 1, 2, 3, 4, 5 ]` - every item has been moved\n\t// one higher to make room for the 'z'. If you removed an item, the new index\n\t// would be -1...\n\t//\n\t//     array.splice( 2, 2 );\n\t//\n\t// ...this would result in [ 0, 1, -1, -1, 2, 3 ].\n\t//\n\t// This information is used to enable fast, non-destructive shuffling of list\n\t// sections when you do e.g. `ractive.splice( 'items', 2, 2 );\n\n\tfunction getNewIndices ( length, methodName, args ) {\n\t\tvar spliceArguments, newIndices = [], removeStart, removeEnd, balance, i;\n\n\t\tspliceArguments = getSpliceEquivalent( length, methodName, args );\n\n\t\tif ( !spliceArguments ) {\n\t\t\treturn null; // TODO support reverse and sort?\n\t\t}\n\n\t\tbalance = ( spliceArguments.length - 2 ) - spliceArguments[1];\n\n\t\tremoveStart = Math.min( length, spliceArguments[0] );\n\t\tremoveEnd = removeStart + spliceArguments[1];\n\t\tnewIndices.startIndex = removeStart;\n\n\t\tfor ( i = 0; i < removeStart; i += 1 ) {\n\t\t\tnewIndices.push( i );\n\t\t}\n\n\t\tfor ( ; i < removeEnd; i += 1 ) {\n\t\t\tnewIndices.push( -1 );\n\t\t}\n\n\t\tfor ( ; i < length; i += 1 ) {\n\t\t\tnewIndices.push( i + balance );\n\t\t}\n\n\t\t// there is a net shift for the rest of the array starting with index + balance\n\t\tif ( balance !== 0 ) {\n\t\t\tnewIndices.touchedFrom = spliceArguments[0];\n\t\t} else {\n\t\t\tnewIndices.touchedFrom = length;\n\t\t}\n\n\t\treturn newIndices;\n\t}\n\n\n\t// The pop, push, shift an unshift methods can all be represented\n\t// as an equivalent splice\n\tfunction getSpliceEquivalent ( length, methodName, args ) {\n\t\tswitch ( methodName ) {\n\t\t\tcase 'splice':\n\t\t\t\tif ( args[0] !== undefined && args[0] < 0 ) {\n\t\t\t\t\targs[0] = length + Math.max( args[0], -length );\n\t\t\t\t}\n\n\t\t\t\tif ( args[0] === undefined ) args[0] = 0;\n\n\t\t\t\twhile ( args.length < 2 ) {\n\t\t\t\t\targs.push( length - args[0] );\n\t\t\t\t}\n\n\t\t\t\tif ( typeof args[1] !== 'number' ) {\n\t\t\t\t\targs[1] = length - args[0];\n\t\t\t\t}\n\n\t\t\t\t// ensure we only remove elements that exist\n\t\t\t\targs[1] = Math.min( args[1], length - args[0] );\n\n\t\t\t\treturn args;\n\n\t\t\tcase 'sort':\n\t\t\tcase 'reverse':\n\t\t\t\treturn null;\n\n\t\t\tcase 'pop':\n\t\t\t\tif ( length ) {\n\t\t\t\t\treturn [ length - 1, 1 ];\n\t\t\t\t}\n\t\t\t\treturn [ 0, 0 ];\n\n\t\t\tcase 'push':\n\t\t\t\treturn [ length, 0 ].concat( args );\n\n\t\t\tcase 'shift':\n\t\t\t\treturn [ 0, length ? 1 : 0 ];\n\n\t\t\tcase 'unshift':\n\t\t\t\treturn [ 0, 0 ].concat( args );\n\t\t}\n\t}\n\n\tvar arrayProto = Array.prototype;\n\n\tfunction makeArrayMethod ( methodName ) {\n\t\tfunction path ( keypath ) {\n\t\t\tvar args = [], len = arguments.length - 1;\n\t\t\twhile ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n\t\t\treturn model( this.viewmodel.joinAll( splitKeypathI( keypath ) ), args );\n\t\t}\n\n\t\tfunction model ( mdl, args ) {\n\t\t\tvar array = mdl.get();\n\n\t\t\tif ( !isArray( array ) ) {\n\t\t\t\tif ( array === undefined ) {\n\t\t\t\t\tarray = [];\n\t\t\t\t\tvar result$1 = arrayProto[ methodName ].apply( array, args );\n\t\t\t\t\tvar promise$1 = runloop.start( this, true ).then( function () { return result$1; } );\n\t\t\t\t\tmdl.set( array );\n\t\t\t\t\trunloop.end();\n\t\t\t\t\treturn promise$1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error( (\"shuffle array method \" + methodName + \" called on non-array at \" + (mdl.getKeypath())) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar newIndices = getNewIndices( array.length, methodName, args );\n\t\t\tvar result = arrayProto[ methodName ].apply( array, args );\n\n\t\t\tvar promise = runloop.start( this, true ).then( function () { return result; } );\n\t\t\tpromise.result = result;\n\n\t\t\tif ( newIndices ) {\n\t\t\t\tmdl.shuffle( newIndices );\n\t\t\t} else {\n\t\t\t\tmdl.set( result );\n\t\t\t}\n\n\t\t\trunloop.end();\n\n\t\t\treturn promise;\n\t\t}\n\n\t\treturn { path: path, model: model };\n\t}\n\n\tvar comparators = {};\n\n\tfunction getComparator ( option ) {\n\t\tif ( !option ) return null; // use existing arrays\n\t\tif ( option === true ) return JSON.stringify;\n\t\tif ( typeof option === 'function' ) return option;\n\n\t\tif ( typeof option === 'string' ) {\n\t\t\treturn comparators[ option ] || ( comparators[ option ] = function ( thing ) { return thing[ option ]; } );\n\t\t}\n\n\t\tthrow new Error( 'If supplied, options.compare must be a string, function, or `true`' ); // TODO link to docs\n\t}\n\n\tfunction merge$1 ( ractive, model, array, options ) {\n\t\tvar promise = runloop.start( ractive, true );\n\t\tvar value = model.get();\n\n\t\tif ( !isArray( value ) || !isArray( array ) ) {\n\t\t\tthrow new Error( 'You cannot merge an array with a non-array' );\n\t\t}\n\n\t\tvar comparator = getComparator( options && options.compare );\n\t\tmodel.merge( array, comparator );\n\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\tfunction thisRactive$merge ( keypath, array, options ) {\n\t\treturn merge$1( this, this.viewmodel.joinAll( splitKeypathI( keypath ) ), array, options );\n\t}\n\n\tvar updateHook = new Hook( 'update' );\n\n\tfunction update$2 ( ractive, model ) {\n\t\t// if the parent is wrapped, the adaptor will need to be updated before\n\t\t// updating on this keypath\n\t\tif ( model.parent && model.parent.wrapper ) {\n\t\t\tmodel.parent.adapt();\n\t\t}\n\n\t\tvar promise = runloop.start( ractive, true );\n\n\t\tmodel.mark();\n\t\tmodel.registerChange( model.getKeypath(), model.get() );\n\n\t\tif ( !model.isRoot ) {\n\t\t\t// there may be unresolved refs that are now resolvable up the context tree\n\t\t\tvar parent = model.parent, key = model.key;\n\t\t\twhile ( parent && !parent.isRoot ) {\n\t\t\t\tif ( parent.clearUnresolveds ) parent.clearUnresolveds( key );\n\t\t\t\tkey = parent.key;\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\t\t}\n\n\t\t// notify upstream of changes\n\t\tmodel.notifyUpstream();\n\n\t\trunloop.end();\n\n\t\tupdateHook.fire( ractive, model );\n\n\t\treturn promise;\n\t}\n\n\tfunction Ractive$update ( keypath ) {\n\t\tif ( keypath ) keypath = splitKeypathI( keypath );\n\n\t\treturn update$2( this, keypath ? this.viewmodel.joinAll( keypath ) : this.viewmodel );\n\t}\n\n\tvar modelPush = makeArrayMethod( 'push' ).model;\n\tvar modelPop = makeArrayMethod( 'pop' ).model;\n\tvar modelShift = makeArrayMethod( 'shift' ).model;\n\tvar modelUnshift = makeArrayMethod( 'unshift' ).model;\n\tvar modelSort = makeArrayMethod( 'sort' ).model;\n\tvar modelSplice = makeArrayMethod( 'splice' ).model;\n\tvar modelReverse = makeArrayMethod( 'reverse' ).model;\n\n\t// TODO: at some point perhaps this could support relative * keypaths?\n\tfunction build$1 ( el, keypath, value ) {\n\t\tvar sets = [];\n\n\t\t// set multiple keypaths in one go\n\t\tif ( isObject( keypath ) ) {\n\t\t\tfor ( var k in keypath ) {\n\t\t\t\tif ( keypath.hasOwnProperty( k ) ) {\n\t\t\t\t\tsets.push( [ findModel( el, k ).model, keypath[k] ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\t// set a single keypath\n\t\telse {\n\t\t\tsets.push( [ findModel( el, keypath ).model, value ] );\n\t\t}\n\n\t\treturn sets;\n\t}\n\n\t// get relative keypaths and values\n\tfunction get ( keypath ) {\n\t\tif ( !keypath ) return this._element.parentFragment.findContext().get( true );\n\n\t\tvar model = resolveReference( this._element.parentFragment, keypath );\n\n\t\treturn model ? model.get( true ) : undefined;\n\t}\n\n\tfunction resolve$1 ( path, ractive ) {\n\t\tvar ref = findModel( this, path ), model = ref.model, instance = ref.instance;\n\t\treturn model ? model.getKeypath( ractive || instance ) : path;\n\t}\n\n\tfunction findModel ( el, path ) {\n\t\tvar frag = el._element.parentFragment;\n\n\t\tif ( typeof path !== 'string' ) {\n\t\t\treturn { model: frag.findContext(), instance: path };\n\t\t}\n\n\t\treturn { model: resolveReference( frag, path ), instance: frag.ractive };\n\t}\n\n\t// the usual mutation suspects\n\tfunction add$1 ( keypath, value ) {\n\t\tif ( value === undefined ) value = 1;\n\t\tif ( !isNumeric( value ) ) throw new Error( 'Bad arguments' );\n\t\treturn set( this.ractive, build$1( this, keypath, value ).map( function ( pair ) {\n\t\t\tvar model = pair[0], val = pair[1], value = model.get();\n\t\t\tif ( !isNumeric( val ) || !isNumeric( value ) ) throw new Error( 'Cannot add non-numeric value' );\n\t\t\treturn [ model, value + val ];\n\t\t}) );\n\t}\n\n\tfunction animate ( keypath, value, options ) {\n\t\tvar model = findModel( this, keypath ).model;\n\t\treturn protoAnimate( this.ractive, model, value, options );\n\t}\n\n\tfunction link ( source, dest ) {\n\t\tvar there = findModel( this, source ).model, here = findModel( this, dest ).model;\n\t\tvar promise = runloop.start( this.ractive, true );\n\t\there.link( there, source );\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\tfunction merge ( keypath, array, options ) {\n\t\treturn merge$1( this.ractive, findModel( this, keypath ).model, array, options );\n\t}\n\n\tfunction pop ( keypath ) {\n\t\treturn modelPop( findModel( this, keypath ).model, [] );\n\t}\n\n\tfunction push ( keypath ) {\n\t\tvar values = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n\n\t\treturn modelPush( findModel( this, keypath ).model, values );\n\t}\n\n\tfunction reverse ( keypath ) {\n\t\treturn modelReverse( findModel( this, keypath ).model, [] );\n\t}\n\n\tfunction set$1 ( keypath, value ) {\n\t\treturn set( this.ractive, build$1( this, keypath, value ) );\n\t}\n\n\tfunction shift ( keypath ) {\n\t\treturn modelShift( findModel( this, keypath ).model, [] );\n\t}\n\n\tfunction splice ( keypath, index, drop ) {\n\t\tvar add = [], len = arguments.length - 3;\n\t\twhile ( len-- > 0 ) add[ len ] = arguments[ len + 3 ];\n\n\t\tadd.unshift( index, drop );\n\t\treturn modelSplice( findModel( this, keypath ).model, add );\n\t}\n\n\tfunction sort ( keypath ) {\n\t\treturn modelSort( findModel( this, keypath ).model, [] );\n\t}\n\n\tfunction subtract ( keypath, value ) {\n\t\tif ( value === undefined ) value = 1;\n\t\tif ( !isNumeric( value ) ) throw new Error( 'Bad arguments' );\n\t\treturn set( this.ractive, build$1( this, keypath, value ).map( function ( pair ) {\n\t\t\tvar model = pair[0], val = pair[1], value = model.get();\n\t\t\tif ( !isNumeric( val ) || !isNumeric( value ) ) throw new Error( 'Cannot add non-numeric value' );\n\t\t\treturn [ model, value - val ];\n\t\t}) );\n\t}\n\n\tfunction toggle ( keypath ) {\n\t\tvar ref = findModel( this, keypath ), model = ref.model;\n\t\treturn set( this.ractive, [ [ model, !model.get() ] ] );\n\t}\n\n\tfunction unlink ( dest ) {\n\t\tvar here = findModel( this, dest ).model;\n\t\tvar promise = runloop.start( this.ractive, true );\n\t\tif ( here.owner && here.owner._link ) here.owner.unlink();\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\tfunction unshift ( keypath ) {\n\t\tvar add = [], len = arguments.length - 1;\n\t\twhile ( len-- > 0 ) add[ len ] = arguments[ len + 1 ];\n\n\t\treturn modelUnshift( findModel( this, keypath ).model, add );\n\t}\n\n\tfunction update$1 ( keypath ) {\n\t\treturn update$2( this.ractive, findModel( this, keypath ).model );\n\t}\n\n\tfunction updateModel ( keypath, cascade ) {\n\t\tvar ref = findModel( this, keypath ), model = ref.model;\n\t\tvar promise = runloop.start( this.ractive, true );\n\t\tmodel.updateFromBindings( cascade );\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\t// two-way binding related helpers\n\tfunction isBound () {\n\t\tvar ref = getBindingModel( this ), model = ref.model;\n\t\treturn !!model;\n\t}\n\n\tfunction getBindingPath ( ractive ) {\n\t\tvar ref = getBindingModel( this ), model = ref.model, instance = ref.instance;\n\t\tif ( model ) return model.getKeypath( ractive || instance );\n\t}\n\n\tfunction getBinding () {\n\t\tvar ref = getBindingModel( this ), model = ref.model;\n\t\tif ( model ) return model.get( true );\n\t}\n\n\tfunction getBindingModel ( ctx ) {\n\t\tvar el = ctx._element;\n\t\treturn { model: el.binding && el.binding.model, instance: el.parentFragment.ractive };\n\t}\n\n\tfunction setBinding ( value ) {\n\t\tvar ref = getBindingModel( this ), model = ref.model;\n\t\treturn set( this.ractive, [ [ model, value ] ] );\n\t}\n\n\t// deprecated getters\n\tfunction keypath () {\n\t\twarnOnceIfDebug( (\"Object property keypath is deprecated, please use resolve() instead.\") );\n\t\treturn this.resolve();\n\t}\n\n\tfunction rootpath () {\n\t\twarnOnceIfDebug( (\"Object property rootpath is deprecated, please use resolve( ractive.root ) instead.\") );\n\t\treturn this.resolve( this.ractive.root );\n\t}\n\n\tfunction context () {\n\t\twarnOnceIfDebug( (\"Object property context is deprecated, please use get() instead.\") );\n\t\treturn this.get();\n\t}\n\n\tfunction index () {\n\t\twarnOnceIfDebug( (\"Object property index is deprecated, you can use get( \\\"indexName\\\" ) instead.\") );\n\t\treturn gatherRefs( this._element.parentFragment ).index;\n\t}\n\n\tfunction key () {\n\t\twarnOnceIfDebug( (\"Object property key is deprecated, you can use get( \\\"keyName\\\" ) instead.\") );\n\t\treturn gatherRefs( this._element.parentFragment ).key;\n\t}\n\n\tfunction addHelpers ( obj, element ) {\n\t\tdefineProperties( obj, {\n\t\t\t_element: { value: element },\n\t\t\tractive: { value: element.parentFragment.ractive },\n\t\t\tresolve: { value: resolve$1 },\n\t\t\tget: { value: get },\n\n\t\t\tadd: { value: add$1 },\n\t\t\tanimate: { value: animate },\n\t\t\tlink: { value: link },\n\t\t\tmerge: { value: merge },\n\t\t\tpop: { value: pop },\n\t\t\tpush: { value: push },\n\t\t\treverse: { value: reverse },\n\t\t\tset: { value: set$1 },\n\t\t\tshift: { value: shift },\n\t\t\tsort: { value: sort },\n\t\t\tsplice: { value: splice },\n\t\t\tsubtract: { value: subtract },\n\t\t\ttoggle: { value: toggle },\n\t\t\tunlink: { value: unlink },\n\t\t\tunshift: { value: unshift },\n\t\t\tupdate: { value: update$1 },\n\t\t\tupdateModel: { value: updateModel },\n\n\t\t\tisBound: { value: isBound },\n\t\t\tgetBindingPath: { value: getBindingPath },\n\t\t\tgetBinding: { value: getBinding },\n\t\t\tsetBinding: { value: setBinding },\n\n\t\t\tkeypath: { get: keypath },\n\t\t\trootpath: { get: rootpath },\n\t\t\tcontext: { get: context },\n\t\t\tindex: { get: index },\n\t\t\tkey: { get: key }\n\t\t});\n\n\t\treturn obj;\n\t}\n\n\tvar query = doc && doc.querySelector;\n\n\tfunction staticInfo( node ) {\n\t\tif ( typeof node === 'string' && query ) {\n\t\t\tnode = query.call( document, node );\n\t\t}\n\n\t\tif ( !node || !node._ractive ) return undefined;\n\n\t\tvar storage = node._ractive;\n\n\t\treturn addHelpers( {}, storage.proxy );\n\t}\n\n\tfunction getNodeInfo( node ) {\n\t\tif ( typeof node === 'string' ) {\n\t\t\tnode = this.find( node );\n\t\t}\n\n\t\treturn staticInfo( node );\n\t}\n\n\tvar insertHook = new Hook( 'insert' );\n\n\tfunction Ractive$insert ( target, anchor ) {\n\t\tif ( !this.fragment.rendered ) {\n\t\t\t// TODO create, and link to, documentation explaining this\n\t\t\tthrow new Error( 'The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.' );\n\t\t}\n\n\t\ttarget = getElement( target );\n\t\tanchor = getElement( anchor ) || null;\n\n\t\tif ( !target ) {\n\t\t\tthrow new Error( 'You must specify a valid target to insert into' );\n\t\t}\n\n\t\ttarget.insertBefore( this.detach(), anchor );\n\t\tthis.el = target;\n\n\t\t( target.__ractive_instances__ || ( target.__ractive_instances__ = [] ) ).push( this );\n\t\tthis.isDetached = false;\n\n\t\tfireInsertHook( this );\n\t}\n\n\tfunction fireInsertHook( ractive ) {\n\t\tinsertHook.fire( ractive );\n\n\t\tractive.findAllComponents('*').forEach( function ( child ) {\n\t\t\tfireInsertHook( child.instance );\n\t\t});\n\t}\n\n\tfunction link$1( there, here ) {\n\t\tif ( here === there || (there + '.').indexOf( here + '.' ) === 0 || (here + '.').indexOf( there + '.' ) === 0 ) {\n\t\t\tthrow new Error( 'A keypath cannot be linked to itself.' );\n\t\t}\n\n\t\tvar promise = runloop.start();\n\t\tvar model;\n\n\t\t// may need to allow a mapping to resolve implicitly\n\t\tvar sourcePath = splitKeypathI( there );\n\t\tif ( !this.viewmodel.has( sourcePath[0] ) && this.component ) {\n\t\t\tmodel = resolveReference( this.component.parentFragment, sourcePath[0] );\n\t\t\tmodel = model.joinAll( sourcePath.slice( 1 ) );\n\t\t}\n\n\t\tthis.viewmodel.joinAll( splitKeypathI( here ) ).link( model || this.viewmodel.joinAll( sourcePath ), there );\n\n\t\trunloop.end();\n\n\t\treturn promise;\n\t}\n\n\tvar ReferenceResolver = function ReferenceResolver ( fragment, reference, callback ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.fragment = fragment;\n\t\tthis.reference = normalise( reference );\n\t\tthis.callback = callback;\n\n\t\tthis.keys = splitKeypathI( reference );\n\t\tthis.resolved = false;\n\n\t\tthis.contexts = [];\n\n\t\t// TODO the consumer should take care of addUnresolved\n\t\t// we attach to all the contexts between here and the root\n\t\t// - whenever their values change, they can quickly\n\t\t// check to see if we can resolve\n\t\twhile ( fragment ) {\n\t\t\tif ( fragment.context ) {\n\t\t\t\tfragment.context.addUnresolved( this$1.keys[0], this$1 );\n\t\t\t\tthis$1.contexts.push( fragment.context );\n\t\t\t}\n\n\t\t\tfragment = fragment.componentParent || fragment.parent;\n\t\t}\n\t};\n\n\tReferenceResolver.prototype.attemptResolution = function attemptResolution () {\n\t\tif ( this.resolved ) return;\n\n\t\tvar model = resolveAmbiguousReference( this.fragment, this.reference );\n\n\t\tif ( model ) {\n\t\t\tthis.resolved = true;\n\t\t\tthis.callback( model );\n\t\t}\n\t};\n\n\tReferenceResolver.prototype.forceResolution = function forceResolution () {\n\t\tif ( this.resolved ) return;\n\n\t\tvar model = this.fragment.findContext().joinAll( this.keys );\n\t\tthis.callback( model );\n\t\tthis.resolved = true;\n\t};\n\n\tReferenceResolver.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( previous ) previous.removeUnresolved( this.keys[0], this );\n\n\t\tthis.next = next;\n\t\tif ( next ) runloop.scheduleTask( function () {\n\t\t\tif ( next === this$1.next ) {\n\t\t\t\tnext.addUnresolved( this$1.keys[0], this$1 );\n\t\t\t\tthis$1.next = null;\n\t\t\t}\n\t\t});\n\t};\n\n\tReferenceResolver.prototype.unbind = function unbind () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.fragment ) removeFromArray( this.fragment.unresolved, this );\n\n\t\tif ( this.resolved ) return;\n\n\t\tthis.contexts.forEach( function ( c ) { return c.removeUnresolved( this$1.keys[0], this$1 ); } );\n\t};\n\n\tfunction observe ( keypath, callback, options ) {\n\t\tvar this$1 = this;\n\n\t\tif ( this.torndown ) return { cancel: function() {} };\n\n\t\tvar observers = [];\n\t\tvar map;\n\n\t\tif ( isObject( keypath ) ) {\n\t\t\tmap = keypath;\n\t\t\toptions = callback || {};\n\n\t\t\tObject.keys( map ).forEach( function ( keypath ) {\n\t\t\t\tvar callback = map[ keypath ];\n\n\t\t\t\tvar keypaths = keypath.split( ' ' );\n\t\t\t\tif ( keypaths.length > 1 ) keypaths = keypaths.filter( function ( k ) { return k; } );\n\n\t\t\t\tkeypaths.forEach( function ( keypath ) {\n\t\t\t\t\tobservers.push( createObserver( this$1, keypath, callback, options ) );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\telse {\n\t\t\tvar keypaths;\n\n\t\t\tif ( typeof keypath === 'function' ) {\n\t\t\t\toptions = callback;\n\t\t\t\tcallback = keypath;\n\t\t\t\tkeypaths = [ '' ];\n\t\t\t} else {\n\t\t\t\tkeypaths = keypath.split( ' ' );\n\t\t\t}\n\n\t\t\tif ( keypaths.length > 1 ) keypaths = keypaths.filter( function ( k ) { return k; } );\n\n\t\t\tkeypaths.forEach( function ( keypath ) {\n\t\t\t\tobservers.push( createObserver( this$1, keypath, callback, options || {} ) );\n\t\t\t});\n\t\t}\n\n\t\t// add observers to the Ractive instance, so they can be\n\t\t// cancelled on ractive.teardown()\n\t\tthis._observers.push.apply( this._observers, observers );\n\n\t\treturn {\n\t\t\tcancel: function () {\n\t\t\t\tobservers.forEach( function ( observer ) {\n\t\t\t\t\tremoveFromArray ( this$1._observers, observer );\n\t\t\t\t\tobserver.cancel();\n\t\t\t\t} );\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction createObserver ( ractive, keypath, callback, options ) {\n\t\tvar viewmodel = ractive.viewmodel;\n\n\t\tvar keys = splitKeypathI( keypath );\n\t\tvar wildcardIndex = keys.indexOf( '*' );\n\t\toptions.keypath = keypath;\n\n\t\t// normal keypath - no wildcards\n\t\tif ( !~wildcardIndex ) {\n\t\t\tvar key = keys[0];\n\t\t\tvar model;\n\n\t\t\t// if not the root model itself, check if viewmodel has key.\n\t\t\tif ( key !== '' && !viewmodel.has( key ) ) {\n\t\t\t\t// if this is an inline component, we may need to create an implicit mapping\n\t\t\t\tif ( ractive.component && !ractive.isolated ) {\n\t\t\t\t\tmodel = resolveReference( ractive.component.parentFragment, key );\n\t\t\t\t\tif ( model ) {\n\t\t\t\t\t\tviewmodel.map( key, model );\n\t\t\t\t\t\tmodel = viewmodel.joinAll( keys );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmodel = viewmodel.joinAll( keys );\n\t\t\t}\n\n\t\t\treturn new Observer( ractive, model, callback, options );\n\t\t}\n\n\t\t// pattern observers - more complex case\n\t\tvar baseModel = wildcardIndex === 0 ?\n\t\t\tviewmodel :\n\t\t\tviewmodel.joinAll( keys.slice( 0, wildcardIndex ) );\n\n\t\treturn new PatternObserver( ractive, baseModel, keys.splice( wildcardIndex ), callback, options );\n\t}\n\n\tvar Observer = function Observer ( ractive, model, callback, options ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.context = options.context || ractive;\n\t\tthis.callback = callback;\n\t\tthis.ractive = ractive;\n\n\t\tif ( model ) this.resolved( model );\n\t\telse {\n\t\t\tthis.keypath = options.keypath;\n\t\t\tthis.resolver = new ReferenceResolver( ractive.fragment, options.keypath, function ( model ) {\n\t\t\t\tthis$1.resolved( model );\n\t\t\t});\n\t\t}\n\n\t\tif ( options.init !== false ) {\n\t\t\tthis.dirty = true;\n\t\t\tthis.dispatch();\n\t\t} else {\n\t\t\tthis.oldValue = this.newValue;\n\t\t}\n\n\t\tthis.defer = options.defer;\n\t\tthis.once = options.once;\n\t\tthis.strict = options.strict;\n\n\t\tthis.dirty = false;\n\t};\n\n\tObserver.prototype.cancel = function cancel () {\n\t\tthis.cancelled = true;\n\t\tif ( this.model ) {\n\t\t\tthis.model.unregister( this );\n\t\t} else {\n\t\t\tthis.resolver.unbind();\n\t\t}\n\t};\n\n\tObserver.prototype.dispatch = function dispatch () {\n\t\tif ( !this.cancelled ) {\n\t\t\tthis.callback.call( this.context, this.newValue, this.oldValue, this.keypath );\n\t\t\tthis.oldValue = this.model ? this.model.get() : this.newValue;\n\t\t\tthis.dirty = false;\n\t\t}\n\t};\n\n\tObserver.prototype.handleChange = function handleChange () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !this.dirty ) {\n\t\t\tvar newValue = this.model.get();\n\t\t\tif ( isEqual( newValue, this.oldValue ) ) return;\n\n\t\t\tthis.newValue = newValue;\n\n\t\t\tif ( this.strict && this.newValue === this.oldValue ) return;\n\n\t\t\trunloop.addObserver( this, this.defer );\n\t\t\tthis.dirty = true;\n\n\t\t\tif ( this.once ) runloop.scheduleTask( function () { return this$1.cancel(); } );\n\t\t}\n\t};\n\n\tObserver.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tnext = rebindMatch( this.keypath, next, previous );\n\t\t// TODO: set up a resolver if next is undefined?\n\t\tif ( next === this.model ) return false;\n\n\t\tif ( this.model ) this.model.unregister( this );\n\t\tif ( next ) next.addShuffleTask( function () { return this$1.resolved( next ); } );\n\t};\n\n\tObserver.prototype.resolved = function resolved ( model ) {\n\t\tthis.model = model;\n\t\tthis.keypath = model.getKeypath( this.ractive );\n\n\t\tthis.oldValue = undefined;\n\t\tthis.newValue = model.get();\n\n\t\tmodel.register( this );\n\t};\n\n\tvar PatternObserver = function PatternObserver ( ractive, baseModel, keys, callback, options ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.context = options.context || ractive;\n\t\tthis.ractive = ractive;\n\t\tthis.baseModel = baseModel;\n\t\tthis.keys = keys;\n\t\tthis.callback = callback;\n\n\t\tvar pattern = keys.join( '\\\\.' ).replace( /\\*/g, '(.+)' );\n\t\tvar baseKeypath = baseModel.getKeypath( ractive );\n\t\tthis.pattern = new RegExp( (\"^\" + (baseKeypath ? baseKeypath + '\\\\.' : '') + \"\" + pattern + \"$\") );\n\n\t\tthis.oldValues = {};\n\t\tthis.newValues = {};\n\n\t\tthis.defer = options.defer;\n\t\tthis.once = options.once;\n\t\tthis.strict = options.strict;\n\n\t\tthis.dirty = false;\n\t\tthis.changed = [];\n\t\tthis.partial = false;\n\n\t\tvar models = baseModel.findMatches( this.keys );\n\n\t\tmodels.forEach( function ( model ) {\n\t\t\tthis$1.newValues[ model.getKeypath( this$1.ractive ) ] = model.get();\n\t\t});\n\n\t\tif ( options.init !== false ) {\n\t\t\tthis.dispatch();\n\t\t} else {\n\t\t\tthis.oldValues = this.newValues;\n\t\t}\n\n\t\tbaseModel.registerPatternObserver( this );\n\t};\n\n\tPatternObserver.prototype.cancel = function cancel () {\n\t\tthis.baseModel.unregisterPatternObserver( this );\n\t};\n\n\tPatternObserver.prototype.dispatch = function dispatch () {\n\t\tvar this$1 = this;\n\n\t\t\tvar newValues = this.newValues;\n\t\tthis.newValues = {};\n\t\tObject.keys( newValues ).forEach( function ( keypath ) {\n\t\t\tif ( this$1.newKeys && !this$1.newKeys[ keypath ] ) return;\n\n\t\t\tvar newValue = newValues[ keypath ];\n\t\t\tvar oldValue = this$1.oldValues[ keypath ];\n\n\t\t\tif ( this$1.strict && newValue === oldValue ) return;\n\t\t\tif ( isEqual( newValue, oldValue ) ) return;\n\n\t\t\tvar args = [ newValue, oldValue, keypath ];\n\t\t\tif ( keypath ) {\n\t\t\t\tvar wildcards = this$1.pattern.exec( keypath );\n\t\t\t\tif ( wildcards ) {\n\t\t\t\t\targs = args.concat( wildcards.slice( 1 ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis$1.callback.apply( this$1.context, args );\n\t\t});\n\n\t\tif ( this.partial ) {\n\t\t\tfor ( var k in newValues ) {\n\t\t\t\tthis.oldValues[k] = newValues[k];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.oldValues = newValues;\n\t\t}\n\n\t\tthis.newKeys = null;\n\t\tthis.dirty = false;\n\t};\n\n\tPatternObserver.prototype.notify = function notify ( key ) {\n\t\tthis.changed.push( key );\n\t};\n\n\tPatternObserver.prototype.shuffle = function shuffle ( newIndices ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !isArray( this.baseModel.value ) ) return;\n\n\t\tvar base = this.baseModel.getKeypath( this.ractive );\n\t\tvar max = this.baseModel.value.length;\n\t\tvar suffix = this.keys.length > 1 ? '.' + this.keys.slice( 1 ).join( '.' ) : '';\n\n\t\tthis.newKeys = {};\n\t\tfor ( var i = 0; i < newIndices.length; i++ ) {\n\t\t\tif ( newIndices[ i ] === -1 || newIndices[ i ] === i ) continue;\n\t\t\tthis$1.newKeys[ (\"\" + base + \".\" + i + \"\" + suffix) ] = true;\n\t\t}\n\n\t\tfor ( var i$1 = newIndices.touchedFrom; i$1 < max; i$1++ ) {\n\t\t\tthis$1.newKeys[ (\"\" + base + \".\" + i$1 + \"\" + suffix) ] = true;\n\t\t}\n\t};\n\n\tPatternObserver.prototype.handleChange = function handleChange () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !this.dirty || this.changed.length ) {\n\t\t\tif ( !this.dirty ) this.newValues = {};\n\n\t\t\t// handle case where previously extant keypath no longer exists -\n\t\t\t// observer should still fire, with undefined as new value\n\t\t\t// TODO huh. according to the test suite that's not the case...\n\t\t\t// NOTE: I don't think this will work with partial updates\n\t\t\t// Object.keys( this.oldValues ).forEach( keypath => {\n\t\t\t// this.newValues[ keypath ] = undefined;\n\t\t\t// });\n\n\t\t\tif ( !this.changed.length ) {\n\t\t\t\tthis.baseModel.findMatches( this.keys ).forEach( function ( model ) {\n\t\t\t\t\tvar keypath = model.getKeypath( this$1.ractive );\n\t\t\t\t\tthis$1.newValues[ keypath ] = model.get();\n\t\t\t\t});\n\t\t\t\tthis.partial = false;\n\t\t\t} else {\n\t\t\t\tvar count = 0;\n\t\t\t\tvar ok = this.baseModel.isRoot ?\n\t\t\t\t\tthis.changed.map( function ( keys ) { return keys.map( escapeKey ).join( '.' ); } ) :\n\t\t\t\t\tthis.changed.map( function ( keys ) { return this$1.baseModel.getKeypath( this$1.ractive ) + '.' + keys.map( escapeKey ).join( '.' ); } );\n\n\t\t\t\tthis.baseModel.findMatches( this.keys ).forEach( function ( model ) {\n\t\t\t\t\tvar keypath = model.getKeypath( this$1.ractive );\n\t\t\t\t\tvar check = function ( k ) {\n\t\t\t\t\t\treturn ( k.indexOf( keypath ) === 0 && ( k.length === keypath.length || k[ keypath.length ] === '.' ) ) ||\n\t\t\t\t\t\t\t\t   ( keypath.indexOf( k ) === 0 && ( k.length === keypath.length || keypath[ k.length ] === '.' ) );\n\t\t\t\t\t};\n\n\t\t\t\t\t// is this model on a changed keypath?\n\t\t\t\t\tif ( ok.filter( check ).length ) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t\tthis$1.newValues[ keypath ] = model.get();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// no valid change triggered, so bail to avoid breakage\n\t\t\t\tif ( !count ) return;\n\n\t\t\t\tthis.partial = true;\n\t\t\t}\n\n\t\t\trunloop.addObserver( this, this.defer );\n\t\t\tthis.dirty = true;\n\t\t\tthis.changed.length = 0;\n\n\t\t\tif ( this.once ) this.cancel();\n\t\t}\n\t};\n\n\tfunction observeList ( keypath, callback, options ) {\n\t\tif ( typeof keypath !== 'string' ) {\n\t\t\tthrow new Error( 'ractive.observeList() must be passed a string as its first argument' );\n\t\t}\n\n\t\tvar model = this.viewmodel.joinAll( splitKeypathI( keypath ) );\n\t\tvar observer = new ListObserver( this, model, callback, options || {} );\n\n\t\t// add observer to the Ractive instance, so it can be\n\t\t// cancelled on ractive.teardown()\n\t\tthis._observers.push( observer );\n\n\t\treturn {\n\t\t\tcancel: function () {\n\t\t\t\tobserver.cancel();\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction negativeOne () {\n\t\treturn -1;\n\t}\n\n\tvar ListObserver = function ListObserver ( context, model, callback, options ) {\n\t\tthis.context = context;\n\t\tthis.model = model;\n\t\tthis.keypath = model.getKeypath();\n\t\tthis.callback = callback;\n\n\t\tthis.pending = null;\n\n\t\tmodel.register( this );\n\n\t\tif ( options.init !== false ) {\n\t\t\tthis.sliced = [];\n\t\t\tthis.shuffle([]);\n\t\t\tthis.handleChange();\n\t\t} else {\n\t\t\tthis.sliced = this.slice();\n\t\t}\n\t};\n\n\tListObserver.prototype.handleChange = function handleChange () {\n\t\tif ( this.pending ) {\n\t\t\t// post-shuffle\n\t\t\tthis.callback( this.pending );\n\t\t\tthis.pending = null;\n\t\t}\n\n\t\telse {\n\t\t\t// entire array changed\n\t\t\tthis.shuffle( this.sliced.map( negativeOne ) );\n\t\t\tthis.handleChange();\n\t\t}\n\t};\n\n\tListObserver.prototype.shuffle = function shuffle ( newIndices ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar newValue = this.slice();\n\n\t\tvar inserted = [];\n\t\tvar deleted = [];\n\t\tvar start;\n\n\t\tvar hadIndex = {};\n\n\t\tnewIndices.forEach( function ( newIndex, oldIndex ) {\n\t\t\thadIndex[ newIndex ] = true;\n\n\t\t\tif ( newIndex !== oldIndex && start === undefined ) {\n\t\t\t\tstart = oldIndex;\n\t\t\t}\n\n\t\t\tif ( newIndex === -1 ) {\n\t\t\t\tdeleted.push( this$1.sliced[ oldIndex ] );\n\t\t\t}\n\t\t});\n\n\t\tif ( start === undefined ) start = newIndices.length;\n\n\t\tvar len = newValue.length;\n\t\tfor ( var i = 0; i < len; i += 1 ) {\n\t\t\tif ( !hadIndex[i] ) inserted.push( newValue[i] );\n\t\t}\n\n\t\tthis.pending = { inserted: inserted, deleted: deleted, start: start };\n\t\tthis.sliced = newValue;\n\t};\n\n\tListObserver.prototype.slice = function slice () {\n\t\tvar value = this.model.get();\n\t\treturn isArray( value ) ? value.slice() : [];\n\t};\n\n\tvar onceOptions = { init: false, once: true };\n\n\tfunction observeOnce ( keypath, callback, options ) {\n\t\tif ( isObject( keypath ) || typeof keypath === 'function' ) {\n\t\t\toptions = extendObj( callback || {}, onceOptions );\n\t\t\treturn this.observe( keypath, options );\n\t\t}\n\n\t\toptions = extendObj( options || {}, onceOptions );\n\t\treturn this.observe( keypath, callback, options );\n\t}\n\n\tfunction trim ( str ) { return str.trim(); };\n\n\tfunction notEmptyString ( str ) { return str !== ''; };\n\n\tfunction Ractive$off ( eventName, callback ) {\n\t\t// if no arguments specified, remove all callbacks\n\t\tvar this$1 = this;\n\n\t\tif ( !eventName ) {\n\t\t\t// TODO use this code instead, once the following issue has been resolved\n\t\t\t// in PhantomJS (tests are unpassable otherwise!)\n\t\t\t// https://github.com/ariya/phantomjs/issues/11856\n\t\t\t// defineProperty( this, '_subs', { value: create( null ), configurable: true });\n\t\t\tfor ( eventName in this._subs ) {\n\t\t\t\tdelete this._subs[ eventName ];\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\t// Handle multiple space-separated event names\n\t\t\tvar eventNames = eventName.split( ' ' ).map( trim ).filter( notEmptyString );\n\n\t\t\teventNames.forEach( function ( eventName ) {\n\t\t\t\tvar subscribers = this$1._subs[ eventName ];\n\n\t\t\t\t// If we have subscribers for this event...\n\t\t\t\tif ( subscribers ) {\n\t\t\t\t\t// ...if a callback was specified, only remove that\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t// flag this callback as off so that any in-flight firings don't call\n\t\t\t\t\t\t// a cancelled handler - this is _slightly_ hacky\n\t\t\t\t\t\tvar i = subscribers.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( subscribers[i].callback === callback ) {\n\t\t\t\t\t\t\t\tsubscribers[i].off = true;\n\t\t\t\t\t\t\t\tsubscribers.splice( i, 1 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// ...otherwise remove all callbacks\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis$1._subs[ eventName ] = [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tfunction Ractive$on ( eventName, callback ) {\n\t\t// allow multiple listeners to be bound in one go\n\t\tvar this$1 = this;\n\n\t\tif ( typeof eventName === 'object' ) {\n\t\t\tvar listeners = [];\n\t\t\tvar n;\n\n\t\t\tfor ( n in eventName ) {\n\t\t\t\tif ( eventName.hasOwnProperty( n ) ) {\n\t\t\t\t\tlisteners.push( this.on( n, eventName[ n ] ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcancel: function () { listeners.forEach( function ( l ) { return l.cancel(); } ); }\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple space-separated event names\n\t\tvar eventNames = eventName.split( ' ' ).map( trim ).filter( notEmptyString );\n\n\t\teventNames.forEach( function ( eventName ) {\n\t\t\t( this$1._subs[ eventName ] || ( this$1._subs[ eventName ] = [] ) ).push( { callback: callback } );\n\t\t});\n\n\t\treturn {\n\t\t\tcancel: function () { return eventNames.forEach( function ( n ) { return this$1.off( n, callback ); } ); }\n\t\t};\n\t}\n\n\tfunction Ractive$once ( eventName, handler ) {\n\t\tvar listener = this.on( eventName, function () {\n\t\t\thandler.apply( this, arguments );\n\t\t\tlistener.cancel();\n\t\t});\n\n\t\t// so we can still do listener.cancel() manually\n\t\treturn listener;\n\t}\n\n\tvar pop$1 = makeArrayMethod( 'pop' ).path;\n\n\tvar push$1 = makeArrayMethod( 'push' ).path;\n\n\tvar PREFIX = '/* Ractive.js component styles */';\n\n\t// Holds current definitions of styles.\n\tvar styleDefinitions = [];\n\n\t// Flag to tell if we need to update the CSS\n\tvar isDirty = false;\n\n\t// These only make sense on the browser. See additional setup below.\n\tvar styleElement = null;\n\tvar useCssText = null;\n\n\tfunction addCSS( styleDefinition ) {\n\t\tstyleDefinitions.push( styleDefinition );\n\t\tisDirty = true;\n\t}\n\n\tfunction applyCSS() {\n\n\t\t// Apply only seems to make sense when we're in the DOM. Server-side renders\n\t\t// can call toCSS to get the updated CSS.\n\t\tif ( !doc || !isDirty ) return;\n\n\t\tif ( useCssText ) {\n\t\t\tstyleElement.styleSheet.cssText = getCSS( null );\n\t\t} else {\n\t\t\tstyleElement.innerHTML = getCSS( null );\n\t\t}\n\n\t\tisDirty = false;\n\t}\n\n\tfunction getCSS( cssIds ) {\n\n\t\tvar filteredStyleDefinitions = cssIds ? styleDefinitions.filter( function ( style ) { return ~cssIds.indexOf( style.id ); } ) : styleDefinitions;\n\n\t\treturn filteredStyleDefinitions.reduce( function ( styles, style ) { return (\"\" + styles + \"\\n\\n/* {\" + (style.id) + \"} */\\n\" + (style.styles)); }, PREFIX );\n\n\t}\n\n\t// If we're on the browser, additional setup needed.\n\tif ( doc && ( !styleElement || !styleElement.parentNode ) ) {\n\n\t\tstyleElement = doc.createElement( 'style' );\n\t\tstyleElement.type = 'text/css';\n\n\t\tdoc.getElementsByTagName( 'head' )[ 0 ].appendChild( styleElement );\n\n\t\tuseCssText = !!styleElement.styleSheet;\n\t}\n\n\tvar renderHook = new Hook( 'render' );\n\tvar completeHook = new Hook( 'complete' );\n\n\tfunction render$1 ( ractive, target, anchor, occupants ) {\n\t\t// if `noIntro` is `true`, temporarily disable transitions\n\t\tvar transitionsEnabled = ractive.transitionsEnabled;\n\t\tif ( ractive.noIntro ) ractive.transitionsEnabled = false;\n\n\t\tvar promise = runloop.start( ractive, true );\n\t\trunloop.scheduleTask( function () { return renderHook.fire( ractive ); }, true );\n\n\t\tif ( ractive.fragment.rendered ) {\n\t\t\tthrow new Error( 'You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first' );\n\t\t}\n\n\t\tanchor = getElement( anchor ) || ractive.anchor;\n\n\t\tractive.el = target;\n\t\tractive.anchor = anchor;\n\n\t\t// ensure encapsulated CSS is up-to-date\n\t\tif ( ractive.cssId ) applyCSS();\n\n\t\tif ( target ) {\n\t\t\t( target.__ractive_instances__ || ( target.__ractive_instances__ = [] ) ).push( ractive );\n\n\t\t\tif ( anchor ) {\n\t\t\t\tvar docFrag = doc.createDocumentFragment();\n\t\t\t\tractive.fragment.render( docFrag );\n\t\t\t\ttarget.insertBefore( docFrag, anchor );\n\t\t\t} else {\n\t\t\t\tractive.fragment.render( target, occupants );\n\t\t\t}\n\t\t}\n\n\t\trunloop.end();\n\t\tractive.transitionsEnabled = transitionsEnabled;\n\n\t\treturn promise.then( function () { return completeHook.fire( ractive ); } );\n\t}\n\n\tfunction Ractive$render ( target, anchor ) {\n\t\tif ( this.torndown ) {\n\t\t\twarnIfDebug( 'ractive.render() was called on a Ractive instance that was already torn down' );\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\ttarget = getElement( target ) || this.el;\n\n\t\tif ( !this.append && target ) {\n\t\t\t// Teardown any existing instances *before* trying to set up the new one -\n\t\t\t// avoids certain weird bugs\n\t\t\tvar others = target.__ractive_instances__;\n\t\t\tif ( others ) others.forEach( teardown );\n\n\t\t\t// make sure we are the only occupants\n\t\t\tif ( !this.enhance ) {\n\t\t\t\ttarget.innerHTML = ''; // TODO is this quicker than removeChild? Initial research inconclusive\n\t\t\t}\n\t\t}\n\n\t\tvar occupants = this.enhance ? toArray( target.childNodes ) : null;\n\t\tvar promise = render$1( this, target, anchor, occupants );\n\n\t\tif ( occupants ) {\n\t\t\twhile ( occupants.length ) target.removeChild( occupants.pop() );\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\tvar adaptConfigurator = {\n\t\textend: function ( Parent, proto, options ) {\n\t\t\tproto.adapt = combine( proto.adapt, ensureArray( options.adapt ) );\n\t\t},\n\n\t\tinit: function () {}\n\t};\n\n\tfunction combine ( a, b ) {\n\t\tvar c = a.slice();\n\t\tvar i = b.length;\n\n\t\twhile ( i-- ) {\n\t\t\tif ( !~c.indexOf( b[i] ) ) {\n\t\t\t\tc.push( b[i] );\n\t\t\t}\n\t\t}\n\n\t\treturn c;\n\t}\n\n\tvar remove = /\\/\\*(?:[\\s\\S]*?)\\*\\//g;\n\tvar escape = /url\\(\\s*(['\"])(?:\\\\[\\s\\S]|(?!\\1).)*\\1\\s*\\)|url\\((?:\\\\[\\s\\S]|[^)])*\\)|(['\"])(?:\\\\[\\s\\S]|(?!\\2).)*\\2/gi;\n\tvar value = /\\0(\\d+)/g;\n\n\t// Removes comments and strings from the given CSS to make it easier to parse.\n\t// Callback receives the cleaned CSS and a function which can be used to put\n\t// the removed strings back in place after parsing is done.\n\tfunction cleanCss ( css, callback, additionalReplaceRules ) {\n\t\tif ( additionalReplaceRules === void 0 ) additionalReplaceRules = [];\n\n\t\tvar values = [];\n\t\tvar reconstruct = function ( css ) { return css.replace( value, function ( match, n ) { return values[ n ]; } ); };\n\t\tcss = css.replace( escape, function ( match ) { return (\"\\u0000\" + (values.push( match ) - 1)); }).replace( remove, '' );\n\n\t\tadditionalReplaceRules.forEach( function ( pattern ) {\n\t\t\tcss = css.replace( pattern, function ( match ) { return (\"\\u0000\" + (values.push( match ) - 1)); } );\n\t\t});\n\n\t\treturn callback( css, reconstruct );\n\t}\n\n\tvar selectorsPattern = /(?:^|\\}|\\{)\\s*([^\\{\\}\\0]+)\\s*(?=\\{)/g;\n\tvar keyframesDeclarationPattern = /@keyframes\\s+[^\\{\\}]+\\s*\\{(?:[^{}]+|\\{[^{}]+})*}/gi;\n\tvar selectorUnitPattern = /((?:(?:\\[[^\\]]+\\])|(?:[^\\s\\+\\>~:]))+)((?:::?[^\\s\\+\\>\\~\\(:]+(?:\\([^\\)]+\\))?)*\\s*[\\s\\+\\>\\~]?)\\s*/g;\n\tvar excludePattern = /^(?:@|\\d+%)/;\n\tvar dataRvcGuidPattern = /\\[data-ractive-css~=\"\\{[a-z0-9-]+\\}\"]/g;\n\n\tfunction trim$1 ( str ) {\n\t\treturn str.trim();\n\t}\n\n\tfunction extractString ( unit ) {\n\t\treturn unit.str;\n\t}\n\n\tfunction transformSelector ( selector, parent ) {\n\t\tvar selectorUnits = [];\n\t\tvar match;\n\n\t\twhile ( match = selectorUnitPattern.exec( selector ) ) {\n\t\t\tselectorUnits.push({\n\t\t\t\tstr: match[0],\n\t\t\t\tbase: match[1],\n\t\t\t\tmodifiers: match[2]\n\t\t\t});\n\t\t}\n\n\t\t// For each simple selector within the selector, we need to create a version\n\t\t// that a) combines with the id, and b) is inside the id\n\t\tvar base = selectorUnits.map( extractString );\n\n\t\tvar transformed = [];\n\t\tvar i = selectorUnits.length;\n\n\t\twhile ( i-- ) {\n\t\t\tvar appended = base.slice();\n\n\t\t\t// Pseudo-selectors should go after the attribute selector\n\t\t\tvar unit = selectorUnits[i];\n\t\t\tappended[i] = unit.base + parent + unit.modifiers || '';\n\n\t\t\tvar prepended = base.slice();\n\t\t\tprepended[i] = parent + ' ' + prepended[i];\n\n\t\t\ttransformed.push( appended.join( ' ' ), prepended.join( ' ' ) );\n\t\t}\n\n\t\treturn transformed.join( ', ' );\n\t}\n\n\tfunction transformCss ( css, id ) {\n\t\tvar dataAttr = \"[data-ractive-css~=\\\"{\" + id + \"}\\\"]\";\n\n\t\tvar transformed;\n\n\t\tif ( dataRvcGuidPattern.test( css ) ) {\n\t\t\ttransformed = css.replace( dataRvcGuidPattern, dataAttr );\n\t\t} else {\n\t\t\ttransformed = cleanCss( css, function ( css, reconstruct ) {\n\t\t\t\tcss = css.replace( selectorsPattern, function ( match, $1 ) {\n\t\t\t\t\t// don't transform at-rules and keyframe declarations\n\t\t\t\t\tif ( excludePattern.test( $1 ) ) return match;\n\n\t\t\t\t\tvar selectors = $1.split( ',' ).map( trim$1 );\n\t\t\t\t\tvar transformed = selectors\n\t\t\t\t\t\t.map( function ( selector ) { return transformSelector( selector, dataAttr ); } )\n\t\t\t\t\t\t.join( ', ' ) + ' ';\n\n\t\t\t\t\treturn match.replace( $1, transformed );\n\t\t\t\t});\n\n\t\t\t\treturn reconstruct( css );\n\t\t\t}, [ keyframesDeclarationPattern ]);\n\t\t}\n\n\t\treturn transformed;\n\t}\n\n\tfunction s4() {\n\t\treturn Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n\t}\n\n\tfunction uuid() {\n\t\treturn s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n\t}\n\n\tvar cssConfigurator = {\n\t\tname: 'css',\n\n\t\t// Called when creating a new component definition\n\t\textend: function ( Parent, proto, options ) {\n\t\t\tif ( !options.css ) return;\n\n\t\t\tvar id = uuid();\n\t\t\tvar styles = options.noCssTransform ? options.css : transformCss( options.css, id );\n\n\t\t\tproto.cssId = id;\n\n\t\t\taddCSS( { id: id, styles: styles } );\n\n\t\t},\n\n\t\t// Called when creating a new component instance\n\t\tinit: function ( Parent, target, options ) {\n\t\t\tif ( !options.css ) return;\n\n\t\t\twarnIfDebug( (\"\\nThe css option is currently not supported on a per-instance basis and will be discarded. Instead, we recommend instantiating from a component definition with a css option.\\n\\nconst Component = Ractive.extend({\\n\\t...\\n\\tcss: '/* your css */',\\n\\t...\\n});\\n\\nconst componentInstance = new Component({ ... })\\n\\t\\t\") );\n\t\t}\n\n\t};\n\n\tfunction validate ( data ) {\n\t\t// Warn if userOptions.data is a non-POJO\n\t\tif ( data && data.constructor !== Object ) {\n\t\t\tif ( typeof data === 'function' ) {\n\t\t\t\t// TODO do we need to support this in the new Ractive() case?\n\t\t\t} else if ( typeof data !== 'object' ) {\n\t\t\t\tfatal( (\"data option must be an object or a function, `\" + data + \"` is not valid\") );\n\t\t\t} else {\n\t\t\t\twarnIfDebug( 'If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged' );\n\t\t\t}\n\t\t}\n\t}\n\n\tvar dataConfigurator = {\n\t\tname: 'data',\n\n\t\textend: function ( Parent, proto, options ) {\n\t\t\tvar key;\n\t\t\tvar value;\n\n\t\t\t// check for non-primitives, which could cause mutation-related bugs\n\t\t\tif ( options.data && isObject( options.data ) ) {\n\t\t\t\tfor ( key in options.data ) {\n\t\t\t\t\tvalue = options.data[ key ];\n\n\t\t\t\t\tif ( value && typeof value === 'object' ) {\n\t\t\t\t\t\tif ( isObject( value ) || isArray( value ) ) {\n\t\t\t\t\t\t\twarnIfDebug( (\"Passing a `data` option with object and array properties to Ractive.extend() is discouraged, as mutating them is likely to cause bugs. Consider using a data function instead:\\n\\n  // this...\\n  data: function () {\\n    return {\\n      myObject: {}\\n    };\\n  })\\n\\n  // instead of this:\\n  data: {\\n    myObject: {}\\n  }\") );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproto.data = combine$1( proto.data, options.data );\n\t\t},\n\n\t\tinit: function ( Parent, ractive, options ) {\n\t\t\tvar result = combine$1( Parent.prototype.data, options.data );\n\n\t\t\tif ( typeof result === 'function' ) result = result.call( ractive );\n\n\t\t\t// bind functions to the ractive instance at the top level,\n\t\t\t// unless it's a non-POJO (in which case alarm bells should ring)\n\t\t\tif ( result && result.constructor === Object ) {\n\t\t\t\tfor ( var prop in result ) {\n\t\t\t\t\tif ( typeof result[ prop ] === 'function' ) result[ prop ] = bind( result[ prop ], ractive );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result || {};\n\t\t},\n\n\t\treset: function ( ractive ) {\n\t\t\tvar result = this.init( ractive.constructor, ractive, ractive.viewmodel );\n\t\t\tractive.viewmodel.root.set( result );\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tfunction combine$1 ( parentValue, childValue ) {\n\t\tvalidate( childValue );\n\n\t\tvar parentIsFn = typeof parentValue === 'function';\n\t\tvar childIsFn = typeof childValue === 'function';\n\n\t\t// Very important, otherwise child instance can become\n\t\t// the default data object on Ractive or a component.\n\t\t// then ractive.set() ends up setting on the prototype!\n\t\tif ( !childValue && !parentIsFn ) {\n\t\t\tchildValue = {};\n\t\t}\n\n\t\t// Fast path, where we just need to copy properties from\n\t\t// parent to child\n\t\tif ( !parentIsFn && !childIsFn ) {\n\t\t\treturn fromProperties( childValue, parentValue );\n\t\t}\n\n\t\treturn function () {\n\t\t\tvar child = childIsFn ? callDataFunction( childValue, this ) : childValue;\n\t\t\tvar parent = parentIsFn ? callDataFunction( parentValue, this ) : parentValue;\n\n\t\t\treturn fromProperties( child, parent );\n\t\t};\n\t}\n\n\tfunction callDataFunction ( fn, context ) {\n\t\tvar data = fn.call( context );\n\n\t\tif ( !data ) return;\n\n\t\tif ( typeof data !== 'object' ) {\n\t\t\tfatal( 'Data function must return an object' );\n\t\t}\n\n\t\tif ( data.constructor !== Object ) {\n\t\t\twarnOnceIfDebug( 'Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged' );\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tfunction fromProperties ( primary, secondary ) {\n\t\tif ( primary && secondary ) {\n\t\t\tfor ( var key in secondary ) {\n\t\t\t\tif ( !( key in primary ) ) {\n\t\t\t\t\tprimary[ key ] = secondary[ key ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn primary;\n\t\t}\n\n\t\treturn primary || secondary;\n\t}\n\n\tvar TEMPLATE_VERSION = 4;\n\n\tvar pattern = /\\$\\{([^\\}]+)\\}/g;\n\n\tfunction fromExpression ( body, length ) {\n\t\tif ( length === void 0 ) length = 0;\n\n\t\tvar args = new Array( length );\n\n\t\twhile ( length-- ) {\n\t\t\targs[length] = \"_\" + length;\n\t\t}\n\n\t\t// Functions created directly with new Function() look like this:\n\t\t//     function anonymous (_0 /**/) { return _0*2 }\n\t\t//\n\t\t// With this workaround, we get a little more compact:\n\t\t//     function (_0){return _0*2}\n\t\treturn new Function( [], (\"return function (\" + (args.join(',')) + \"){return(\" + body + \");};\") )();\n\t}\n\n\tfunction fromComputationString ( str, bindTo ) {\n\t\tvar hasThis;\n\n\t\tvar functionBody = 'return (' + str.replace( pattern, function ( match, keypath ) {\n\t\t\thasThis = true;\n\t\t\treturn (\"__ractive.get(\\\"\" + keypath + \"\\\")\");\n\t\t}) + ');';\n\n\t\tif ( hasThis ) functionBody = \"var __ractive = this; \" + functionBody;\n\t\tvar fn = new Function( functionBody );\n\t\treturn hasThis ? fn.bind( bindTo ) : fn;\n\t}\n\n\tvar functions = create( null );\n\n\tfunction getFunction ( str, i ) {\n\t\tif ( functions[ str ] ) return functions[ str ];\n\t\treturn functions[ str ] = createFunction( str, i );\n\t}\n\n\tfunction addFunctions( template ) {\n\t\tif ( !template ) return;\n\n\t\tvar exp = template.e;\n\n\t\tif ( !exp ) return;\n\n\t\tObject.keys( exp ).forEach( function ( str ) {\n\t\t\tif ( functions[ str ] ) return;\n\t\t\tfunctions[ str ] = exp[ str ];\n\t\t});\n\t}\n\n\tvar Parser;\n\tvar ParseError;\n\tvar leadingWhitespace = /^\\s+/;\n\tParseError = function ( message ) {\n\t\tthis.name = 'ParseError';\n\t\tthis.message = message;\n\t\ttry {\n\t\t\tthrow new Error(message);\n\t\t} catch (e) {\n\t\t\tthis.stack = e.stack;\n\t\t}\n\t};\n\n\tParseError.prototype = Error.prototype;\n\n\tParser = function ( str, options ) {\n\t\tvar this$1 = this;\n\n\t\tvar items, item, lineStart = 0;\n\n\t\tthis.str = str;\n\t\tthis.options = options || {};\n\t\tthis.pos = 0;\n\n\t\tthis.lines = this.str.split( '\\n' );\n\t\tthis.lineEnds = this.lines.map( function ( line ) {\n\t\t\tvar lineEnd = lineStart + line.length + 1; // +1 for the newline\n\n\t\t\tlineStart = lineEnd;\n\t\t\treturn lineEnd;\n\t\t}, 0 );\n\n\t\t// Custom init logic\n\t\tif ( this.init ) this.init( str, options );\n\n\t\titems = [];\n\n\t\twhile ( ( this$1.pos < this$1.str.length ) && ( item = this$1.read() ) ) {\n\t\t\titems.push( item );\n\t\t}\n\n\t\tthis.leftover = this.remaining();\n\t\tthis.result = this.postProcess ? this.postProcess( items, options ) : items;\n\t};\n\n\tParser.prototype = {\n\t\tread: function ( converters ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar pos, i, len, item;\n\n\t\t\tif ( !converters ) converters = this.converters;\n\n\t\t\tpos = this.pos;\n\n\t\t\tlen = converters.length;\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tthis$1.pos = pos; // reset for each attempt\n\n\t\t\t\tif ( item = converters[i]( this$1 ) ) {\n\t\t\t\t\treturn item;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\n\t\tgetContextMessage: function ( pos, message ) {\n\t\t\tvar ref = this.getLinePos( pos ), lineNum = ref[0], columnNum = ref[1];\n\t\t\tif ( this.options.contextLines === -1 ) {\n\t\t\t\treturn [ lineNum, columnNum, (\"\" + message + \" at line \" + lineNum + \" character \" + columnNum) ];\n\t\t\t}\n\n\t\t\tvar line = this.lines[ lineNum - 1 ];\n\n\t\t\tvar contextUp = '';\n\t\t\tvar contextDown = '';\n\t\t\tif ( this.options.contextLines ) {\n\t\t\t\tvar start = lineNum - 1 - this.options.contextLines < 0 ? 0 : lineNum - 1 - this.options.contextLines;\n\t\t\t\tcontextUp = this.lines.slice( start, lineNum - 1 - start ).join( '\\n' ).replace( /\\t/g, '  ' );\n\t\t\t\tcontextDown = this.lines.slice( lineNum, lineNum + this.options.contextLines ).join( '\\n' ).replace( /\\t/g, '  ' );\n\t\t\t\tif ( contextUp ) {\n\t\t\t\t\tcontextUp += '\\n';\n\t\t\t\t}\n\t\t\t\tif ( contextDown ) {\n\t\t\t\t\tcontextDown = '\\n' + contextDown;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar numTabs = 0;\n\t\t\tvar annotation = contextUp + line.replace( /\\t/g, function ( match, char ) {\n\t\t\t\tif ( char < columnNum ) {\n\t\t\t\t\tnumTabs += 1;\n\t\t\t\t}\n\n\t\t\t\treturn '  ';\n\t\t\t}) + '\\n' + new Array( columnNum + numTabs ).join( ' ' ) + '^----' + contextDown;\n\n\t\t\treturn [ lineNum, columnNum, (\"\" + message + \" at line \" + lineNum + \" character \" + columnNum + \":\\n\" + annotation) ];\n\t\t},\n\n\t\tgetLinePos: function ( char ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar lineNum = 0, lineStart = 0, columnNum;\n\n\t\t\twhile ( char >= this$1.lineEnds[ lineNum ] ) {\n\t\t\t\tlineStart = this$1.lineEnds[ lineNum ];\n\t\t\t\tlineNum += 1;\n\t\t\t}\n\n\t\t\tcolumnNum = char - lineStart;\n\t\t\treturn [ lineNum + 1, columnNum + 1, char ]; // line/col should be one-based, not zero-based!\n\t\t},\n\n\t\terror: function ( message ) {\n\t\t\tvar ref = this.getContextMessage( this.pos, message ), lineNum = ref[0], columnNum = ref[1], msg = ref[2];\n\n\t\t\tvar error = new ParseError( msg );\n\n\t\t\terror.line = lineNum;\n\t\t\terror.character = columnNum;\n\t\t\terror.shortMessage = message;\n\n\t\t\tthrow error;\n\t\t},\n\n\t\tmatchString: function ( string ) {\n\t\t\tif ( this.str.substr( this.pos, string.length ) === string ) {\n\t\t\t\tthis.pos += string.length;\n\t\t\t\treturn string;\n\t\t\t}\n\t\t},\n\n\t\tmatchPattern: function ( pattern ) {\n\t\t\tvar match;\n\n\t\t\tif ( match = pattern.exec( this.remaining() ) ) {\n\t\t\t\tthis.pos += match[0].length;\n\t\t\t\treturn match[1] || match[0];\n\t\t\t}\n\t\t},\n\n\t\tallowWhitespace: function () {\n\t\t\tthis.matchPattern( leadingWhitespace );\n\t\t},\n\n\t\tremaining: function () {\n\t\t\treturn this.str.substring( this.pos );\n\t\t},\n\n\t\tnextChar: function () {\n\t\t\treturn this.str.charAt( this.pos );\n\t\t}\n\t};\n\n\tParser.extend = function ( proto ) {\n\t\tvar Parent = this, Child, key;\n\n\t\tChild = function ( str, options ) {\n\t\t\tParser.call( this, str, options );\n\t\t};\n\n\t\tChild.prototype = create( Parent.prototype );\n\n\t\tfor ( key in proto ) {\n\t\t\tif ( hasOwn.call( proto, key ) ) {\n\t\t\t\tChild.prototype[ key ] = proto[ key ];\n\t\t\t}\n\t\t}\n\n\t\tChild.extend = Parser.extend;\n\t\treturn Child;\n\t};\n\n\tvar Parser$1 = Parser;\n\n\tvar TEXT              = 1;\n\tvar INTERPOLATOR      = 2;\n\tvar TRIPLE            = 3;\n\tvar SECTION           = 4;\n\tvar INVERTED          = 5;\n\tvar CLOSING           = 6;\n\tvar ELEMENT           = 7;\n\tvar PARTIAL           = 8;\n\tvar COMMENT           = 9;\n\tvar DELIMCHANGE       = 10;\n\tvar ATTRIBUTE         = 13;\n\tvar CLOSING_TAG       = 14;\n\tvar COMPONENT         = 15;\n\tvar YIELDER           = 16;\n\tvar INLINE_PARTIAL    = 17;\n\tvar DOCTYPE           = 18;\n\tvar ALIAS             = 19;\n\n\tvar NUMBER_LITERAL    = 20;\n\tvar STRING_LITERAL    = 21;\n\tvar ARRAY_LITERAL     = 22;\n\tvar OBJECT_LITERAL    = 23;\n\tvar BOOLEAN_LITERAL   = 24;\n\tvar REGEXP_LITERAL    = 25;\n\n\tvar GLOBAL            = 26;\n\tvar KEY_VALUE_PAIR    = 27;\n\n\n\tvar REFERENCE         = 30;\n\tvar REFINEMENT        = 31;\n\tvar MEMBER            = 32;\n\tvar PREFIX_OPERATOR   = 33;\n\tvar BRACKETED         = 34;\n\tvar CONDITIONAL       = 35;\n\tvar INFIX_OPERATOR    = 36;\n\n\tvar INVOCATION        = 40;\n\n\tvar SECTION_IF        = 50;\n\tvar SECTION_UNLESS    = 51;\n\tvar SECTION_EACH      = 52;\n\tvar SECTION_WITH      = 53;\n\tvar SECTION_IF_WITH   = 54;\n\n\tvar ELSE              = 60;\n\tvar ELSEIF            = 61;\n\n\tvar EVENT             = 70;\n\tvar DECORATOR         = 71;\n\tvar TRANSITION        = 72;\n\tvar BINDING_FLAG      = 73;\n\n\tvar delimiterChangePattern = /^[^\\s=]+/;\n\tvar whitespacePattern = /^\\s+/;\n\tfunction readDelimiterChange ( parser ) {\n\t\tvar start, opening, closing;\n\n\t\tif ( !parser.matchString( '=' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tstart = parser.pos;\n\n\t\t// allow whitespace before new opening delimiter\n\t\tparser.allowWhitespace();\n\n\t\topening = parser.matchPattern( delimiterChangePattern );\n\t\tif ( !opening ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\t// allow whitespace (in fact, it's necessary...)\n\t\tif ( !parser.matchPattern( whitespacePattern ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tclosing = parser.matchPattern( delimiterChangePattern );\n\t\tif ( !closing ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\t// allow whitespace before closing '='\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '=' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\treturn [ opening, closing ];\n\t}\n\n\tvar regexpPattern = /^(\\/(?:[^\\n\\r\\u2028\\u2029/\\\\[]|\\\\.|\\[(?:[^\\n\\r\\u2028\\u2029\\]\\\\]|\\\\.)*])+\\/(?:([gimuy])(?![a-z]*\\2))*(?![a-zA-Z_$0-9]))/;\n\n\tfunction readNumberLiteral ( parser ) {\n\t\tvar result;\n\n\t\tif ( result = parser.matchPattern( regexpPattern ) ) {\n\t\t\treturn {\n\t\t\t\tt: REGEXP_LITERAL,\n\t\t\t\tv: result\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tvar pattern$1 = /[-/\\\\^$*+?.()|[\\]{}]/g;\n\n\tfunction escapeRegExp ( str ) {\n\t\treturn str.replace( pattern$1, '\\\\$&' );\n\t}\n\n\tvar regExpCache = {};\n\n\tfunction getLowestIndex ( haystack, needles ) {\n\t\treturn haystack.search( regExpCache[needles.join()] || ( regExpCache[needles.join()] = new RegExp( needles.map( escapeRegExp ).join( '|' ) ) ) );\n\t}\n\n\t// https://github.com/kangax/html-minifier/issues/63#issuecomment-37763316\n\tvar booleanAttributes = /^(allowFullscreen|async|autofocus|autoplay|checked|compact|controls|declare|default|defaultChecked|defaultMuted|defaultSelected|defer|disabled|enabled|formNoValidate|hidden|indeterminate|inert|isMap|itemScope|loop|multiple|muted|noHref|noResize|noShade|noValidate|noWrap|open|pauseOnExit|readOnly|required|reversed|scoped|seamless|selected|sortable|translate|trueSpeed|typeMustMatch|visible)$/i;\n\tvar voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;\n\n\tvar htmlEntities = { quot: 34, amp: 38, apos: 39, lt: 60, gt: 62, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169, ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174, macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190, iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221, THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252, yacute: 253, thorn: 254, yuml: 255, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, fnof: 402, circ: 710, tilde: 732, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949, zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, bull: 8226, hellip: 8230, permil: 8240, prime: 8242, Prime: 8243, lsaquo: 8249, rsaquo: 8250, oline: 8254, frasl: 8260, euro: 8364, image: 8465, weierp: 8472, real: 8476, trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744, cap: 8745, cup: 8746, 'int': 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830\t};\n\tvar controlCharacters = [ 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, 382, 376 ];\n\tvar entityPattern = new RegExp( '&(#?(?:x[\\\\w\\\\d]+|\\\\d+|' + Object.keys( htmlEntities ).join( '|' ) + '));?', 'g' );\n\tvar codePointSupport = typeof String.fromCodePoint === 'function';\n\tvar codeToChar = codePointSupport ? String.fromCodePoint : String.fromCharCode;\n\n\tfunction decodeCharacterReferences ( html ) {\n\t\treturn html.replace( entityPattern, function ( match, entity ) {\n\t\t\tvar code;\n\n\t\t\t// Handle named entities\n\t\t\tif ( entity[0] !== '#' ) {\n\t\t\t\tcode = htmlEntities[ entity ];\n\t\t\t} else if ( entity[1] === 'x' ) {\n\t\t\t\tcode = parseInt( entity.substring( 2 ), 16 );\n\t\t\t} else {\n\t\t\t\tcode = parseInt( entity.substring( 1 ), 10 );\n\t\t\t}\n\n\t\t\tif ( !code ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\treturn codeToChar( validateCode( code ) );\n\t\t});\n\t}\n\n\tvar lessThan = /</g;\n\tvar greaterThan = />/g;\n\tvar amp = /&/g;\n\tvar invalid = 65533;\n\n\tfunction escapeHtml ( str ) {\n\t\treturn str\n\t\t\t.replace( amp, '&amp;' )\n\t\t\t.replace( lessThan, '&lt;' )\n\t\t\t.replace( greaterThan, '&gt;' );\n\t}\n\n\t// some code points are verboten. If we were inserting HTML, the browser would replace the illegal\n\t// code points with alternatives in some cases - since we're bypassing that mechanism, we need\n\t// to replace them ourselves\n\t//\n\t// Source: http://en.wikipedia.org/wiki/Character_encodings_in_HTML#Illegal_characters\n\tfunction validateCode ( code ) {\n\t\tif ( !code ) {\n\t\t\treturn invalid;\n\t\t}\n\n\t\t// line feed becomes generic whitespace\n\t\tif ( code === 10 ) {\n\t\t\treturn 32;\n\t\t}\n\n\t\t// ASCII range. (Why someone would use HTML entities for ASCII characters I don't know, but...)\n\t\tif ( code < 128 ) {\n\t\t\treturn code;\n\t\t}\n\n\t\t// code points 128-159 are dealt with leniently by browsers, but they're incorrect. We need\n\t\t// to correct the mistake or we'll end up with missing € signs and so on\n\t\tif ( code <= 159 ) {\n\t\t\treturn controlCharacters[ code - 128 ];\n\t\t}\n\n\t\t// basic multilingual plane\n\t\tif ( code < 55296 ) {\n\t\t\treturn code;\n\t\t}\n\n\t\t// UTF-16 surrogate halves\n\t\tif ( code <= 57343 ) {\n\t\t\treturn invalid;\n\t\t}\n\n\t\t// rest of the basic multilingual plane\n\t\tif ( code <= 65535 ) {\n\t\t\treturn code;\n\t\t} else if ( !codePointSupport ) {\n\t\t\treturn invalid;\n\t\t}\n\n\t\t// supplementary multilingual plane 0x10000 - 0x1ffff\n\t\tif ( code >= 65536 && code <= 131071 ) {\n\t\t\treturn code;\n\t\t}\n\n\t\t// supplementary ideographic plane 0x20000 - 0x2ffff\n\t\tif ( code >= 131072 && code <= 196607 ) {\n\t\t\treturn code;\n\t\t}\n\n\t\treturn invalid;\n\t}\n\n\tvar expectedExpression = 'Expected a JavaScript expression';\n\tvar expectedParen = 'Expected closing paren';\n\n\t// bulletproof number regex from https://gist.github.com/Rich-Harris/7544330\n\tvar numberPattern = /^(?:[+-]?)0*(?:(?:(?:[1-9]\\d*)?\\.\\d+)|(?:(?:0|[1-9]\\d*)\\.)|(?:0|[1-9]\\d*))(?:[eE][+-]?\\d+)?/;\n\n\tfunction readNumberLiteral$1 ( parser ) {\n\t\tvar result;\n\n\t\tif ( result = parser.matchPattern( numberPattern ) ) {\n\t\t\treturn {\n\t\t\t\tt: NUMBER_LITERAL,\n\t\t\t\tv: result\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction readBooleanLiteral ( parser ) {\n\t\tvar remaining = parser.remaining();\n\n\t\tif ( remaining.substr( 0, 4 ) === 'true' ) {\n\t\t\tparser.pos += 4;\n\t\t\treturn {\n\t\t\t\tt: BOOLEAN_LITERAL,\n\t\t\t\tv: 'true'\n\t\t\t};\n\t\t}\n\n\t\tif ( remaining.substr( 0, 5 ) === 'false' ) {\n\t\t\tparser.pos += 5;\n\t\t\treturn {\n\t\t\t\tt: BOOLEAN_LITERAL,\n\t\t\t\tv: 'false'\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tvar stringMiddlePattern;\n\tvar escapeSequencePattern;\n\tvar lineContinuationPattern;\n\t// Match one or more characters until: \", ', \\, or EOL/EOF.\n\t// EOL/EOF is written as (?!.) (meaning there's no non-newline char next).\n\tstringMiddlePattern = /^(?=.)[^\"'\\\\]+?(?:(?!.)|(?=[\"'\\\\]))/;\n\n\t// Match one escape sequence, including the backslash.\n\tescapeSequencePattern = /^\\\\(?:['\"\\\\bfnrt]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|(?=.)[^ux0-9])/;\n\n\t// Match one ES5 line continuation (backslash + line terminator).\n\tlineContinuationPattern = /^\\\\(?:\\r\\n|[\\u000A\\u000D\\u2028\\u2029])/;\n\n\t// Helper for defining getDoubleQuotedString and getSingleQuotedString.\n\tfunction makeQuotedStringMatcher ( okQuote ) {\n\t\treturn function ( parser ) {\n\t\t\tvar literal = '\"';\n\t\t\tvar done = false;\n\t\t\tvar next;\n\n\t\t\twhile ( !done ) {\n\t\t\t\tnext = ( parser.matchPattern( stringMiddlePattern ) || parser.matchPattern( escapeSequencePattern ) ||\n\t\t\t\t\tparser.matchString( okQuote ) );\n\t\t\t\tif ( next ) {\n\t\t\t\t\tif ( next === (\"\\\"\") ) {\n\t\t\t\t\t\tliteral += \"\\\\\\\"\";\n\t\t\t\t\t} else if ( next === (\"\\\\'\") ) {\n\t\t\t\t\t\tliteral += \"'\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tliteral += next;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnext = parser.matchPattern( lineContinuationPattern );\n\t\t\t\t\tif ( next ) {\n\t\t\t\t\t\t// convert \\(newline-like) into a \\u escape, which is allowed in JSON\n\t\t\t\t\t\tliteral += '\\\\u' + ( '000' + next.charCodeAt(1).toString(16) ).slice( -4 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tliteral += '\"';\n\n\t\t\t// use JSON.parse to interpret escapes\n\t\t\treturn JSON.parse( literal );\n\t\t};\n\t}\n\n\tvar getSingleQuotedString = makeQuotedStringMatcher( (\"\\\"\") );\n\tvar getDoubleQuotedString = makeQuotedStringMatcher( (\"'\") );\n\n\tfunction readStringLiteral ( parser ) {\n\t\tvar start, string;\n\n\t\tstart = parser.pos;\n\n\t\tif ( parser.matchString( '\"' ) ) {\n\t\t\tstring = getDoubleQuotedString( parser );\n\n\t\t\tif ( !parser.matchString( '\"' ) ) {\n\t\t\t\tparser.pos = start;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tt: STRING_LITERAL,\n\t\t\t\tv: string\n\t\t\t};\n\t\t}\n\n\t\tif ( parser.matchString( (\"'\") ) ) {\n\t\t\tstring = getSingleQuotedString( parser );\n\n\t\t\tif ( !parser.matchString( (\"'\") ) ) {\n\t\t\t\tparser.pos = start;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tt: STRING_LITERAL,\n\t\t\t\tv: string\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tvar namePattern = /^[a-zA-Z_$][a-zA-Z_$0-9]*/;\n\n\tvar identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n\t// http://mathiasbynens.be/notes/javascript-properties\n\t// can be any name, string literal, or number literal\n\tfunction readKey ( parser ) {\n\t\tvar token;\n\n\t\tif ( token = readStringLiteral( parser ) ) {\n\t\t\treturn identifier.test( token.v ) ? token.v : '\"' + token.v.replace( /\"/g, '\\\\\"' ) + '\"';\n\t\t}\n\n\t\tif ( token = readNumberLiteral$1( parser ) ) {\n\t\t\treturn token.v;\n\t\t}\n\n\t\tif ( token = parser.matchPattern( namePattern ) ) {\n\t\t\treturn token;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction readKeyValuePair ( parser ) {\n\t\tvar start, key, value;\n\n\t\tstart = parser.pos;\n\n\t\t// allow whitespace between '{' and key\n\t\tparser.allowWhitespace();\n\n\t\tvar refKey = parser.nextChar() !== '\\'' && parser.nextChar() !== '\"';\n\n\t\tkey = readKey( parser );\n\t\tif ( key === null ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\t// allow whitespace between key and ':'\n\t\tparser.allowWhitespace();\n\n\t\t// es2015 shorthand property\n\t\tif ( refKey && ( parser.nextChar() === ',' || parser.nextChar() === '}' ) ) {\n\t\t\tif ( !namePattern.test( key ) ) {\n\t\t\t\tparser.error( (\"Expected a valid reference, but found '\" + key + \"' instead.\") );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tt: KEY_VALUE_PAIR,\n\t\t\t\tk: key,\n\t\t\t\tv: {\n\t\t\t\t\tt: REFERENCE,\n\t\t\t\t\tn: key\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// next character must be ':'\n\t\tif ( !parser.matchString( ':' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\t// allow whitespace between ':' and value\n\t\tparser.allowWhitespace();\n\n\t\t// next expression must be a, well... expression\n\t\tvalue = readExpression( parser );\n\t\tif ( value === null ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tt: KEY_VALUE_PAIR,\n\t\t\tk: key,\n\t\t\tv: value\n\t\t};\n\t}\n\n\tfunction readKeyValuePairs ( parser ) {\n\t\tvar start, pairs, pair, keyValuePairs;\n\n\t\tstart = parser.pos;\n\n\t\tpair = readKeyValuePair( parser );\n\t\tif ( pair === null ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tpairs = [ pair ];\n\n\t\tif ( parser.matchString( ',' ) ) {\n\t\t\tkeyValuePairs = readKeyValuePairs( parser );\n\n\t\t\tif ( !keyValuePairs ) {\n\t\t\t\tparser.pos = start;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn pairs.concat( keyValuePairs );\n\t\t}\n\n\t\treturn pairs;\n\t}\n\n\tfunction readObjectLiteral ( parser ) {\n\t\tvar start, keyValuePairs;\n\n\t\tstart = parser.pos;\n\n\t\t// allow whitespace\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '{' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tkeyValuePairs = readKeyValuePairs( parser );\n\n\t\t// allow whitespace between final value and '}'\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '}' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tt: OBJECT_LITERAL,\n\t\t\tm: keyValuePairs\n\t\t};\n\t}\n\n\tfunction readExpressionList ( parser ) {\n\t\tparser.allowWhitespace();\n\n\t\tvar expr = readExpression( parser );\n\n\t\tif ( expr === null ) return null;\n\n\t\tvar expressions = [ expr ];\n\n\t\t// allow whitespace between expression and ','\n\t\tparser.allowWhitespace();\n\n\t\tif ( parser.matchString( ',' ) ) {\n\t\t\tvar next = readExpressionList( parser );\n\t\t\tif ( next === null ) parser.error( expectedExpression );\n\n\t\t\texpressions.push.apply( expressions, next );\n\t\t}\n\n\t\treturn expressions;\n\t}\n\n\tfunction readArrayLiteral ( parser ) {\n\t\tvar start, expressionList;\n\n\t\tstart = parser.pos;\n\n\t\t// allow whitespace before '['\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '[' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\texpressionList = readExpressionList( parser );\n\n\t\tif ( !parser.matchString( ']' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tt: ARRAY_LITERAL,\n\t\t\tm: expressionList\n\t\t};\n\t}\n\n\tfunction readLiteral ( parser ) {\n\t\treturn readNumberLiteral$1( parser )  ||\n\t\t       readBooleanLiteral( parser ) ||\n\t\t       readStringLiteral( parser )  ||\n\t\t       readObjectLiteral( parser )  ||\n\t\t       readArrayLiteral( parser )   ||\n\t\t       readNumberLiteral( parser );\n\t}\n\n\tvar prefixPattern = /^(?:~\\/|(?:\\.\\.\\/)+|\\.\\/(?:\\.\\.\\/)*|\\.)/;\n\tvar globals;\n\tvar keywords;\n\t// if a reference is a browser global, we don't deference it later, so it needs special treatment\n\tglobals = /^(?:Array|console|Date|RegExp|decodeURIComponent|decodeURI|encodeURIComponent|encodeURI|isFinite|isNaN|parseFloat|parseInt|JSON|Math|NaN|undefined|null|Object|Number|String|Boolean)\\b/;\n\n\t// keywords are not valid references, with the exception of `this`\n\tkeywords = /^(?:break|case|catch|continue|debugger|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|var|void|while|with)$/;\n\n\tvar legalReference = /^(?:[a-zA-Z$_0-9]|\\\\\\.)+(?:(?:\\.(?:[a-zA-Z$_0-9]|\\\\\\.)+)|(?:\\[[0-9]+\\]))*/;\n\tvar relaxedName = /^[a-zA-Z_$][-\\/a-zA-Z_$0-9]*/;\n\tvar specials = /^@(?:keypath|rootpath|index|key|this|global)/;\n\tvar specialCall = /^\\s*\\(/;\n\tvar spreadPattern = /^\\s*\\.{3}/;\n\n\tfunction readReference ( parser ) {\n\t\tvar startPos, prefix, name, global, reference, fullLength, lastDotIndex, spread;\n\n\t\tstartPos = parser.pos;\n\n\t\tname = parser.matchPattern( specials );\n\n\t\tif ( name === '@keypath' || name === '@rootpath' ) {\n\t\t\tif ( parser.matchPattern( specialCall ) ) {\n\t\t\t\tvar ref = readReference( parser );\n\t\t\t\tif ( !ref ) parser.error( (\"Expected a valid reference for a keypath expression\") );\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\tif ( !parser.matchString( ')' ) ) parser.error( (\"Unclosed keypath expression\") );\n\t\t\t\tname += \"(\" + (ref.n) + \")\";\n\t\t\t}\n\t\t}\n\n\t\tspread = !name && parser.spreadArgs && parser.matchPattern( spreadPattern );\n\n\t\tif ( !name ) {\n\t\t\tprefix = parser.matchPattern( prefixPattern ) || '';\n\t\t\tname = ( !prefix && parser.relaxedNames && parser.matchPattern( relaxedName ) ) ||\n\t\t\t       parser.matchPattern( legalReference );\n\n\t\t\tif ( !name && prefix === '.' ) {\n\t\t\t\tprefix = '';\n\t\t\t\tname = '.';\n\t\t\t} else if ( !name && prefix ) {\n\t\t\t\tname = prefix;\n\t\t\t\tprefix = '';\n\t\t\t}\n\t\t}\n\n\t\tif ( !name ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// bug out if it's a keyword (exception for ancestor/restricted refs - see https://github.com/ractivejs/ractive/issues/1497)\n\t\tif ( !prefix && !parser.relaxedNames && keywords.test( name ) ) {\n\t\t\tparser.pos = startPos;\n\t\t\treturn null;\n\t\t}\n\n\t\t// if this is a browser global, stop here\n\t\tif ( !prefix && globals.test( name ) ) {\n\t\t\tglobal = globals.exec( name )[0];\n\t\t\tparser.pos = startPos + global.length;\n\n\t\t\treturn {\n\t\t\t\tt: GLOBAL,\n\t\t\t\tv: ( spread ? '...' : '' ) + global\n\t\t\t};\n\t\t}\n\n\t\tfullLength = ( spread ? 3 : 0 ) + ( prefix || '' ).length + name.length;\n\t\treference = ( prefix || '' ) + normalise( name );\n\n\t\tif ( parser.matchString( '(' ) ) {\n\t\t\t// if this is a method invocation (as opposed to a function) we need\n\t\t\t// to strip the method name from the reference combo, else the context\n\t\t\t// will be wrong\n\t\t\t// but only if the reference was actually a member and not a refinement\n\t\t\tlastDotIndex = reference.lastIndexOf( '.' );\n\t\t\tif ( lastDotIndex !== -1 && name[ name.length - 1 ] !== ']' ) {\n\t\t\t\tvar refLength = reference.length;\n\t\t\t\treference = reference.substr( 0, lastDotIndex );\n\t\t\t\tparser.pos = startPos + (fullLength - ( refLength - lastDotIndex ) );\n\t\t\t} else {\n\t\t\t\tparser.pos -= 1;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tt: REFERENCE,\n\t\t\tn: ( spread ? '...' : '' ) + reference.replace( /^this\\./, './' ).replace( /^this$/, '.' )\n\t\t};\n\t}\n\n\tfunction readBracketedExpression ( parser ) {\n\t\tif ( !parser.matchString( '(' ) ) return null;\n\n\t\tparser.allowWhitespace();\n\n\t\tvar expr = readExpression( parser );\n\n\t\tif ( !expr ) parser.error( expectedExpression );\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( ')' ) ) parser.error( expectedParen );\n\n\t\treturn {\n\t\t\tt: BRACKETED,\n\t\t\tx: expr\n\t\t};\n\t}\n\n\tfunction readPrimary ( parser ) {\n\t\treturn readLiteral( parser )\n\t\t\t|| readReference( parser )\n\t\t\t|| readBracketedExpression( parser );\n\t}\n\n\tfunction readRefinement ( parser ) {\n\t\t// some things call for strict refinement (partial names), meaning no space between reference and refinement\n\t\tif ( !parser.strictRefinement ) {\n\t\t\tparser.allowWhitespace();\n\t\t}\n\n\t\t// \".\" name\n\t\tif ( parser.matchString( '.' ) ) {\n\t\t\tparser.allowWhitespace();\n\n\t\t\tvar name = parser.matchPattern( namePattern );\n\t\t\tif ( name ) {\n\t\t\t\treturn {\n\t\t\t\t\tt: REFINEMENT,\n\t\t\t\t\tn: name\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tparser.error( 'Expected a property name' );\n\t\t}\n\n\t\t// \"[\" expression \"]\"\n\t\tif ( parser.matchString( '[' ) ) {\n\t\t\tparser.allowWhitespace();\n\n\t\t\tvar expr = readExpression( parser );\n\t\t\tif ( !expr ) parser.error( expectedExpression );\n\n\t\t\tparser.allowWhitespace();\n\n\t\t\tif ( !parser.matchString( ']' ) ) parser.error( (\"Expected ']'\") );\n\n\t\t\treturn {\n\t\t\t\tt: REFINEMENT,\n\t\t\t\tx: expr\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction readMemberOrInvocation ( parser ) {\n\t\tvar expression = readPrimary( parser );\n\n\t\tif ( !expression ) return null;\n\n\t\twhile ( expression ) {\n\t\t\tvar refinement = readRefinement( parser );\n\t\t\tif ( refinement ) {\n\t\t\t\texpression = {\n\t\t\t\t\tt: MEMBER,\n\t\t\t\t\tx: expression,\n\t\t\t\t\tr: refinement\n\t\t\t\t};\n\t\t\t}\n\n\t\t\telse if ( parser.matchString( '(' ) ) {\n\t\t\t\tparser.allowWhitespace();\n\t\t\t\tvar start = parser.spreadArgs;\n\t\t\t\tparser.spreadArgs = true;\n\t\t\t\tvar expressionList = readExpressionList( parser );\n\t\t\t\tparser.spreadArgs = start;\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\tif ( !parser.matchString( ')' ) ) {\n\t\t\t\t\tparser.error( expectedParen );\n\t\t\t\t}\n\n\t\t\t\texpression = {\n\t\t\t\t\tt: INVOCATION,\n\t\t\t\t\tx: expression\n\t\t\t\t};\n\n\t\t\t\tif ( expressionList ) expression.o = expressionList;\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn expression;\n\t}\n\n\tvar readTypeOf;\n\tvar makePrefixSequenceMatcher;\n\tmakePrefixSequenceMatcher = function ( symbol, fallthrough ) {\n\t\treturn function ( parser ) {\n\t\t\tvar expression;\n\n\t\t\tif ( expression = fallthrough( parser ) ) {\n\t\t\t\treturn expression;\n\t\t\t}\n\n\t\t\tif ( !parser.matchString( symbol ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tparser.allowWhitespace();\n\n\t\t\texpression = readExpression( parser );\n\t\t\tif ( !expression ) {\n\t\t\t\tparser.error( expectedExpression );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ts: symbol,\n\t\t\t\to: expression,\n\t\t\t\tt: PREFIX_OPERATOR\n\t\t\t};\n\t\t};\n\t};\n\n\t// create all prefix sequence matchers, return readTypeOf\n\t(function() {\n\t\tvar i, len, matcher, prefixOperators, fallthrough;\n\n\t\tprefixOperators = '! ~ + - typeof'.split( ' ' );\n\n\t\tfallthrough = readMemberOrInvocation;\n\t\tfor ( i = 0, len = prefixOperators.length; i < len; i += 1 ) {\n\t\t\tmatcher = makePrefixSequenceMatcher( prefixOperators[i], fallthrough );\n\t\t\tfallthrough = matcher;\n\t\t}\n\n\t\t// typeof operator is higher precedence than multiplication, so provides the\n\t\t// fallthrough for the multiplication sequence matcher we're about to create\n\t\t// (we're skipping void and delete)\n\t\treadTypeOf = fallthrough;\n\t}());\n\n\tvar readTypeof = readTypeOf;\n\n\tvar readLogicalOr;\n\tvar makeInfixSequenceMatcher;\n\tmakeInfixSequenceMatcher = function ( symbol, fallthrough ) {\n\t\treturn function ( parser ) {\n\t\t\tvar start, left, right;\n\n\t\t\tleft = fallthrough( parser );\n\t\t\tif ( !left ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Loop to handle left-recursion in a case like `a * b * c` and produce\n\t\t\t// left association, i.e. `(a * b) * c`.  The matcher can't call itself\n\t\t\t// to parse `left` because that would be infinite regress.\n\t\t\twhile ( true ) {\n\t\t\t\tstart = parser.pos;\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\tif ( !parser.matchString( symbol ) ) {\n\t\t\t\t\tparser.pos = start;\n\t\t\t\t\treturn left;\n\t\t\t\t}\n\n\t\t\t\t// special case - in operator must not be followed by [a-zA-Z_$0-9]\n\t\t\t\tif ( symbol === 'in' && /[a-zA-Z_$0-9]/.test( parser.remaining().charAt( 0 ) ) ) {\n\t\t\t\t\tparser.pos = start;\n\t\t\t\t\treturn left;\n\t\t\t\t}\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\t// right operand must also consist of only higher-precedence operators\n\t\t\t\tright = fallthrough( parser );\n\t\t\t\tif ( !right ) {\n\t\t\t\t\tparser.pos = start;\n\t\t\t\t\treturn left;\n\t\t\t\t}\n\n\t\t\t\tleft = {\n\t\t\t\t\tt: INFIX_OPERATOR,\n\t\t\t\t\ts: symbol,\n\t\t\t\t\to: [ left, right ]\n\t\t\t\t};\n\n\t\t\t\t// Loop back around.  If we don't see another occurrence of the symbol,\n\t\t\t\t// we'll return left.\n\t\t\t}\n\t\t};\n\t};\n\n\t// create all infix sequence matchers, and return readLogicalOr\n\t(function() {\n\t\tvar i, len, matcher, infixOperators, fallthrough;\n\n\t\t// All the infix operators on order of precedence (source: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence)\n\t\t// Each sequence matcher will initially fall through to its higher precedence\n\t\t// neighbour, and only attempt to match if one of the higher precedence operators\n\t\t// (or, ultimately, a literal, reference, or bracketed expression) already matched\n\t\tinfixOperators = '* / % + - << >> >>> < <= > >= in instanceof == != === !== & ^ | && ||'.split( ' ' );\n\n\t\t// A typeof operator is higher precedence than multiplication\n\t\tfallthrough = readTypeof;\n\t\tfor ( i = 0, len = infixOperators.length; i < len; i += 1 ) {\n\t\t\tmatcher = makeInfixSequenceMatcher( infixOperators[i], fallthrough );\n\t\t\tfallthrough = matcher;\n\t\t}\n\n\t\t// Logical OR is the fallthrough for the conditional matcher\n\t\treadLogicalOr = fallthrough;\n\t}());\n\n\tvar readLogicalOr$1 = readLogicalOr;\n\n\t// The conditional operator is the lowest precedence operator, so we start here\n\tfunction getConditional ( parser ) {\n\t\tvar start, expression, ifTrue, ifFalse;\n\n\t\texpression = readLogicalOr$1( parser );\n\t\tif ( !expression ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tstart = parser.pos;\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '?' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn expression;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tifTrue = readExpression( parser );\n\t\tif ( !ifTrue ) {\n\t\t\tparser.error( expectedExpression );\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( ':' ) ) {\n\t\t\tparser.error( 'Expected \":\"' );\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tifFalse = readExpression( parser );\n\t\tif ( !ifFalse ) {\n\t\t\tparser.error( expectedExpression );\n\t\t}\n\n\t\treturn {\n\t\t\tt: CONDITIONAL,\n\t\t\to: [ expression, ifTrue, ifFalse ]\n\t\t};\n\t}\n\n\tfunction readExpression ( parser ) {\n\t\t// The conditional operator is the lowest precedence operator (except yield,\n\t\t// assignment operators, and commas, none of which are supported), so we\n\t\t// start there. If it doesn't match, it 'falls through' to progressively\n\t\t// higher precedence operators, until it eventually matches (or fails to\n\t\t// match) a 'primary' - a literal or a reference. This way, the abstract syntax\n\t\t// tree has everything in its proper place, i.e. 2 + 3 * 4 === 14, not 20.\n\t\treturn getConditional( parser );\n\t}\n\n\tfunction flattenExpression ( expression ) {\n\t\tvar refs, count = 0, stringified;\n\n\t\textractRefs( expression, refs = [] );\n\t\tstringified = stringify( expression );\n\n\t\trefs = refs.map( function ( r ) { return r.indexOf( '...' ) === 0 ? r.substr( 3 ) : r; } );\n\n\t\treturn {\n\t\t\tr: refs,\n\t\t\ts: getVars(stringified)\n\t\t};\n\n\t\tfunction getVars(expr) {\n\t\t\tvar vars = [];\n\t\t\tfor ( var i = count - 1; i >= 0; i-- ) {\n\t\t\t\tvars.push( (\"spread$\" + i) );\n\t\t\t}\n\t\t\treturn vars.length ? (\"(function(){var \" + (vars.join(',')) + \";return(\" + expr + \");})()\") : expr;\n\t\t}\n\n\t\tfunction stringify ( node ) {\n\t\t\tswitch ( node.t ) {\n\t\t\t\tcase BOOLEAN_LITERAL:\n\t\t\t\tcase GLOBAL:\n\t\t\t\tcase NUMBER_LITERAL:\n\t\t\t\tcase REGEXP_LITERAL:\n\t\t\t\t\treturn node.v;\n\n\t\t\t\tcase STRING_LITERAL:\n\t\t\t\t\treturn JSON.stringify( String( node.v ) );\n\n\t\t\t\tcase ARRAY_LITERAL:\n\t\t\t\t\treturn '[' + ( node.m ? node.m.map( stringify ).join( ',' ) : '' ) + ']';\n\n\t\t\t\tcase OBJECT_LITERAL:\n\t\t\t\t\treturn '{' + ( node.m ? node.m.map( stringify ).join( ',' ) : '' ) + '}';\n\n\t\t\t\tcase KEY_VALUE_PAIR:\n\t\t\t\t\treturn node.k + ':' + stringify( node.v );\n\n\t\t\t\tcase PREFIX_OPERATOR:\n\t\t\t\t\treturn ( node.s === 'typeof' ? 'typeof ' : node.s ) + stringify( node.o );\n\n\t\t\t\tcase INFIX_OPERATOR:\n\t\t\t\t\treturn stringify( node.o[0] ) + ( node.s.substr( 0, 2 ) === 'in' ? ' ' + node.s + ' ' : node.s ) + stringify( node.o[1] );\n\n\t\t\t\tcase INVOCATION:\n\t\t\t\t\tif ( node.spread ) {\n\t\t\t\t\t\tvar id = count++;\n\t\t\t\t\t\treturn (\"(spread$\" + id + \" = \" + (stringify(node.x)) + \").apply(spread$\" + id + \", [].concat(\" + (node.o ? node.o.map( function ( a ) { return a.n && a.n.indexOf( '...' ) === 0 ? stringify( a ) : '[' + stringify(a) + ']'; } ).join( ',' ) : '') + \") )\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn stringify( node.x ) + '(' + ( node.o ? node.o.map( stringify ).join( ',' ) : '' ) + ')';\n\t\t\t\t\t}\n\n\t\t\t\tcase BRACKETED:\n\t\t\t\t\treturn '(' + stringify( node.x ) + ')';\n\n\t\t\t\tcase MEMBER:\n\t\t\t\t\treturn stringify( node.x ) + stringify( node.r );\n\n\t\t\t\tcase REFINEMENT:\n\t\t\t\t\treturn ( node.n ? '.' + node.n : '[' + stringify( node.x ) + ']' );\n\n\t\t\t\tcase CONDITIONAL:\n\t\t\t\t\treturn stringify( node.o[0] ) + '?' + stringify( node.o[1] ) + ':' + stringify( node.o[2] );\n\n\t\t\t\tcase REFERENCE:\n\t\t\t\t\treturn '_' + refs.indexOf( node.n );\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'Expected legal JavaScript' );\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO maybe refactor this?\n\tfunction extractRefs ( node, refs ) {\n\t\tvar i, list;\n\n\t\tif ( node.t === REFERENCE ) {\n\t\t\tif ( refs.indexOf( node.n ) === -1 ) {\n\t\t\t\trefs.unshift( node.n );\n\t\t\t}\n\t\t}\n\n\t\tlist = node.o || node.m;\n\t\tif ( list ) {\n\t\t\tif ( isObject( list ) ) {\n\t\t\t\textractRefs( list, refs );\n\t\t\t} else {\n\t\t\t\ti = list.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( list[i].n && list[i].n.indexOf('...') === 0 ) {\n\t\t\t\t\t\tnode.spread = true;\n\t\t\t\t\t}\n\t\t\t\t\textractRefs( list[i], refs );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( node.x ) {\n\t\t\textractRefs( node.x, refs );\n\t\t}\n\n\t\tif ( node.r ) {\n\t\t\textractRefs( node.r, refs );\n\t\t}\n\n\t\tif ( node.v ) {\n\t\t\textractRefs( node.v, refs );\n\t\t}\n\t}\n\n\t// simple JSON parser, without the restrictions of JSON parse\n\t// (i.e. having to double-quote keys).\n\t//\n\t// If passed a hash of values as the second argument, ${placeholders}\n\t// will be replaced with those values\n\n\tvar specials$1 = {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null,\n\t\tundefined: undefined\n\t};\n\n\tvar specialsPattern = new RegExp( '^(?:' + Object.keys( specials$1 ).join( '|' ) + ')' );\n\tvar numberPattern$1 = /^(?:[+-]?)(?:(?:(?:0|[1-9]\\d*)?\\.\\d+)|(?:(?:0|[1-9]\\d*)\\.)|(?:0|[1-9]\\d*))(?:[eE][+-]?\\d+)?/;\n\tvar placeholderPattern = /\\$\\{([^\\}]+)\\}/g;\n\tvar placeholderAtStartPattern = /^\\$\\{([^\\}]+)\\}/;\n\tvar onlyWhitespace = /^\\s*$/;\n\n\tvar JsonParser = Parser$1.extend({\n\t\tinit: function ( str, options ) {\n\t\t\tthis.values = options.values;\n\t\t\tthis.allowWhitespace();\n\t\t},\n\n\t\tpostProcess: function ( result ) {\n\t\t\tif ( result.length !== 1 || !onlyWhitespace.test( this.leftover ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn { value: result[0].v };\n\t\t},\n\n\t\tconverters: [\n\t\t\tfunction getPlaceholder ( parser ) {\n\t\t\t\tif ( !parser.values ) return null;\n\n\t\t\t\tvar placeholder = parser.matchPattern( placeholderAtStartPattern );\n\n\t\t\t\tif ( placeholder && ( parser.values.hasOwnProperty( placeholder ) ) ) {\n\t\t\t\t\treturn { v: parser.values[ placeholder ] };\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfunction getSpecial ( parser ) {\n\t\t\t\tvar special = parser.matchPattern( specialsPattern );\n\t\t\t\tif ( special ) return { v: specials$1[ special ] };\n\t\t\t},\n\n\t\t\tfunction getNumber ( parser ) {\n\t\t\t\tvar number = parser.matchPattern( numberPattern$1 );\n\t\t\t\tif ( number ) return { v: +number };\n\t\t\t},\n\n\t\t\tfunction getString ( parser ) {\n\t\t\t\tvar stringLiteral = readStringLiteral( parser );\n\t\t\t\tvar values = parser.values;\n\n\t\t\t\tif ( stringLiteral && values ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tv: stringLiteral.v.replace( placeholderPattern, function ( match, $1 ) { return ( $1 in values ? values[ $1 ] : $1 ); } )\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn stringLiteral;\n\t\t\t},\n\n\t\t\tfunction getObject ( parser ) {\n\t\t\t\tif ( !parser.matchString( '{' ) ) return null;\n\n\t\t\t\tvar result = {};\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\tif ( parser.matchString( '}' ) ) {\n\t\t\t\t\treturn { v: result };\n\t\t\t\t}\n\n\t\t\t\tvar pair;\n\t\t\t\twhile ( pair = getKeyValuePair( parser ) ) {\n\t\t\t\t\tresult[ pair.key ] = pair.value;\n\n\t\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\t\tif ( parser.matchString( '}' ) ) {\n\t\t\t\t\t\treturn { v: result };\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !parser.matchString( ',' ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\n\t\t\tfunction getArray ( parser ) {\n\t\t\t\tif ( !parser.matchString( '[' ) ) return null;\n\n\t\t\t\tvar result = [];\n\n\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\tif ( parser.matchString( ']' ) ) {\n\t\t\t\t\treturn { v: result };\n\t\t\t\t}\n\n\t\t\t\tvar valueToken;\n\t\t\t\twhile ( valueToken = parser.read() ) {\n\t\t\t\t\tresult.push( valueToken.v );\n\n\t\t\t\t\tparser.allowWhitespace();\n\n\t\t\t\t\tif ( parser.matchString( ']' ) ) {\n\t\t\t\t\t\treturn { v: result };\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !parser.matchString( ',' ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tparser.allowWhitespace();\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t]\n\t});\n\n\tfunction getKeyValuePair ( parser ) {\n\t\tparser.allowWhitespace();\n\n\t\tvar key = readKey( parser );\n\n\t\tif ( !key ) return null;\n\n\t\tvar pair = { key: key };\n\n\t\tparser.allowWhitespace();\n\t\tif ( !parser.matchString( ':' ) ) {\n\t\t\treturn null;\n\t\t}\n\t\tparser.allowWhitespace();\n\n\t\tvar valueToken = parser.read();\n\n\t\tif ( !valueToken ) return null;\n\n\t\tpair.value = valueToken.v;\n\t\treturn pair;\n\t}\n\n\tfunction parseJSON ( str, values ) {\n\t\tvar parser = new JsonParser( str, { values: values });\n\t\treturn parser.result;\n\t}\n\n\tvar methodCallPattern = /^([a-zA-Z_$][a-zA-Z_$0-9]*)\\(.*\\)\\s*$/;\n\tvar ExpressionParser;\n\tvar blank = /^\\s*$/;\n\n\tExpressionParser = Parser$1.extend({\n\t\tconverters: [ readExpression ],\n\t\tspreadArgs: true\n\t});\n\n\t// TODO clean this up, it's shocking\n\tfunction processDirective ( tokens, parentParser, type ) {\n\t\tvar result,\n\t\t\tmatch,\n\t\t\ttoken,\n\t\t\tcolonIndex,\n\t\t\tdirectiveName,\n\t\t\tdirectiveArgs,\n\t\t\tparsed;\n\n\t\tif ( typeof tokens === 'string' ) {\n\t\t\tvar pos = parentParser.pos - tokens.length;\n\t\t\tif ( type === DECORATOR || type === TRANSITION ) {\n\t\t\t\tvar parser = new ExpressionParser( (\"[\" + tokens + \"]\") );\n\t\t\t\treturn { a: flattenExpression( parser.result[0] ) };\n\t\t\t}\n\n\t\t\tif ( type === EVENT && ( match = methodCallPattern.exec( tokens ) ) ) {\n\t\t\t\twarnIfDebug( parentParser.getContextMessage( pos, (\"Unqualified method events are deprecated. Prefix methods with '@this.' to call methods on the current Ractive instance.\") )[2] );\n\t\t\t\ttokens = \"@this.\" + (match[1]) + \"\" + (tokens.substr(match[1].length));\n\t\t\t}\n\n\t\t\tif ( type === EVENT && ~tokens.indexOf( '(' ) ) {\n\t\t\t\tvar parser$1 = new ExpressionParser( '[' + tokens + ']' );\n\t\t\t\tif ( parser$1.result && parser$1.result[0] ) {\n\t\t\t\t\tif ( parser$1.remaining().length ) {\n\t\t\t\t\t\tparentParser.pos = pos + tokens.length - parser$1.remaining().length;\n\t\t\t\t\t\tparentParser.error( (\"Invalid input after event expression '\" + (parser$1.remaining()) + \"'\") );\n\t\t\t\t\t}\n\t\t\t\t\treturn { x: flattenExpression( parser$1.result[0] ) };\n\t\t\t\t}\n\n\t\t\t\tif ( tokens.indexOf( ':' ) > tokens.indexOf( '(' ) || !~tokens.indexOf( ':' ) ) {\n\t\t\t\t\tparentParser.pos = pos;\n\t\t\t\t\tparentParser.error( (\"Invalid input in event expression '\" + tokens + \"'\") );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tokens.indexOf( ':' ) === -1 ) {\n\t\t\t\treturn tokens.trim();\n\t\t\t}\n\n\t\t\ttokens = [ tokens ];\n\t\t}\n\n\t\tresult = {};\n\n\t\tdirectiveName = [];\n\t\tdirectiveArgs = [];\n\n\t\tif ( tokens ) {\n\t\t\twhile ( tokens.length ) {\n\t\t\t\ttoken = tokens.shift();\n\n\t\t\t\tif ( typeof token === 'string' ) {\n\t\t\t\t\t// ignore empty space\n\t\t\t\t\tif ( blank.test( token ) ) continue;\n\n\t\t\t\t\tcolonIndex = token.indexOf( ':' );\n\n\t\t\t\t\tif ( colonIndex === -1 ) {\n\t\t\t\t\t\tdirectiveName.push( token );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// is the colon the first character?\n\t\t\t\t\t\tif ( colonIndex ) {\n\t\t\t\t\t\t\t// no\n\t\t\t\t\t\t\tdirectiveName.push( token.substr( 0, colonIndex ) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if there is anything after the colon in this token, treat\n\t\t\t\t\t\t// it as the first token of the directiveArgs fragment\n\t\t\t\t\t\tif ( token.length > colonIndex + 1 ) {\n\t\t\t\t\t\t\tdirectiveArgs[0] = token.substring( colonIndex + 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telse {\n\t\t\t\t\tdirectiveName.push( token );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdirectiveArgs = directiveArgs.concat( tokens );\n\t\t}\n\n\t\tif ( !directiveName.length ) {\n\t\t\tresult = '';\n\t\t} else if ( directiveArgs.length || typeof directiveName !== 'string' ) {\n\t\t\tresult = {\n\t\t\t\t// TODO is this really necessary? just use the array\n\t\t\t\tn: ( directiveName.length === 1 && typeof directiveName[0] === 'string' ? directiveName[0] : directiveName )\n\t\t\t};\n\n\t\t\tif ( directiveArgs.length === 1 && typeof directiveArgs[0] === 'string' ) {\n\t\t\t\tparsed = parseJSON( '[' + directiveArgs[0] + ']' );\n\t\t\t\tresult.a = parsed ? parsed.value : [ directiveArgs[0].trim() ];\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tresult.d = directiveArgs;\n\t\t\t}\n\t\t} else {\n\t\t\tresult = directiveName;\n\t\t}\n\n\t\tif ( directiveArgs.length && type ) {\n\t\t\twarnIfDebug( parentParser.getContextMessage( parentParser.pos, (\"Proxy events with arguments are deprecated. You can fire events with arguments using \\\"@this.fire('eventName', arg1, arg2, ...)\\\".\") )[2] );\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tvar attributeNamePattern = /^[^\\s\"'>\\/=]+/;\n\tvar onPattern = /^on/;\n\tvar proxyEventPattern = /^on-([a-zA-Z\\\\*\\\\.$_][a-zA-Z\\\\*\\\\.$_0-9\\-]+)$/;\n\tvar reservedEventNames = /^(?:change|reset|teardown|update|construct|config|init|render|unrender|detach|insert)$/;\n\tvar decoratorPattern = /^as-([a-z-A-Z][-a-zA-Z_0-9]*)$/;\n\tvar transitionPattern = /^([a-zA-Z](?:(?!-in-out)[-a-zA-Z_0-9])*)-(in|out|in-out)$/;\n\tvar directives = {\n\t\t\t\t\t   'intro-outro': { t: TRANSITION, v: 't0' },\n\t\t\t\t\t   intro: { t: TRANSITION, v: 't1' },\n\t\t\t\t\t   outro: { t: TRANSITION, v: 't2' },\n\t\t\t\t\t   lazy: { t: BINDING_FLAG, v: 'l' },\n\t\t\t\t\t   twoway: { t: BINDING_FLAG, v: 't' },\n\t\t\t\t\t   decorator: { t: DECORATOR }\n\t\t\t\t\t };\n\tvar unquotedAttributeValueTextPattern = /^[^\\s\"'=<>\\/`]+/;\n\tfunction readAttribute ( parser ) {\n\t\tvar attr, name, value, i, nearest, idx;\n\n\t\tparser.allowWhitespace();\n\n\t\tname = parser.matchPattern( attributeNamePattern );\n\t\tif ( !name ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// check for accidental delimiter consumption e.g. <tag bool{{>attrs}} />\n\t\tnearest = name.length;\n\t\tfor ( i = 0; i < parser.tags.length; i++ ) {\n\t\t\tif ( ~( idx = name.indexOf( parser.tags[ i ].open ) ) ) {\n\t\t\t\tif ( idx < nearest ) nearest = idx;\n\t\t\t}\n\t\t}\n\t\tif ( nearest < name.length ) {\n\t\t\tparser.pos -= name.length - nearest;\n\t\t\tname = name.substr( 0, nearest );\n\t\t\tif ( !name ) return null;\n\t\t\telse return { n: name };\n\t\t}\n\n\t\tattr = { n: name };\n\n\t\tvalue = readAttributeValue( parser );\n\t\tif ( value != null ) { // not null/undefined\n\t\t\tattr.f = value;\n\t\t}\n\n\t\treturn attr;\n\t}\n\n\tfunction readAttributeValue ( parser ) {\n\t\tvar start, valueStart, startDepth, value;\n\n\t\tstart = parser.pos;\n\n\t\t// next character must be `=`, `/`, `>` or whitespace\n\t\tif ( !/[=\\/>\\s]/.test( parser.nextChar() ) ) {\n\t\t\tparser.error( 'Expected `=`, `/`, `>` or whitespace' );\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '=' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tvalueStart = parser.pos;\n\t\tstartDepth = parser.sectionDepth;\n\n\t\tvalue = readQuotedAttributeValue( parser, (\"'\") ) ||\n\t\t\t\treadQuotedAttributeValue( parser, (\"\\\"\") ) ||\n\t\t\t\treadUnquotedAttributeValue( parser );\n\n\t\tif ( value === null ) {\n\t\t\tparser.error( 'Expected valid attribute value' );\n\t\t}\n\n\t\tif ( parser.sectionDepth !== startDepth ) {\n\t\t\tparser.pos = valueStart;\n\t\t\tparser.error( 'An attribute value must contain as many opening section tags as closing section tags' );\n\t\t}\n\n\t\tif ( !value.length ) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif ( value.length === 1 && typeof value[0] === 'string' ) {\n\t\t\treturn decodeCharacterReferences( value[0] );\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction readUnquotedAttributeValueToken ( parser ) {\n\t\tvar start, text, haystack, needles, index;\n\n\t\tstart = parser.pos;\n\n\t\ttext = parser.matchPattern( unquotedAttributeValueTextPattern );\n\n\t\tif ( !text ) {\n\t\t\treturn null;\n\t\t}\n\n\t\thaystack = text;\n\t\tneedles = parser.tags.map( function ( t ) { return t.open; } ); // TODO refactor... we do this in readText.js as well\n\n\t\tif ( ( index = getLowestIndex( haystack, needles ) ) !== -1 ) {\n\t\t\ttext = text.substr( 0, index );\n\t\t\tparser.pos = start + text.length;\n\t\t}\n\n\t\treturn text;\n\t}\n\n\tfunction readUnquotedAttributeValue ( parser ) {\n\t\tvar tokens, token;\n\n\t\tparser.inAttribute = true;\n\n\t\ttokens = [];\n\n\t\ttoken = readMustache( parser ) || readUnquotedAttributeValueToken( parser );\n\t\twhile ( token ) {\n\t\t\ttokens.push( token );\n\t\t\ttoken = readMustache( parser ) || readUnquotedAttributeValueToken( parser );\n\t\t}\n\n\t\tif ( !tokens.length ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.inAttribute = false;\n\t\treturn tokens;\n\t}\n\n\tfunction readQuotedAttributeValue ( parser, quoteMark ) {\n\t\tvar start, tokens, token;\n\n\t\tstart = parser.pos;\n\n\t\tif ( !parser.matchString( quoteMark ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.inAttribute = quoteMark;\n\n\t\ttokens = [];\n\n\t\ttoken = readMustache( parser ) || readQuotedStringToken( parser, quoteMark );\n\t\twhile ( token !== null ) {\n\t\t\ttokens.push( token );\n\t\t\ttoken = readMustache( parser ) || readQuotedStringToken( parser, quoteMark );\n\t\t}\n\n\t\tif ( !parser.matchString( quoteMark ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.inAttribute = false;\n\n\t\treturn tokens;\n\t}\n\n\tfunction readQuotedStringToken ( parser, quoteMark ) {\n\t\tvar haystack = parser.remaining();\n\n\t\tvar needles = parser.tags.map( function ( t ) { return t.open; } ); // TODO refactor... we do this in readText.js as well\n\t\tneedles.push( quoteMark );\n\n\t\tvar index = getLowestIndex( haystack, needles );\n\n\t\tif ( index === -1 ) {\n\t\t\tparser.error( 'Quoted attribute value must have a closing quote' );\n\t\t}\n\n\t\tif ( !index ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.pos += index;\n\t\treturn haystack.substr( 0, index );\n\t}\n\n\tfunction readAttributeOrDirective ( parser ) {\n\t\t\tvar match,\n\t\t\t\tattribute,\n\t\t\t    directive;\n\n\t\t\tattribute = readAttribute( parser );\n\n\t\t\tif ( !attribute ) return null;\n\n\t\t\t// intro, outro, decorator\n\t\t\tif ( directive = directives[ attribute.n ] ) {\n\t\t\t\tattribute.t = directive.t;\n\t\t\t\tif ( directive.v ) attribute.v = directive.v;\n\t\t\t\tdelete attribute.n; // no name necessary\n\n\t\t\t\tif ( directive.t === TRANSITION || directive.t === DECORATOR ) attribute.f = processDirective( attribute.f, parser );\n\n\t\t\t\tif ( directive.t === TRANSITION ) {\n\t\t\t\t\twarnOnceIfDebug( (\"\" + (directive.v === 't0' ? 'intro-outro' : directive.v === 't1' ? 'intro' : 'outro') + \" is deprecated. To specify tranisitions, use the transition name suffixed with '-in', '-out', or '-in-out' as an attribute. Arguments can be specified in the attribute value as a simple list of expressions without mustaches.\") );\n\t\t\t\t} else if ( directive.t === DECORATOR ) {\n\t\t\t\t\twarnOnceIfDebug( (\"decorator is deprecated. To specify decorators, use the decorator name prefixed with 'as-' as an attribute. Arguments can be specified in the attribute value as a simple list of expressions without mustaches.\") );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// decorators\n\t\t\telse if ( match = decoratorPattern.exec( attribute.n ) ) {\n\t\t\t\tdelete attribute.n;\n\t\t\t\tattribute.t = DECORATOR;\n\t\t\t\tattribute.f = processDirective( attribute.f, parser, DECORATOR );\n\t\t\t\tif ( typeof attribute.f === 'object' ) attribute.f.n = match[1];\n\t\t\t\telse attribute.f = match[1];\n\t\t\t}\n\n\t\t\t// transitions\n\t\t\telse if ( match = transitionPattern.exec( attribute.n ) ) {\n\t\t\t\tdelete attribute.n;\n\t\t\t\tattribute.t = TRANSITION;\n\t\t\t\tattribute.f = processDirective( attribute.f, parser, TRANSITION );\n\t\t\t\tif ( typeof attribute.f === 'object' ) attribute.f.n = match[1];\n\t\t\t\telse attribute.f = match[1];\n\t\t\t\tattribute.v = match[2] === 'in-out' ? 't0' : match[2] === 'in' ? 't1' : 't2';\n\t\t\t}\n\n\t\t\t// on-click etc\n\t\t\telse if ( match = proxyEventPattern.exec( attribute.n ) ) {\n\t\t\t\tattribute.n = match[1];\n\t\t\t\tattribute.t = EVENT;\n\t\t\t\tattribute.f = processDirective( attribute.f, parser, EVENT );\n\n\t\t\t\tif ( reservedEventNames.test( attribute.f.n || attribute.f ) ) {\n\t\t\t\t\tparser.pos -= ( attribute.f.n || attribute.f ).length;\n\t\t\t\t\tparser.error( 'Cannot use reserved event names (change, reset, teardown, update, construct, config, init, render, unrender, detach, insert)' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tif ( parser.sanitizeEventAttributes && onPattern.test( attribute.n ) ) {\n\t\t\t\t\treturn { exclude: true };\n\t\t\t\t} else {\n\t\t\t\t\tattribute.f = attribute.f || ( attribute.f === '' ? '' : 0 );\n\t\t\t\t\tattribute.t = ATTRIBUTE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn attribute;\n\t}\n\n\tvar delimiterChangeToken = { t: DELIMCHANGE, exclude: true };\n\n\tfunction readMustache ( parser ) {\n\t\tvar mustache, i;\n\n\t\t// If we're inside a <script> or <style> tag, and we're not\n\t\t// interpolating, bug out\n\t\tif ( parser.interpolate[ parser.inside ] === false ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor ( i = 0; i < parser.tags.length; i += 1 ) {\n\t\t\tif ( mustache = readMustacheOfType( parser, parser.tags[i] ) ) {\n\t\t\t\treturn mustache;\n\t\t\t}\n\t\t}\n\n\t\tif ( parser.inTag && !parser.inAttribute ) {\n\t\t\tmustache = readAttributeOrDirective( parser );\n\t\t\tif ( mustache ) {\n\t\t\t\tparser.allowWhitespace();\n\t\t\t\treturn mustache;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction readMustacheOfType ( parser, tag ) {\n\t\tvar start, mustache, reader, i;\n\n\t\tstart = parser.pos;\n\n\t\tif ( parser.matchString( '\\\\' + tag.open ) ) {\n\t\t\tif ( start === 0 || parser.str[ start - 1 ] !== '\\\\' ) {\n\t\t\t\treturn tag.open;\n\t\t\t}\n\t\t} else if ( !parser.matchString( tag.open ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// delimiter change?\n\t\tif ( mustache = readDelimiterChange( parser ) ) {\n\t\t\t// find closing delimiter or abort...\n\t\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// ...then make the switch\n\t\t\ttag.open = mustache[0];\n\t\t\ttag.close = mustache[1];\n\t\t\tparser.sortMustacheTags();\n\n\t\t\treturn delimiterChangeToken;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\t// illegal section closer\n\t\tif ( parser.matchString( '/' ) ) {\n\t\t\tparser.pos -= 1;\n\t\t\tvar rewind = parser.pos;\n\t\t\tif ( !readNumberLiteral( parser ) ) {\n\t\t\t\tparser.pos = rewind - ( tag.close.length );\n\t\t\t\tif ( parser.inAttribute ) {\n\t\t\t\t\tparser.pos = start;\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\tparser.error( 'Attempted to close a section that wasn\\'t open' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparser.pos = rewind;\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < tag.readers.length; i += 1 ) {\n\t\t\treader = tag.readers[i];\n\n\t\t\tif ( mustache = reader( parser, tag ) ) {\n\t\t\t\tif ( tag.isStatic ) {\n\t\t\t\t\tmustache.s = true; // TODO make this `1` instead - more compact\n\t\t\t\t}\n\n\t\t\t\tif ( parser.includeLinePositions ) {\n\t\t\t\t\tmustache.p = parser.getLinePos( start );\n\t\t\t\t}\n\n\t\t\t\treturn mustache;\n\t\t\t}\n\t\t}\n\n\t\tparser.pos = start;\n\t\treturn null;\n\t}\n\n\tfunction refineExpression ( expression, mustache ) {\n\t\tvar referenceExpression;\n\n\t\tif ( expression ) {\n\t\t\twhile ( expression.t === BRACKETED && expression.x ) {\n\t\t\t\texpression = expression.x;\n\t\t\t}\n\n\t\t\tif ( expression.t === REFERENCE ) {\n\t\t\t\tmustache.r = expression.n;\n\t\t\t} else {\n\t\t\t\tif ( referenceExpression = getReferenceExpression( expression ) ) {\n\t\t\t\t\tmustache.rx = referenceExpression;\n\t\t\t\t} else {\n\t\t\t\t\tmustache.x = flattenExpression( expression );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn mustache;\n\t\t}\n\t}\n\n\t// TODO refactor this! it's bewildering\n\tfunction getReferenceExpression ( expression ) {\n\t\tvar members = [], refinement;\n\n\t\twhile ( expression.t === MEMBER && expression.r.t === REFINEMENT ) {\n\t\t\trefinement = expression.r;\n\n\t\t\tif ( refinement.x ) {\n\t\t\t\tif ( refinement.x.t === REFERENCE ) {\n\t\t\t\t\tmembers.unshift( refinement.x );\n\t\t\t\t} else {\n\t\t\t\t\tmembers.unshift( flattenExpression( refinement.x ) );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmembers.unshift( refinement.n );\n\t\t\t}\n\n\t\t\texpression = expression.x;\n\t\t}\n\n\t\tif ( expression.t !== REFERENCE ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tr: expression.n,\n\t\t\tm: members\n\t\t};\n\t}\n\n\tfunction readTriple ( parser, tag ) {\n\t\tvar expression = readExpression( parser ), triple;\n\n\t\tif ( !expression ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\ttriple = { t: TRIPLE };\n\t\trefineExpression( expression, triple ); // TODO handle this differently - it's mysterious\n\n\t\treturn triple;\n\t}\n\n\tfunction readUnescaped ( parser, tag ) {\n\t\tvar expression, triple;\n\n\t\tif ( !parser.matchString( '&' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\texpression = readExpression( parser );\n\n\t\tif ( !expression ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\ttriple = { t: TRIPLE };\n\t\trefineExpression( expression, triple ); // TODO handle this differently - it's mysterious\n\n\t\treturn triple;\n\t}\n\n\tvar legalAlias = /^(?:[a-zA-Z$_0-9]|\\\\\\.)+(?:(?:(?:[a-zA-Z$_0-9]|\\\\\\.)+)|(?:\\[[0-9]+\\]))*/;\n\tvar asRE = /^as/i;\n\n\tfunction readAliases( parser ) {\n\t\tvar aliases = [], alias, start = parser.pos;\n\n\t\tparser.allowWhitespace();\n\n\t\talias = readAlias( parser );\n\n\t\tif ( alias ) {\n\t\t\talias.x = refineExpression( alias.x, {} );\n\t\t\taliases.push( alias );\n\n\t\t\tparser.allowWhitespace();\n\n\t\t\twhile ( parser.matchString(',') ) {\n\t\t\t\talias = readAlias( parser );\n\n\t\t\t\tif ( !alias ) {\n\t\t\t\t\tparser.error( 'Expected another alias.' );\n\t\t\t\t}\n\n\t\t\t\talias.x = refineExpression( alias.x, {} );\n\t\t\t\taliases.push( alias );\n\n\t\t\t\tparser.allowWhitespace();\n\t\t\t}\n\n\t\t\treturn aliases;\n\t\t}\n\n\t\tparser.pos = start;\n\t\treturn null;\n\t}\n\n\tfunction readAlias( parser ) {\n\t\tvar expr, alias, start = parser.pos;\n\n\t\tparser.allowWhitespace();\n\n\t\texpr = readExpression( parser, [] );\n\n\t\tif ( !expr ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchPattern( asRE ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\talias = parser.matchPattern( legalAlias );\n\n\t\tif ( !alias ) {\n\t\t\tparser.error( 'Expected a legal alias name.' );\n\t\t}\n\n\t\treturn { n: alias, x: expr };\n\t}\n\n\tfunction readPartial ( parser, tag ) {\n\t\tif ( !parser.matchString( '>' ) ) return null;\n\n\t\tparser.allowWhitespace();\n\n\t\t// Partial names can include hyphens, so we can't use readExpression\n\t\t// blindly. Instead, we use the `relaxedNames` flag to indicate that\n\t\t// `foo-bar` should be read as a single name, rather than 'subtract\n\t\t// bar from foo'\n\t\tparser.relaxedNames = parser.strictRefinement = true;\n\t\tvar expression = readExpression( parser );\n\t\tparser.relaxedNames = parser.strictRefinement = false;\n\n\t\tif ( !expression ) return null;\n\n\t\tvar partial = { t: PARTIAL };\n\t\trefineExpression( expression, partial ); // TODO...\n\n\t\tparser.allowWhitespace();\n\n\t\t// check for alias context e.g. `{{>foo bar as bat, bip as bop}}` then\n\t\t// turn it into `{{#with bar as bat, bip as bop}}{{>foo}}{{/with}}`\n\t\tvar aliases = readAliases( parser );\n\t\tif ( aliases ) {\n\t\t\tpartial = {\n\t\t\t\tt: ALIAS,\n\t\t\t\tz: aliases,\n\t\t\t\tf: [ partial ]\n\t\t\t};\n\t\t}\n\n\t\t// otherwise check for literal context e.g. `{{>foo bar}}` then\n\t\t// turn it into `{{#with bar}}{{>foo}}{{/with}}`\n\t\telse {\n\t\t\tvar context = readExpression( parser );\n\t\t\tif ( context) {\n\t\t\t\tpartial = {\n\t\t\t\t\tt: SECTION,\n\t\t\t\t\tn: SECTION_WITH,\n\t\t\t\t\tf: [ partial ]\n\t\t\t\t};\n\n\t\t\t\trefineExpression( context, partial );\n\t\t\t}\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\treturn partial;\n\t}\n\n\tfunction readComment ( parser, tag ) {\n\t\tvar index;\n\n\t\tif ( !parser.matchString( '!' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tindex = parser.remaining().indexOf( tag.close );\n\n\t\tif ( index !== -1 ) {\n\t\t\tparser.pos += index + tag.close.length;\n\t\t\treturn { t: COMMENT };\n\t\t}\n\t}\n\n\tfunction readExpressionOrReference ( parser, expectedFollowers ) {\n\t\tvar start, expression, i;\n\n\t\tstart = parser.pos;\n\t\texpression = readExpression( parser );\n\n\t\tif ( !expression ) {\n\t\t\t// valid reference but invalid expression e.g. `{{new}}`?\n\t\t\tvar ref = parser.matchPattern( /^(\\w+)/ );\n\t\t\tif ( ref ) {\n\t\t\t\treturn {\n\t\t\t\t\tt: REFERENCE,\n\t\t\t\t\tn: ref\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tfor ( i = 0; i < expectedFollowers.length; i += 1 ) {\n\t\t\tif ( parser.remaining().substr( 0, expectedFollowers[i].length ) === expectedFollowers[i] ) {\n\t\t\t\treturn expression;\n\t\t\t}\n\t\t}\n\n\t\tparser.pos = start;\n\t\treturn readReference( parser );\n\t}\n\n\tfunction readInterpolator ( parser, tag ) {\n\t\tvar start, expression, interpolator, err;\n\n\t\tstart = parser.pos;\n\n\t\t// TODO would be good for perf if we could do away with the try-catch\n\t\ttry {\n\t\t\texpression = readExpressionOrReference( parser, [ tag.close ]);\n\t\t} catch ( e ) {\n\t\t\terr = e;\n\t\t}\n\n\t\tif ( !expression ) {\n\t\t\tif ( parser.str.charAt( start ) === '!' ) {\n\t\t\t\t// special case - comment\n\t\t\t\tparser.pos = start;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( err ) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"' after reference\") );\n\n\t\t\tif ( !expression ) {\n\t\t\t\t// special case - comment\n\t\t\t\tif ( parser.nextChar() === '!' ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tparser.error( (\"Expected expression or legal reference\") );\n\t\t\t}\n\t\t}\n\n\t\tinterpolator = { t: INTERPOLATOR };\n\t\trefineExpression( expression, interpolator ); // TODO handle this differently - it's mysterious\n\n\t\treturn interpolator;\n\t}\n\n\tvar yieldPattern = /^yield\\s*/;\n\n\tfunction readYielder ( parser, tag ) {\n\t\tif ( !parser.matchPattern( yieldPattern ) ) return null;\n\n\t\tvar name = parser.matchPattern( /^[a-zA-Z_$][a-zA-Z_$0-9\\-]*/ );\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"expected legal partial name\") );\n\t\t}\n\n\t\tvar yielder = { t: YIELDER };\n\t\tif ( name ) yielder.n = name;\n\n\t\treturn yielder;\n\t}\n\n\tfunction readClosing ( parser, tag ) {\n\t\tvar start, remaining, index, closing;\n\n\t\tstart = parser.pos;\n\n\t\tif ( !parser.matchString( tag.open ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( '/' ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tremaining = parser.remaining();\n\t\tindex = remaining.indexOf( tag.close );\n\n\t\tif ( index !== -1 ) {\n\t\t\tclosing = {\n\t\t\t\tt: CLOSING,\n\t\t\t\tr: remaining.substr( 0, index ).split( ' ' )[0]\n\t\t\t};\n\n\t\t\tparser.pos += index;\n\n\t\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t\t}\n\n\t\t\treturn closing;\n\t\t}\n\n\t\tparser.pos = start;\n\t\treturn null;\n\t}\n\n\tvar elsePattern = /^\\s*else\\s*/;\n\n\tfunction readElse ( parser, tag ) {\n\t\tvar start = parser.pos;\n\n\t\tif ( !parser.matchString( tag.open ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchPattern( elsePattern ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\treturn {\n\t\t\tt: ELSE\n\t\t};\n\t}\n\n\tvar elsePattern$1 = /^\\s*elseif\\s+/;\n\n\tfunction readElseIf ( parser, tag ) {\n\t\tvar start = parser.pos;\n\n\t\tif ( !parser.matchString( tag.open ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchPattern( elsePattern$1 ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tvar expression = readExpression( parser );\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\treturn {\n\t\t\tt: ELSEIF,\n\t\t\tx: expression\n\t\t};\n\t}\n\n\tvar handlebarsBlockCodes = {\n\t\t'each':    SECTION_EACH,\n\t\t'if':      SECTION_IF,\n\t\t'with':    SECTION_IF_WITH,\n\t\t'unless':  SECTION_UNLESS\n\t};\n\n\tvar indexRefPattern = /^\\s*:\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)/;\n\tvar keyIndexRefPattern = /^\\s*,\\s*([a-zA-Z_$][a-zA-Z_$0-9]*)/;\n\tvar handlebarsBlockPattern = new RegExp( '^(' + Object.keys( handlebarsBlockCodes ).join( '|' ) + ')\\\\b' );\n\tfunction readSection ( parser, tag ) {\n\t\tvar start, expression, section, child, children, hasElse, block, unlessBlock, conditions, closed, i, expectedClose, aliasOnly = false;\n\n\t\tstart = parser.pos;\n\n\t\tif ( parser.matchString( '^' ) ) {\n\t\t\tsection = { t: SECTION, f: [], n: SECTION_UNLESS };\n\t\t} else if ( parser.matchString( '#' ) ) {\n\t\t\tsection = { t: SECTION, f: [] };\n\n\t\t\tif ( parser.matchString( 'partial' ) ) {\n\t\t\t\tparser.pos = start - parser.standardDelimiters[0].length;\n\t\t\t\tparser.error( 'Partial definitions can only be at the top level of the template, or immediately inside components' );\n\t\t\t}\n\n\t\t\tif ( block = parser.matchPattern( handlebarsBlockPattern ) ) {\n\t\t\t\texpectedClose = block;\n\t\t\t\tsection.n = handlebarsBlockCodes[ block ];\n\t\t\t}\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( block === 'with' ) {\n\t\t\tvar aliases = readAliases( parser );\n\t\t\tif ( aliases ) {\n\t\t\t\taliasOnly = true;\n\t\t\t\tsection.z = aliases;\n\t\t\t\tsection.t = ALIAS;\n\t\t\t}\n\t\t} else if ( block === 'each' ) {\n\t\t\tvar alias = readAlias( parser );\n\t\t\tif ( alias ) {\n\t\t\t\tsection.z = [ { n: alias.n, x: { r: '.' } } ];\n\t\t\t\texpression = alias.x;\n\t\t\t}\n\t\t}\n\n\t\tif ( !aliasOnly ) {\n\t\t\tif ( !expression ) expression = readExpression( parser );\n\n\t\t\tif ( !expression ) {\n\t\t\t\tparser.error( 'Expected expression' );\n\t\t\t}\n\n\t\t\t// optional index and key references\n\t\t\tif ( i = parser.matchPattern( indexRefPattern ) ) {\n\t\t\t\tvar extra;\n\n\t\t\t\tif ( extra = parser.matchPattern( keyIndexRefPattern ) ) {\n\t\t\t\t\tsection.i = i + ',' + extra;\n\t\t\t\t} else {\n\t\t\t\t\tsection.i = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tif ( !parser.matchString( tag.close ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (tag.close) + \"'\") );\n\t\t}\n\n\t\tparser.sectionDepth += 1;\n\t\tchildren = section.f;\n\n\t\tconditions = [];\n\n\t\tvar pos;\n\t\tdo {\n\t\t\tpos = parser.pos;\n\t\t\tif ( child = readClosing( parser, tag ) ) {\n\t\t\t\tif ( expectedClose && child.r !== expectedClose ) {\n\t\t\t\t\tparser.pos = pos;\n\t\t\t\t\tparser.error( (\"Expected \" + (tag.open) + \"/\" + expectedClose + \"\" + (tag.close)) );\n\t\t\t\t}\n\n\t\t\t\tparser.sectionDepth -= 1;\n\t\t\t\tclosed = true;\n\t\t\t}\n\n\t\t\telse if ( !aliasOnly && ( child = readElseIf( parser, tag ) ) ) {\n\t\t\t\tif ( section.n === SECTION_UNLESS ) {\n\t\t\t\t\tparser.error( '{{else}} not allowed in {{#unless}}' );\n\t\t\t\t}\n\n\t\t\t\tif ( hasElse ) {\n\t\t\t\t\tparser.error( 'illegal {{elseif...}} after {{else}}' );\n\t\t\t\t}\n\n\t\t\t\tif ( !unlessBlock ) {\n\t\t\t\t\tunlessBlock = [];\n\t\t\t\t}\n\n\t\t\t\tvar mustache = {\n\t\t\t\t\tt: SECTION,\n\t\t\t\t\tn: SECTION_IF,\n\t\t\t\t\tf: children = []\n\t\t\t\t};\n\t\t\t\trefineExpression( child.x, mustache );\n\n\t\t\t\tunlessBlock.push( mustache );\n\t\t\t}\n\n\t\t\telse if ( !aliasOnly && ( child = readElse( parser, tag ) ) ) {\n\t\t\t\tif ( section.n === SECTION_UNLESS ) {\n\t\t\t\t\tparser.error( '{{else}} not allowed in {{#unless}}' );\n\t\t\t\t}\n\n\t\t\t\tif ( hasElse ) {\n\t\t\t\t\tparser.error( 'there can only be one {{else}} block, at the end of a section' );\n\t\t\t\t}\n\n\t\t\t\thasElse = true;\n\n\t\t\t\t// use an unless block if there's no elseif\n\t\t\t\tif ( !unlessBlock ) {\n\t\t\t\t\tunlessBlock = [];\n\t\t\t\t}\n\n\t\t\t\tunlessBlock.push({\n\t\t\t\t\tt: SECTION,\n\t\t\t\t\tn: SECTION_UNLESS,\n\t\t\t\t\tf: children = []\n\t\t\t\t});\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tchild = parser.read( READERS );\n\n\t\t\t\tif ( !child ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tchildren.push( child );\n\t\t\t}\n\t\t} while ( !closed );\n\n\t\tif ( unlessBlock ) {\n\t\t\tsection.l = unlessBlock;\n\t\t}\n\n\t\tif ( !aliasOnly ) {\n\t\t\trefineExpression( expression, section );\n\t\t}\n\n\t\t// TODO if a section is empty it should be discarded. Don't do\n\t\t// that here though - we need to clean everything up first, as\n\t\t// it may contain removeable whitespace. As a temporary measure,\n\t\t// to pass the existing tests, remove empty `f` arrays\n\t\tif ( !section.f.length ) {\n\t\t\tdelete section.f;\n\t\t}\n\n\t\treturn section;\n\t}\n\n\tvar OPEN_COMMENT = '<!--';\n\tvar CLOSE_COMMENT = '-->';\n\tfunction readHtmlComment ( parser ) {\n\t\tvar start, content, remaining, endIndex, comment;\n\n\t\tstart = parser.pos;\n\n\t\tif ( parser.textOnlyMode || !parser.matchString( OPEN_COMMENT ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tremaining = parser.remaining();\n\t\tendIndex = remaining.indexOf( CLOSE_COMMENT );\n\n\t\tif ( endIndex === -1 ) {\n\t\t\tparser.error( 'Illegal HTML - expected closing comment sequence (\\'-->\\')' );\n\t\t}\n\n\t\tcontent = remaining.substr( 0, endIndex );\n\t\tparser.pos += endIndex + 3;\n\n\t\tcomment = {\n\t\t\tt: COMMENT,\n\t\t\tc: content\n\t\t};\n\n\t\tif ( parser.includeLinePositions ) {\n\t\t\tcomment.p = parser.getLinePos( start );\n\t\t}\n\n\t\treturn comment;\n\t}\n\n\tvar leadingLinebreak = /^[ \\t\\f\\r\\n]*\\r?\\n/;\n\tvar trailingLinebreak = /\\r?\\n[ \\t\\f\\r\\n]*$/;\n\tfunction stripStandalones ( items ) {\n\t\tvar i, current, backOne, backTwo, lastSectionItem;\n\n\t\tfor ( i=1; i<items.length; i+=1 ) {\n\t\t\tcurrent = items[i];\n\t\t\tbackOne = items[i-1];\n\t\t\tbackTwo = items[i-2];\n\n\t\t\t// if we're at the end of a [text][comment][text] sequence...\n\t\t\tif ( isString( current ) && isComment( backOne ) && isString( backTwo ) ) {\n\n\t\t\t\t// ... and the comment is a standalone (i.e. line breaks either side)...\n\t\t\t\tif ( trailingLinebreak.test( backTwo ) && leadingLinebreak.test( current ) ) {\n\n\t\t\t\t\t// ... then we want to remove the whitespace after the first line break\n\t\t\t\t\titems[i-2] = backTwo.replace( trailingLinebreak, '\\n' );\n\n\t\t\t\t\t// and the leading line break of the second text token\n\t\t\t\t\titems[i] = current.replace( leadingLinebreak, '' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if the current item is a section, and it is preceded by a linebreak, and\n\t\t\t// its first item is a linebreak...\n\t\t\tif ( isSection( current ) && isString( backOne ) ) {\n\t\t\t\tif ( trailingLinebreak.test( backOne ) && isString( current.f[0] ) && leadingLinebreak.test( current.f[0] ) ) {\n\t\t\t\t\titems[i-1] = backOne.replace( trailingLinebreak, '\\n' );\n\t\t\t\t\tcurrent.f[0] = current.f[0].replace( leadingLinebreak, '' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if the last item was a section, and it is followed by a linebreak, and\n\t\t\t// its last item is a linebreak...\n\t\t\tif ( isString( current ) && isSection( backOne ) ) {\n\t\t\t\tlastSectionItem = lastItem( backOne.f );\n\n\t\t\t\tif ( isString( lastSectionItem ) && trailingLinebreak.test( lastSectionItem ) && leadingLinebreak.test( current ) ) {\n\t\t\t\t\tbackOne.f[ backOne.f.length - 1 ] = lastSectionItem.replace( trailingLinebreak, '\\n' );\n\t\t\t\t\titems[i] = current.replace( leadingLinebreak, '' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t}\n\n\tfunction isString ( item ) {\n\t\treturn typeof item === 'string';\n\t}\n\n\tfunction isComment ( item ) {\n\t\treturn item.t === COMMENT || item.t === DELIMCHANGE;\n\t}\n\n\tfunction isSection ( item ) {\n\t\treturn ( item.t === SECTION || item.t === INVERTED ) && item.f;\n\t}\n\n\tfunction trimWhitespace ( items, leadingPattern, trailingPattern ) {\n\t\tvar item;\n\n\t\tif ( leadingPattern ) {\n\t\t\titem = items[0];\n\t\t\tif ( typeof item === 'string' ) {\n\t\t\t\titem = item.replace( leadingPattern, '' );\n\n\t\t\t\tif ( !item ) {\n\t\t\t\t\titems.shift();\n\t\t\t\t} else {\n\t\t\t\t\titems[0] = item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( trailingPattern ) {\n\t\t\titem = lastItem( items );\n\t\t\tif ( typeof item === 'string' ) {\n\t\t\t\titem = item.replace( trailingPattern, '' );\n\n\t\t\t\tif ( !item ) {\n\t\t\t\t\titems.pop();\n\t\t\t\t} else {\n\t\t\t\t\titems[ items.length - 1 ] = item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar contiguousWhitespace = /[ \\t\\f\\r\\n]+/g;\n\tvar preserveWhitespaceElements = /^(?:pre|script|style|textarea)$/i;\n\tvar leadingWhitespace$1 = /^[ \\t\\f\\r\\n]+/;\n\tvar trailingWhitespace = /[ \\t\\f\\r\\n]+$/;\n\tvar leadingNewLine = /^(?:\\r\\n|\\r|\\n)/;\n\tvar trailingNewLine = /(?:\\r\\n|\\r|\\n)$/;\n\n\tfunction cleanup ( items, stripComments, preserveWhitespace, removeLeadingWhitespace, removeTrailingWhitespace ) {\n\t\tif ( typeof items === 'string' ) return;\n\n\t\tvar i,\n\t\t\titem,\n\t\t\tpreviousItem,\n\t\t\tnextItem,\n\t\t\tpreserveWhitespaceInsideFragment,\n\t\t\tremoveLeadingWhitespaceInsideFragment,\n\t\t\tremoveTrailingWhitespaceInsideFragment,\n\t\t\tkey;\n\n\t\t// First pass - remove standalones and comments etc\n\t\tstripStandalones( items );\n\n\t\ti = items.length;\n\t\twhile ( i-- ) {\n\t\t\titem = items[i];\n\n\t\t\t// Remove delimiter changes, unsafe elements etc\n\t\t\tif ( item.exclude ) {\n\t\t\t\titems.splice( i, 1 );\n\t\t\t}\n\n\t\t\t// Remove comments, unless we want to keep them\n\t\t\telse if ( stripComments && item.t === COMMENT ) {\n\t\t\t\titems.splice( i, 1 );\n\t\t\t}\n\t\t}\n\n\t\t// If necessary, remove leading and trailing whitespace\n\t\ttrimWhitespace( items, removeLeadingWhitespace ? leadingWhitespace$1 : null, removeTrailingWhitespace ? trailingWhitespace : null );\n\n\t\ti = items.length;\n\t\twhile ( i-- ) {\n\t\t\titem = items[i];\n\n\t\t\t// Recurse\n\t\t\tif ( item.f ) {\n\t\t\t\tvar isPreserveWhitespaceElement = item.t === ELEMENT && preserveWhitespaceElements.test( item.e );\n\t\t\t\tpreserveWhitespaceInsideFragment = preserveWhitespace || isPreserveWhitespaceElement;\n\n\t\t\t\tif ( !preserveWhitespace && isPreserveWhitespaceElement ) {\n\t\t\t\t\ttrimWhitespace( item.f, leadingNewLine, trailingNewLine );\n\t\t\t\t}\n\n\t\t\t\tif ( !preserveWhitespaceInsideFragment ) {\n\t\t\t\t\tpreviousItem = items[ i - 1 ];\n\t\t\t\t\tnextItem = items[ i + 1 ];\n\n\t\t\t\t\t// if the previous item was a text item with trailing whitespace,\n\t\t\t\t\t// remove leading whitespace inside the fragment\n\t\t\t\t\tif ( !previousItem || ( typeof previousItem === 'string' && trailingWhitespace.test( previousItem ) ) ) {\n\t\t\t\t\t\tremoveLeadingWhitespaceInsideFragment = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// and vice versa\n\t\t\t\t\tif ( !nextItem || ( typeof nextItem === 'string' && leadingWhitespace$1.test( nextItem ) ) ) {\n\t\t\t\t\t\tremoveTrailingWhitespaceInsideFragment = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcleanup( item.f, stripComments, preserveWhitespaceInsideFragment, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespaceInsideFragment );\n\n\t\t\t\t// clean up name templates (events, decorators, etc)\n\t\t\t\tif ( isArray( item.f.n ) ) {\n\t\t\t\t\tcleanup( item.f.n, stripComments, preserveWhitespace, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespace );\n\t\t\t\t}\n\n\t\t\t\t// clean up arg templates (events, decorators, etc)\n\t\t\t\tif ( isArray( item.f.d ) ) {\n\t\t\t\t\tcleanup( item.f.d, stripComments, preserveWhitespace, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespace );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Split if-else blocks into two (an if, and an unless)\n\t\t\tif ( item.l ) {\n\t\t\t\tcleanup( item.l, stripComments, preserveWhitespace, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespaceInsideFragment );\n\n\t\t\t\titem.l.forEach( function ( s ) { return s.l = 1; } );\n\t\t\t\titem.l.unshift( i + 1, 0 );\n\t\t\t\titems.splice.apply( items, item.l );\n\t\t\t\tdelete item.l; // TODO would be nice if there was a way around this\n\t\t\t}\n\n\t\t\t// Clean up element attributes\n\t\t\tif ( item.a ) {\n\t\t\t\tfor ( key in item.a ) {\n\t\t\t\t\tif ( item.a.hasOwnProperty( key ) && typeof item.a[ key ] !== 'string' ) {\n\t\t\t\t\t\tcleanup( item.a[ key ], stripComments, preserveWhitespace, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespaceInsideFragment );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Clean up conditional attributes\n\t\t\tif ( item.m ) {\n\t\t\t\tcleanup( item.m, stripComments, preserveWhitespace, removeLeadingWhitespaceInsideFragment, removeTrailingWhitespaceInsideFragment );\n\t\t\t\tif ( item.m.length < 1 ) delete item.m;\n\t\t\t}\n\t\t}\n\n\t\t// final pass - fuse text nodes together\n\t\ti = items.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( typeof items[i] === 'string' ) {\n\t\t\t\tif ( typeof items[i+1] === 'string' ) {\n\t\t\t\t\titems[i] = items[i] + items[i+1];\n\t\t\t\t\titems.splice( i + 1, 1 );\n\t\t\t\t}\n\n\t\t\t\tif ( !preserveWhitespace ) {\n\t\t\t\t\titems[i] = items[i].replace( contiguousWhitespace, ' ' );\n\t\t\t\t}\n\n\t\t\t\tif ( items[i] === '' ) {\n\t\t\t\t\titems.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar closingTagPattern = /^([a-zA-Z]{1,}:?[a-zA-Z0-9\\-]*)\\s*\\>/;\n\n\tfunction readClosingTag ( parser ) {\n\t\tvar start, tag;\n\n\t\tstart = parser.pos;\n\n\t\t// are we looking at a closing tag?\n\t\tif ( !parser.matchString( '</' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( tag = parser.matchPattern( closingTagPattern ) ) {\n\t\t\tif ( parser.inside && tag !== parser.inside ) {\n\t\t\t\tparser.pos = start;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tt: CLOSING_TAG,\n\t\t\t\te: tag\n\t\t\t};\n\t\t}\n\n\t\t// We have an illegal closing tag, report it\n\t\tparser.pos -= 2;\n\t\tparser.error( 'Illegal closing tag' );\n\t}\n\n\tvar tagNamePattern = /^[a-zA-Z]{1,}:?[a-zA-Z0-9\\-]*/;\n\tvar validTagNameFollower = /^[\\s\\n\\/>]/;\n\tvar exclude = { exclude: true };\n\tvar disallowedContents;\n\t// based on http://developers.whatwg.org/syntax.html#syntax-tag-omission\n\tdisallowedContents = {\n\t\tli: [ 'li' ],\n\t\tdt: [ 'dt', 'dd' ],\n\t\tdd: [ 'dt', 'dd' ],\n\t\tp: 'address article aside blockquote div dl fieldset footer form h1 h2 h3 h4 h5 h6 header hgroup hr main menu nav ol p pre section table ul'.split( ' ' ),\n\t\trt: [ 'rt', 'rp' ],\n\t\trp: [ 'rt', 'rp' ],\n\t\toptgroup: [ 'optgroup' ],\n\t\toption: [ 'option', 'optgroup' ],\n\t\tthead: [ 'tbody', 'tfoot' ],\n\t\ttbody: [ 'tbody', 'tfoot' ],\n\t\ttfoot: [ 'tbody' ],\n\t\ttr: [ 'tr', 'tbody' ],\n\t\ttd: [ 'td', 'th', 'tr' ],\n\t\tth: [ 'td', 'th', 'tr' ]\n\t};\n\n\tfunction readElement ( parser ) {\n\t\tvar start,\n\t\t\telement,\n\t\t\tattribute,\n\t\t\tselfClosing,\n\t\t\tchildren,\n\t\t\tpartials,\n\t\t\thasPartials,\n\t\t\tchild,\n\t\t\tclosed,\n\t\t\tpos,\n\t\t\tremaining,\n\t\t\tclosingTag;\n\n\t\tstart = parser.pos;\n\n\t\tif ( parser.inside || parser.inAttribute || parser.textOnlyMode ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchString( '<' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// if this is a closing tag, abort straight away\n\t\tif ( parser.nextChar() === '/' ) {\n\t\t\treturn null;\n\t\t}\n\n\t\telement = {};\n\t\tif ( parser.includeLinePositions ) {\n\t\t\telement.p = parser.getLinePos( start );\n\t\t}\n\n\t\tif ( parser.matchString( '!' ) ) {\n\t\t\telement.t = DOCTYPE;\n\t\t\tif ( !parser.matchPattern( /^doctype/i ) ) {\n\t\t\t\tparser.error( 'Expected DOCTYPE declaration' );\n\t\t\t}\n\n\t\t\telement.a = parser.matchPattern( /^(.+?)>/ );\n\t\t\treturn element;\n\t\t}\n\n\t\telement.t = ELEMENT;\n\n\t\t// element name\n\t\telement.e = parser.matchPattern( tagNamePattern );\n\t\tif ( !element.e ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// next character must be whitespace, closing solidus or '>'\n\t\tif ( !validTagNameFollower.test( parser.nextChar() ) ) {\n\t\t\tparser.error( 'Illegal tag name' );\n\t\t}\n\n\t\tparser.allowWhitespace();\n\n\t\tparser.inTag = true;\n\n\t\t// directives and attributes\n\t\twhile ( attribute = readMustache( parser ) ) {\n\t\t\tif ( attribute !== false ) {\n\t\t\t\tif ( !element.m ) element.m = [];\n\t\t\t\telement.m.push( attribute );\n\t\t\t}\n\n\t\t\tparser.allowWhitespace();\n\t\t}\n\n\t\tparser.inTag = false;\n\n\t\t// allow whitespace before closing solidus\n\t\tparser.allowWhitespace();\n\n\t\t// self-closing solidus?\n\t\tif ( parser.matchString( '/' ) ) {\n\t\t\tselfClosing = true;\n\t\t}\n\n\t\t// closing angle bracket\n\t\tif ( !parser.matchString( '>' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar lowerCaseName = element.e.toLowerCase();\n\t\tvar preserveWhitespace = parser.preserveWhitespace;\n\n\t\tif ( !selfClosing && !voidElementNames.test( element.e ) ) {\n\t\t\tparser.elementStack.push( lowerCaseName );\n\n\t\t\t// Special case - if we open a script element, further tags should\n\t\t\t// be ignored unless they're a closing script element\n\t\t\tif ( lowerCaseName === 'script' || lowerCaseName === 'style' || lowerCaseName === 'textarea' ) {\n\t\t\t\tparser.inside = lowerCaseName;\n\t\t\t}\n\n\t\t\tchildren = [];\n\t\t\tpartials = create( null );\n\n\t\t\tdo {\n\t\t\t\tpos = parser.pos;\n\t\t\t\tremaining = parser.remaining();\n\n\t\t\t\tif ( !remaining ) {\n\t\t\t\t\tparser.error( (\"Missing end \" + (parser.elementStack.length > 1 ? 'tags' : 'tag') + \" (\" + (parser.elementStack.reverse().map( function ( x ) { return (\"</\" + x + \">\"); } ).join( '' )) + \")\") );\n\t\t\t\t}\n\n\t\t\t\t// if for example we're in an <li> element, and we see another\n\t\t\t\t// <li> tag, close the first so they become siblings\n\t\t\t\tif ( !canContain( lowerCaseName, remaining ) ) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t}\n\n\t\t\t\t// closing tag\n\t\t\t\telse if ( closingTag = readClosingTag( parser ) ) {\n\t\t\t\t\tclosed = true;\n\n\t\t\t\t\tvar closingTagName = closingTag.e.toLowerCase();\n\n\t\t\t\t\t// if this *isn't* the closing tag for the current element...\n\t\t\t\t\tif ( closingTagName !== lowerCaseName ) {\n\t\t\t\t\t\t// rewind parser\n\t\t\t\t\t\tparser.pos = pos;\n\n\t\t\t\t\t\t// if it doesn't close a parent tag, error\n\t\t\t\t\t\tif ( !~parser.elementStack.indexOf( closingTagName ) ) {\n\t\t\t\t\t\t\tvar errorMessage = 'Unexpected closing tag';\n\n\t\t\t\t\t\t\t// add additional help for void elements, since component names\n\t\t\t\t\t\t\t// might clash with them\n\t\t\t\t\t\t\tif ( voidElementNames.test( closingTagName ) ) {\n\t\t\t\t\t\t\t\terrorMessage += \" (<\" + closingTagName + \"> is a void element - it cannot contain children)\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tparser.error( errorMessage );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// implicit close by closing section tag. TODO clean this up\n\t\t\t\telse if ( child = readClosing( parser, { open: parser.standardDelimiters[0], close: parser.standardDelimiters[1] } ) ) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t\tparser.pos = pos;\n\t\t\t\t}\n\n\t\t\t\telse {\n\t\t\t\t\tif ( child = parser.read( PARTIAL_READERS ) ) {\n\t\t\t\t\t\tif ( partials[ child.n ] ) {\n\t\t\t\t\t\t\tparser.pos = pos;\n\t\t\t\t\t\t\tparser.error( 'Duplicate partial definition' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcleanup( child.f, parser.stripComments, preserveWhitespace, !preserveWhitespace, !preserveWhitespace );\n\n\t\t\t\t\t\tpartials[ child.n ] = child.f;\n\t\t\t\t\t\thasPartials = true;\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\t\t\t\t\t\tif ( child = parser.read( READERS ) ) {\n\t\t\t\t\t\t\tchildren.push( child );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while ( !closed );\n\n\t\t\tif ( children.length ) {\n\t\t\t\telement.f = children;\n\t\t\t}\n\n\t\t\tif ( hasPartials ) {\n\t\t\t\telement.p = partials;\n\t\t\t}\n\n\t\t\tparser.elementStack.pop();\n\t\t}\n\n\t\tparser.inside = null;\n\n\t\tif ( parser.sanitizeElements && parser.sanitizeElements.indexOf( lowerCaseName ) !== -1 ) {\n\t\t\treturn exclude;\n\t\t}\n\n\t\treturn element;\n\t}\n\n\tfunction canContain ( name, remaining ) {\n\t\tvar match, disallowed;\n\n\t\tmatch = /^<([a-zA-Z][a-zA-Z0-9]*)/.exec( remaining );\n\t\tdisallowed = disallowedContents[ name ];\n\n\t\tif ( !match || !disallowed ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn !~disallowed.indexOf( match[1].toLowerCase() );\n\t}\n\n\tfunction readText ( parser ) {\n\t\tvar index, remaining, disallowed, barrier;\n\n\t\tremaining = parser.remaining();\n\n\t\tif ( parser.textOnlyMode ) {\n\t\t\tdisallowed = parser.tags.map( function ( t ) { return t.open; } );\n\t\t\tdisallowed = disallowed.concat( parser.tags.map( function ( t ) { return '\\\\' + t.open; } ) );\n\n\t\t\tindex = getLowestIndex( remaining, disallowed );\n\t\t} else {\n\t\t\tbarrier = parser.inside ? '</' + parser.inside : '<';\n\n\t\t\tif ( parser.inside && !parser.interpolate[ parser.inside ] ) {\n\t\t\t\tindex = remaining.indexOf( barrier );\n\t\t\t} else {\n\t\t\t\tdisallowed = parser.tags.map( function ( t ) { return t.open; } );\n\t\t\t\tdisallowed = disallowed.concat( parser.tags.map( function ( t ) { return '\\\\' + t.open; } ) );\n\n\t\t\t\t// http://developers.whatwg.org/syntax.html#syntax-attributes\n\t\t\t\tif ( parser.inAttribute === true ) {\n\t\t\t\t\t// we're inside an unquoted attribute value\n\t\t\t\t\tdisallowed.push( (\"\\\"\"), (\"'\"), (\"=\"), (\"<\"), (\">\"), '`' );\n\t\t\t\t} else if ( parser.inAttribute ) {\n\t\t\t\t\t// quoted attribute value\n\t\t\t\t\tdisallowed.push( parser.inAttribute );\n\t\t\t\t} else {\n\t\t\t\t\tdisallowed.push( barrier );\n\t\t\t\t}\n\n\t\t\t\tindex = getLowestIndex( remaining, disallowed );\n\t\t\t}\n\t\t}\n\n\t\tif ( !index ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( index === -1 ) {\n\t\t\tindex = remaining.length;\n\t\t}\n\n\t\tparser.pos += index;\n\n\t\tif ( ( parser.inside && parser.inside !== 'textarea' ) || parser.textOnlyMode ) {\n\t\t\treturn remaining.substr( 0, index );\n\t\t} else {\n\t\t\treturn decodeCharacterReferences( remaining.substr( 0, index ) );\n\t\t}\n\t}\n\n\tvar startPattern = /^<!--\\s*/;\n\tvar namePattern$1 = /s*>\\s*([a-zA-Z_$][-a-zA-Z_$0-9]*)\\s*/;\n\tvar finishPattern = /\\s*-->/;\n\n\tfunction readPartialDefinitionComment ( parser ) {\n\t\tvar start = parser.pos;\n\t\tvar open = parser.standardDelimiters[0];\n\t\tvar close = parser.standardDelimiters[1];\n\n\t\tif ( !parser.matchPattern( startPattern ) || !parser.matchString( open ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tvar name = parser.matchPattern( namePattern$1 );\n\n\t\twarnOnceIfDebug( (\"Inline partial comments are deprecated.\\nUse this...\\n  {{#partial \" + name + \"}} ... {{/partial}}\\n\\n...instead of this:\\n  <!-- {{>\" + name + \"}} --> ... <!-- {{/\" + name + \"}} -->'\") );\n\n\t\t// make sure the rest of the comment is in the correct place\n\t\tif ( !parser.matchString( close ) || !parser.matchPattern( finishPattern ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tvar content = [];\n\t\tvar closed;\n\n\t\tvar endPattern = new RegExp('^<!--\\\\s*' + escapeRegExp( open ) + '\\\\s*\\\\/\\\\s*' + name + '\\\\s*' + escapeRegExp( close ) + '\\\\s*-->');\n\n\t\tdo {\n\t\t\tif ( parser.matchPattern( endPattern ) ) {\n\t\t\t\tclosed = true;\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tvar child = parser.read( READERS );\n\t\t\t\tif ( !child ) {\n\t\t\t\t\tparser.error( (\"expected closing comment ('<!-- \" + open + \"/\" + name + \"\" + close + \" -->')\") );\n\t\t\t\t}\n\n\t\t\t\tcontent.push( child );\n\t\t\t}\n\t\t} while ( !closed );\n\n\t\treturn {\n\t\t\tt: INLINE_PARTIAL,\n\t\t\tf: content,\n\t\t\tn: name\n\t\t};\n\t}\n\n\tvar partialDefinitionSectionPattern = /^\\s*#\\s*partial\\s+/;\n\n\tfunction readPartialDefinitionSection ( parser ) {\n\t\tvar start, name, content, child, closed;\n\n\t\tstart = parser.pos;\n\n\t\tvar delimiters = parser.standardDelimiters;\n\n\t\tif ( !parser.matchString( delimiters[0] ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !parser.matchPattern( partialDefinitionSectionPattern ) ) {\n\t\t\tparser.pos = start;\n\t\t\treturn null;\n\t\t}\n\n\t\tname = parser.matchPattern( /^[a-zA-Z_$][a-zA-Z_$0-9\\-\\/]*/ );\n\n\t\tif ( !name ) {\n\t\t\tparser.error( 'expected legal partial name' );\n\t\t}\n\n\t\tparser.allowWhitespace();\n\t\tif ( !parser.matchString( delimiters[1] ) ) {\n\t\t\tparser.error( (\"Expected closing delimiter '\" + (delimiters[1]) + \"'\") );\n\t\t}\n\n\t\tcontent = [];\n\n\t\tdo {\n\t\t\t// TODO clean this up\n\t\t\tif ( child = readClosing( parser, { open: parser.standardDelimiters[0], close: parser.standardDelimiters[1] }) ) {\n\t\t\t\tif ( !child.r === 'partial' ) {\n\t\t\t\t\tparser.error( (\"Expected \" + (delimiters[0]) + \"/partial\" + (delimiters[1])) );\n\t\t\t\t}\n\n\t\t\t\tclosed = true;\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tchild = parser.read( READERS );\n\n\t\t\t\tif ( !child ) {\n\t\t\t\t\tparser.error( (\"Expected \" + (delimiters[0]) + \"/partial\" + (delimiters[1])) );\n\t\t\t\t}\n\n\t\t\t\tcontent.push( child );\n\t\t\t}\n\t\t} while ( !closed );\n\n\t\treturn {\n\t\t\tt: INLINE_PARTIAL,\n\t\t\tn: name,\n\t\t\tf: content\n\t\t};\n\t}\n\n\tfunction readTemplate ( parser ) {\n\t\tvar fragment = [];\n\t\tvar partials = create( null );\n\t\tvar hasPartials = false;\n\n\t\tvar preserveWhitespace = parser.preserveWhitespace;\n\n\t\twhile ( parser.pos < parser.str.length ) {\n\t\t\tvar pos = parser.pos, item, partial;\n\n\t\t\tif ( partial = parser.read( PARTIAL_READERS ) ) {\n\t\t\t\tif ( partials[ partial.n ] ) {\n\t\t\t\t\tparser.pos = pos;\n\t\t\t\t\tparser.error( 'Duplicated partial definition' );\n\t\t\t\t}\n\n\t\t\t\tcleanup( partial.f, parser.stripComments, preserveWhitespace, !preserveWhitespace, !preserveWhitespace );\n\n\t\t\t\tpartials[ partial.n ] = partial.f;\n\t\t\t\thasPartials = true;\n\t\t\t} else if ( item = parser.read( READERS ) ) {\n\t\t\t\tfragment.push( item );\n\t\t\t} else  {\n\t\t\t\tparser.error( 'Unexpected template content' );\n\t\t\t}\n\t\t}\n\n\t\tvar result = {\n\t\t\tv: TEMPLATE_VERSION,\n\t\t\tt: fragment\n\t\t};\n\n\t\tif ( hasPartials ) {\n\t\t\tresult.p = partials;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tfunction insertExpressions ( obj, expr ) {\n\n\t\tObject.keys( obj ).forEach( function ( key ) {\n\t\t\tif  ( isExpression( key, obj ) ) return addTo( obj, expr );\n\n\t\t\tvar ref = obj[ key ];\n\t\t\tif ( hasChildren( ref ) ) insertExpressions( ref, expr );\n\t \t});\n\t}\n\n\tfunction isExpression( key, obj ) {\n\t\treturn key === 's' && isArray( obj.r );\n\t}\n\n\tfunction addTo( obj, expr ) {\n\t\tvar s = obj.s, r = obj.r;\n\t\tif ( !expr[ s ] ) expr[ s ] = fromExpression( s, r.length );\n\t}\n\n\tfunction hasChildren( ref ) {\n\t\treturn isArray( ref ) || isObject( ref );\n\t}\n\n\t// See https://github.com/ractivejs/template-spec for information\n\t// about the Ractive template specification\n\n\tvar STANDARD_READERS = [ readPartial, readUnescaped, readSection, readYielder, readInterpolator, readComment ];\n\tvar TRIPLE_READERS = [ readTriple ];\n\tvar STATIC_READERS = [ readUnescaped, readSection, readInterpolator ]; // TODO does it make sense to have a static section?\n\n\tvar StandardParser;\n\n\tfunction parse ( template, options ) {\n\t\treturn new StandardParser( template, options || {} ).result;\n\t}\n\n\tparse.computedStrings = function( computed ) {\n\t\tif ( !computed ) return [];\n\n\t\tObject.keys( computed ).forEach( function ( key ) {\n\t\t\tvar value = computed[ key ];\n\t\t\tif ( typeof value === 'string' ) {\n\t\t\t\tcomputed[ key ] = fromComputationString( value );\n\t\t\t}\n\t\t});\n\t};\n\n\n\tvar READERS = [ readMustache, readHtmlComment, readElement, readText ];\n\tvar PARTIAL_READERS = [ readPartialDefinitionComment, readPartialDefinitionSection ];\n\n\tStandardParser = Parser$1.extend({\n\t\tinit: function ( str, options ) {\n\t\t\tvar tripleDelimiters = options.tripleDelimiters || [ '{{{', '}}}' ],\n\t\t\t\tstaticDelimiters = options.staticDelimiters || [ '[[', ']]' ],\n\t\t\t\tstaticTripleDelimiters = options.staticTripleDelimiters || [ '[[[', ']]]' ];\n\n\t\t\tthis.standardDelimiters = options.delimiters || [ '{{', '}}' ];\n\n\t\t\tthis.tags = [\n\t\t\t\t{ isStatic: false, isTriple: false, open: this.standardDelimiters[0], close: this.standardDelimiters[1], readers: STANDARD_READERS },\n\t\t\t\t{ isStatic: false, isTriple: true,  open: tripleDelimiters[0],        close: tripleDelimiters[1],        readers: TRIPLE_READERS },\n\t\t\t\t{ isStatic: true,  isTriple: false, open: staticDelimiters[0],        close: staticDelimiters[1],        readers: STATIC_READERS },\n\t\t\t\t{ isStatic: true,  isTriple: true,  open: staticTripleDelimiters[0],  close: staticTripleDelimiters[1],  readers: TRIPLE_READERS }\n\t\t\t];\n\n\t\t\tthis.contextLines = options.contextLines || 0;\n\n\t\t\tthis.sortMustacheTags();\n\n\t\t\tthis.sectionDepth = 0;\n\t\t\tthis.elementStack = [];\n\n\t\t\tthis.interpolate = {\n\t\t\t\tscript: !options.interpolate || options.interpolate.script !== false,\n\t\t\t\tstyle: !options.interpolate || options.interpolate.style !== false,\n\t\t\t\ttextarea: true\n\t\t\t};\n\n\t\t\tif ( options.sanitize === true ) {\n\t\t\t\toptions.sanitize = {\n\t\t\t\t\t// blacklist from https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/lang/html/html4-elements-whitelist.json\n\t\t\t\t\telements: 'applet base basefont body frame frameset head html isindex link meta noframes noscript object param script style title'.split( ' ' ),\n\t\t\t\t\teventAttributes: true\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.stripComments = options.stripComments !== false;\n\t\t\tthis.preserveWhitespace = options.preserveWhitespace;\n\t\t\tthis.sanitizeElements = options.sanitize && options.sanitize.elements;\n\t\t\tthis.sanitizeEventAttributes = options.sanitize && options.sanitize.eventAttributes;\n\t\t\tthis.includeLinePositions = options.includeLinePositions;\n\t\t\tthis.textOnlyMode = options.textOnlyMode;\n\t\t\tthis.csp = options.csp;\n\t\t},\n\n\t\tpostProcess: function ( result ) {\n\t\t\t// special case - empty string\n\t\t\tif ( !result.length ) {\n\t\t\t\treturn { t: [], v: TEMPLATE_VERSION };\n\t\t\t}\n\n\t\t\tif ( this.sectionDepth > 0 ) {\n\t\t\t\tthis.error( 'A section was left open' );\n\t\t\t}\n\n\t\t\tcleanup( result[0].t, this.stripComments, this.preserveWhitespace, !this.preserveWhitespace, !this.preserveWhitespace );\n\n\t\t\tif ( this.csp !== false ) {\n\t\t\t\tvar expr = {};\n\t\t\t\tinsertExpressions( result[0].t, expr );\n\t\t\t\tif ( Object.keys( expr ).length ) result[0].e = expr;\n\t\t\t}\n\n\t\t\treturn result[0];\n\t\t},\n\n\t\tconverters: [\n\t\t\treadTemplate\n\t\t],\n\n\t\tsortMustacheTags: function () {\n\t\t\t// Sort in order of descending opening delimiter length (longer first),\n\t\t\t// to protect against opening delimiters being substrings of each other\n\t\t\tthis.tags.sort( function ( a, b ) {\n\t\t\t\treturn b.open.length - a.open.length;\n\t\t\t});\n\t\t}\n\t});\n\n\tvar parseOptions = [\n\t\t'delimiters',\n\t\t'tripleDelimiters',\n\t\t'staticDelimiters',\n\t\t'staticTripleDelimiters',\n\t\t'csp',\n\t\t'interpolate',\n\t\t'preserveWhitespace',\n\t\t'sanitize',\n\t\t'stripComments',\n\t\t'contextLines'\n\t];\n\n\tvar TEMPLATE_INSTRUCTIONS = \"Either preparse or use a ractive runtime source that includes the parser. \";\n\n\tvar COMPUTATION_INSTRUCTIONS = \"Either use:\\n\\n\\tRactive.parse.computedStrings( component.computed )\\n\\nat build time to pre-convert the strings to functions, or use functions instead of strings in computed properties.\";\n\n\n\tfunction throwNoParse ( method, error, instructions ) {\n\t\tif ( !method ) {\n\t\t\tfatal( (\"Missing Ractive.parse - cannot parse \" + error + \". \" + instructions) );\n\t\t}\n\t}\n\n\tfunction createFunction ( body, length ) {\n\t\tthrowNoParse( fromExpression, 'new expression function', TEMPLATE_INSTRUCTIONS );\n\t\treturn fromExpression( body, length );\n\t}\n\n\tfunction createFunctionFromString ( str, bindTo ) {\n\t\tthrowNoParse( fromComputationString, 'compution string \"${str}\"', COMPUTATION_INSTRUCTIONS );\n\t\treturn fromComputationString( str, bindTo );\n\t}\n\n\tvar parser = {\n\n\t\tfromId: function ( id, options ) {\n\t\t\tif ( !doc ) {\n\t\t\t\tif ( options && options.noThrow ) { return; }\n\t\t\t\tthrow new Error( (\"Cannot retrieve template #\" + id + \" as Ractive is not running in a browser.\") );\n\t\t\t}\n\n\t\t\tif ( id ) id = id.replace( /^#/, '' );\n\n\t\t\tvar template;\n\n\t\t\tif ( !( template = doc.getElementById( id ) )) {\n\t\t\t\tif ( options && options.noThrow ) { return; }\n\t\t\t\tthrow new Error( (\"Could not find template element with id #\" + id) );\n\t\t\t}\n\n\t\t\tif ( template.tagName.toUpperCase() !== 'SCRIPT' ) {\n\t\t\t\tif ( options && options.noThrow ) { return; }\n\t\t\t\tthrow new Error( (\"Template element with id #\" + id + \", must be a <script> element\") );\n\t\t\t}\n\n\t\t\treturn ( 'textContent' in template ? template.textContent : template.innerHTML );\n\n\t\t},\n\n\t\tisParsed: function ( template) {\n\t\t\treturn !( typeof template === 'string' );\n\t\t},\n\n\t\tgetParseOptions: function ( ractive ) {\n\t\t\t// Could be Ractive or a Component\n\t\t\tif ( ractive.defaults ) { ractive = ractive.defaults; }\n\n\t\t\treturn parseOptions.reduce( function ( val, key ) {\n\t\t\t\tval[ key ] = ractive[ key ];\n\t\t\t\treturn val;\n\t\t\t}, {});\n\t\t},\n\n\t\tparse: function ( template, options ) {\n\t\t\tthrowNoParse( parse, 'template', TEMPLATE_INSTRUCTIONS );\n\t\t\tvar parsed = parse( template, options );\n\t\t\taddFunctions( parsed );\n\t\t\treturn parsed;\n\t\t},\n\n\t\tparseFor: function( template, ractive ) {\n\t\t\treturn this.parse( template, this.getParseOptions( ractive ) );\n\t\t}\n\t};\n\n\tvar templateConfigurator = {\n\t\tname: 'template',\n\n\t\textend: function ( Parent, proto, options ) {\n\t\t\t// only assign if exists\n\t\t\tif ( 'template' in options ) {\n\t\t\t\tvar template = options.template;\n\n\t\t\t\tif ( typeof template === 'function' ) {\n\t\t\t\t\tproto.template = template;\n\t\t\t\t} else {\n\t\t\t\t\tproto.template = parseTemplate( template, proto );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tinit: function ( Parent, ractive, options ) {\n\t\t\t// TODO because of prototypal inheritance, we might just be able to use\n\t\t\t// ractive.template, and not bother passing through the Parent object.\n\t\t\t// At present that breaks the test mocks' expectations\n\t\t\tvar template = 'template' in options ? options.template : Parent.prototype.template;\n\t\t\ttemplate = template || { v: TEMPLATE_VERSION, t: [] };\n\n\t\t\tif ( typeof template === 'function' ) {\n\t\t\t\tvar fn = template;\n\t\t\t\ttemplate = getDynamicTemplate( ractive, fn );\n\n\t\t\t\tractive._config.template = {\n\t\t\t\t\tfn: fn,\n\t\t\t\t\tresult: template\n\t\t\t\t};\n\t\t\t}\n\n\t\t\ttemplate = parseTemplate( template, ractive );\n\n\t\t\t// TODO the naming of this is confusing - ractive.template refers to [...],\n\t\t\t// but Component.prototype.template refers to {v:1,t:[],p:[]}...\n\t\t\t// it's unnecessary, because the developer never needs to access\n\t\t\t// ractive.template\n\t\t\tractive.template = template.t;\n\n\t\t\tif ( template.p ) {\n\t\t\t\textendPartials( ractive.partials, template.p );\n\t\t\t}\n\t\t},\n\n\t\treset: function ( ractive ) {\n\t\t\tvar result = resetValue( ractive );\n\n\t\t\tif ( result ) {\n\t\t\t\tvar parsed = parseTemplate( result, ractive );\n\n\t\t\t\tractive.template = parsed.t;\n\t\t\t\textendPartials( ractive.partials, parsed.p, true );\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction resetValue ( ractive ) {\n\t\tvar initial = ractive._config.template;\n\n\t\t// If this isn't a dynamic template, there's nothing to do\n\t\tif ( !initial || !initial.fn ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar result = getDynamicTemplate( ractive, initial.fn );\n\n\t\t// TODO deep equality check to prevent unnecessary re-rendering\n\t\t// in the case of already-parsed templates\n\t\tif ( result !== initial.result ) {\n\t\t\tinitial.result = result;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tfunction getDynamicTemplate ( ractive, fn ) {\n\t\treturn fn.call( ractive, {\n\t\t\tfromId: parser.fromId,\n\t\t\tisParsed: parser.isParsed,\n\t\t\tparse: function ( template, options ) {\n\t\t\t\tif ( options === void 0 ) options = parser.getParseOptions( ractive );\n\n\t\t\t\treturn parser.parse( template, options );\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction parseTemplate ( template, ractive ) {\n\t\tif ( typeof template === 'string' ) {\n\t\t\t// parse will validate and add expression functions\n\t\t\ttemplate = parseAsString( template, ractive );\n\t\t}\n\t\telse {\n\t\t\t// need to validate and add exp for already parsed template\n\t\t\tvalidate$1( template );\n\t\t\taddFunctions( template );\n\t\t}\n\n\t\treturn template;\n\t}\n\n\tfunction parseAsString ( template, ractive ) {\n\t\t// ID of an element containing the template?\n\t\tif ( template[0] === '#' ) {\n\t\t\ttemplate = parser.fromId( template );\n\t\t}\n\n\t\treturn parser.parseFor( template, ractive );\n\t}\n\n\tfunction validate$1( template ) {\n\n\t\t// Check that the template even exists\n\t\tif ( template == undefined ) {\n\t\t\tthrow new Error( (\"The template cannot be \" + template + \".\") );\n\t\t}\n\n\t\t// Check the parsed template has a version at all\n\t\telse if ( typeof template.v !== 'number' ) {\n\t\t\tthrow new Error( 'The template parser was passed a non-string template, but the template doesn\\'t have a version.  Make sure you\\'re passing in the template you think you are.' );\n\t\t}\n\n\t\t// Check we're using the correct version\n\t\telse if ( template.v !== TEMPLATE_VERSION ) {\n\t\t\tthrow new Error( (\"Mismatched template version (expected \" + TEMPLATE_VERSION + \", got \" + (template.v) + \") Please ensure you are using the latest version of Ractive.js in your build process as well as in your app\") );\n\t\t}\n\t}\n\n\tfunction extendPartials ( existingPartials, newPartials, overwrite ) {\n\t\tif ( !newPartials ) return;\n\n\t\t// TODO there's an ambiguity here - we need to overwrite in the `reset()`\n\t\t// case, but not initially...\n\n\t\tfor ( var key in newPartials ) {\n\t\t\tif ( overwrite || !existingPartials.hasOwnProperty( key ) ) {\n\t\t\t\texistingPartials[ key ] = newPartials[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\tvar registryNames = [\n\t\t'adaptors',\n\t\t'components',\n\t\t'computed',\n\t\t'decorators',\n\t\t'easing',\n\t\t'events',\n\t\t'interpolators',\n\t\t'partials',\n\t\t'transitions'\n\t];\n\n\tvar Registry = function Registry ( name, useDefaults ) {\n\t\tthis.name = name;\n\t\tthis.useDefaults = useDefaults;\n\t};\n\n\tRegistry.prototype.extend = function extend ( Parent, proto, options ) {\n\t\tthis.configure(\n\t\t\tthis.useDefaults ? Parent.defaults : Parent,\n\t\t\tthis.useDefaults ? proto : proto.constructor,\n\t\t\toptions );\n\t};\n\n\tRegistry.prototype.init = function init () {\n\t\t// noop\n\t};\n\n\tRegistry.prototype.configure = function configure ( Parent, target, options ) {\n\t\tvar name = this.name;\n\t\tvar option = options[ name ];\n\n\t\tvar registry = create( Parent[name] );\n\n\t\tfor ( var key in option ) {\n\t\t\tregistry[ key ] = option[ key ];\n\t\t}\n\n\t\ttarget[ name ] = registry;\n\t};\n\n\tRegistry.prototype.reset = function reset ( ractive ) {\n\t\tvar registry = ractive[ this.name ];\n\t\tvar changed = false;\n\n\t\tObject.keys( registry ).forEach( function ( key ) {\n\t\t\tvar item = registry[ key ];\n\t\t\t\t\n\t\t\tif ( item._fn ) {\n\t\t\t\tif ( item._fn.isOwner ) {\n\t\t\t\t\tregistry[key] = item._fn;\n\t\t\t\t} else {\n\t\t\t\t\tdelete registry[key];\n\t\t\t\t}\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\n\t\treturn changed;\n\t};\n\n\tvar registries = registryNames.map( function ( name ) { return new Registry( name, name === 'computed' ); } );\n\n\tfunction wrap ( parent, name, method ) {\n\t\tif ( !/_super/.test( method ) ) return method;\n\n\t\tfunction wrapper () {\n\t\t\tvar superMethod = getSuperMethod( wrapper._parent, name );\n\t\t\tvar hasSuper = '_super' in this;\n\t\t\tvar oldSuper = this._super;\n\n\t\t\tthis._super = superMethod;\n\n\t\t\tvar result = method.apply( this, arguments );\n\n\t\t\tif ( hasSuper ) {\n\t\t\t\tthis._super = oldSuper;\n\t\t\t} else {\n\t\t\t\tdelete this._super;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\twrapper._parent = parent;\n\t\twrapper._method = method;\n\n\t\treturn wrapper;\n\t}\n\n\tfunction getSuperMethod ( parent, name ) {\n\t\tif ( name in parent ) {\n\t\t\tvar value = parent[ name ];\n\n\t\t\treturn typeof value === 'function' ?\n\t\t\t\tvalue :\n\t\t\t\tfunction () { return value; };\n\t\t}\n\n\t\treturn noop;\n\t}\n\n\tfunction getMessage( deprecated, correct, isError ) {\n\t\treturn \"options.\" + deprecated + \" has been deprecated in favour of options.\" + correct + \".\"\n\t\t\t+ ( isError ? (\" You cannot specify both options, please use options.\" + correct + \".\") : '' );\n\t}\n\n\tfunction deprecateOption ( options, deprecatedOption, correct ) {\n\t\tif ( deprecatedOption in options ) {\n\t\t\tif( !( correct in options ) ) {\n\t\t\t\twarnIfDebug( getMessage( deprecatedOption, correct ) );\n\t\t\t\toptions[ correct ] = options[ deprecatedOption ];\n\t\t\t} else {\n\t\t\t\tthrow new Error( getMessage( deprecatedOption, correct, true ) );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction deprecate ( options ) {\n\t\tdeprecateOption( options, 'beforeInit', 'onconstruct' );\n\t\tdeprecateOption( options, 'init', 'onrender' );\n\t\tdeprecateOption( options, 'complete', 'oncomplete' );\n\t\tdeprecateOption( options, 'eventDefinitions', 'events' );\n\n\t\t// Using extend with Component instead of options,\n\t\t// like Human.extend( Spider ) means adaptors as a registry\n\t\t// gets copied to options. So we have to check if actually an array\n\t\tif ( isArray( options.adaptors ) ) {\n\t\t\tdeprecateOption( options, 'adaptors', 'adapt' );\n\t\t}\n\t}\n\n\tvar custom = {\n\t\tadapt: adaptConfigurator,\n\t\tcss: cssConfigurator,\n\t\tdata: dataConfigurator,\n\t\ttemplate: templateConfigurator\n\t};\n\n\tvar defaultKeys = Object.keys( defaults );\n\n\tvar isStandardKey = makeObj( defaultKeys.filter( function ( key ) { return !custom[ key ]; } ) );\n\n\t// blacklisted keys that we don't double extend\n\tvar isBlacklisted = makeObj( defaultKeys.concat( registries.map( function ( r ) { return r.name; } ) ) );\n\n\tvar order = [].concat(\n\t\tdefaultKeys.filter( function ( key ) { return !registries[ key ] && !custom[ key ]; } ),\n\t\tregistries,\n\t\t//custom.data,\n\t\tcustom.template,\n\t\tcustom.css\n\t);\n\n\tvar config = {\n\t\textend: function ( Parent, proto, options ) { return configure( 'extend', Parent, proto, options ); },\n\n\t\tinit: function ( Parent, ractive, options ) { return configure( 'init', Parent, ractive, options ); },\n\n\t\treset: function ( ractive ) {\n\t\t\treturn order.filter( function ( c ) {\n\t\t\t\treturn c.reset && c.reset( ractive );\n\t\t\t}).map( function ( c ) { return c.name; } );\n\t\t},\n\n\t\t// this defines the order. TODO this isn't used anywhere in the codebase,\n\t\t// only in the test suite - should get rid of it\n\t\torder: order\n\t};\n\n\tfunction configure ( method, Parent, target, options ) {\n\t\tdeprecate( options );\n\n\t\tfor ( var key in options ) {\n\t\t\tif ( isStandardKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar value = options[ key ];\n\n\t\t\t\t// warn the developer if they passed a function and ignore its value\n\n\t\t\t\t// NOTE: we allow some functions on \"el\" because we duck type element lists\n\t\t\t\t// and some libraries or ef'ed-up virtual browsers (phantomJS) return a\n\t\t\t\t// function object as the result of querySelector methods\n\t\t\t\tif ( key !== 'el' && typeof value === 'function' ) {\n\t\t\t\t\twarnIfDebug( (\"\" + key + \" is a Ractive option that does not expect a function and will be ignored\"),\n\t\t\t\t\t\tmethod === 'init' ? target : null );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// disallow combination of `append` and `enhance`\n\t\tif ( options.append && options.enhance ) {\n\t\t\tthrow new Error( 'Cannot use append and enhance at the same time' );\n\t\t}\n\n\t\tregistries.forEach( function ( registry ) {\n\t\t\tregistry[ method ]( Parent, target, options );\n\t\t});\n\n\t\tadaptConfigurator[ method ]( Parent, target, options );\n\t\ttemplateConfigurator[ method ]( Parent, target, options );\n\t\tcssConfigurator[ method ]( Parent, target, options );\n\n\t\textendOtherMethods( Parent.prototype, target, options );\n\t}\n\n\tfunction extendOtherMethods ( parent, target, options ) {\n\t\tfor ( var key in options ) {\n\t\t\tif ( !isBlacklisted[ key ] && options.hasOwnProperty( key ) ) {\n\t\t\t\tvar member = options[ key ];\n\n\t\t\t\t// if this is a method that overwrites a method, wrap it:\n\t\t\t\tif ( typeof member === 'function' ) {\n\t\t\t\t\tmember = wrap( parent, key, member );\n\t\t\t\t}\n\n\t\t\t\ttarget[ key ] = member;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction makeObj ( array ) {\n\t\tvar obj = {};\n\t\tarray.forEach( function ( x ) { return obj[x] = true; } );\n\t\treturn obj;\n\t}\n\n\tvar shouldRerender = [ 'template', 'partials', 'components', 'decorators', 'events' ];\n\n\tvar completeHook$1 = new Hook( 'complete' );\n\tvar resetHook = new Hook( 'reset' );\n\tvar renderHook$1 = new Hook( 'render' );\n\tvar unrenderHook = new Hook( 'unrender' );\n\n\tfunction Ractive$reset ( data ) {\n\t\tdata = data || {};\n\n\t\tif ( typeof data !== 'object' ) {\n\t\t\tthrow new Error( 'The reset method takes either no arguments, or an object containing new data' );\n\t\t}\n\n\t\t// TEMP need to tidy this up\n\t\tdata = dataConfigurator.init( this.constructor, this, { data: data });\n\n\t\tvar promise = runloop.start( this, true );\n\n\t\t// If the root object is wrapped, try and use the wrapper's reset value\n\t\tvar wrapper = this.viewmodel.wrapper;\n\t\tif ( wrapper && wrapper.reset ) {\n\t\t\tif ( wrapper.reset( data ) === false ) {\n\t\t\t\t// reset was rejected, we need to replace the object\n\t\t\t\tthis.viewmodel.set( data );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.viewmodel.set( data );\n\t\t}\n\n\t\t// reset config items and track if need to rerender\n\t\tvar changes = config.reset( this );\n\t\tvar rerender;\n\n\t\tvar i = changes.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( shouldRerender.indexOf( changes[i] ) > -1 ) {\n\t\t\t\trerender = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( rerender ) {\n\t\t\tunrenderHook.fire( this );\n\t\t\tthis.fragment.resetTemplate( this.template );\n\t\t\trenderHook$1.fire( this );\n\t\t\tcompleteHook$1.fire( this );\n\t\t}\n\n\t\trunloop.end();\n\n\t\tresetHook.fire( this, data );\n\n\t\treturn promise;\n\t}\n\n\tfunction collect( source, name, attr, dest ) {\n\t\tsource.forEach( function ( item ) {\n\t\t\t// queue to rerender if the item is a partial and the current name matches\n\t\t\tif ( item.type === PARTIAL && ( item.refName ===  name || item.name === name ) ) {\n\t\t\t\titem.inAttribute = attr;\n\t\t\t\tdest.push( item );\n\t\t\t\treturn; // go no further\n\t\t\t}\n\n\t\t\t// if it has a fragment, process its items\n\t\t\tif ( item.fragment ) {\n\t\t\t\tcollect( item.fragment.iterations || item.fragment.items, name, attr, dest );\n\t\t\t}\n\n\t\t\t// or if it is itself a fragment, process its items\n\t\t\telse if ( isArray( item.items ) ) {\n\t\t\t\tcollect( item.items, name, attr, dest );\n\t\t\t}\n\n\t\t\t// or if it is a component, step in and process its items\n\t\t\telse if ( item.type === COMPONENT && item.instance ) {\n\t\t\t\t// ...unless the partial is shadowed\n\t\t\t\tif ( item.instance.partials[ name ] ) return;\n\t\t\t\tcollect( item.instance.fragment.items, name, attr, dest );\n\t\t\t}\n\n\t\t\t// if the item is an element, process its attributes too\n\t\t\tif ( item.type === ELEMENT ) {\n\t\t\t\tif ( isArray( item.attributes ) ) {\n\t\t\t\t\tcollect( item.attributes, name, true, dest );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction forceResetTemplate ( partial ) {\n\t\tpartial.forceResetTemplate();\n\t}\n\n\tfunction resetPartial ( name, partial ) {\n\t\tvar collection = [];\n\t\tcollect( this.fragment.items, name, false, collection );\n\n\t\tvar promise = runloop.start( this, true );\n\n\t\tthis.partials[ name ] = partial;\n\t\tcollection.forEach( forceResetTemplate );\n\n\t\trunloop.end();\n\n\t\treturn promise;\n\t}\n\n\tvar Item = function Item ( options ) {\n\t\tthis.parentFragment = options.parentFragment;\n\t\tthis.ractive = options.parentFragment.ractive;\n\n\t\tthis.template = options.template;\n\t\tthis.index = options.index;\n\t\tthis.type = options.template.t;\n\n\t\tthis.dirty = false;\n\t};\n\n\tItem.prototype.bubble = function bubble () {\n\t\tif ( !this.dirty ) {\n\t\t\tthis.dirty = true;\n\t\t\tthis.parentFragment.bubble();\n\t\t}\n\t};\n\n\tItem.prototype.destroyed = function destroyed () {\n\t\tif ( this.fragment ) this.fragment.destroyed();\n\t};\n\n\tItem.prototype.find = function find () {\n\t\treturn null;\n\t};\n\n\tItem.prototype.findAll = function findAll () {\n\t\t// noop\n\t};\n\n\tItem.prototype.findComponent = function findComponent () {\n\t\treturn null;\n\t};\n\n\tItem.prototype.findAllComponents = function findAllComponents () {\n\t\t// noop;\n\t};\n\n\tItem.prototype.findNextNode = function findNextNode () {\n\t\treturn this.parentFragment.findNextNode( this );\n\t};\n\n\tItem.prototype.shuffled = function shuffled () {\n\t\tif ( this.fragment ) this.fragment.shuffled();\n\t};\n\n\tItem.prototype.valueOf = function valueOf () {\n\t\treturn this.toString();\n\t};\n\n\tvar ComputationChild = (function (Model) {\n\t\tfunction ComputationChild () {\n\t\t\tModel.apply(this, arguments);\n\t\t}\n\n\t\tComputationChild.prototype = Object.create( Model && Model.prototype );\n\t\tComputationChild.prototype.constructor = ComputationChild;\n\n\t\tComputationChild.prototype.get = function get ( shouldCapture ) {\n\t\t\tif ( shouldCapture ) capture( this );\n\n\t\t\tvar parentValue = this.parent.get();\n\t\t\treturn parentValue ? parentValue[ this.key ] : undefined;\n\t\t};\n\n\t\tComputationChild.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.dirty = true;\n\n\t\t\tthis.links.forEach( marked );\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.children.forEach( handleChange );\n\t\t\tthis.clearUnresolveds(); // TODO is this necessary?\n\t\t};\n\n\t\tComputationChild.prototype.joinKey = function joinKey ( key ) {\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new ComputationChild( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\treturn ComputationChild;\n\t}(Model));\n\n\tfunction createResolver ( proxy, ref, index ) {\n\t\tvar resolver = proxy.fragment.resolve( ref, function ( model ) {\n\t\t\tremoveFromArray( proxy.resolvers, resolver );\n\t\t\tproxy.models[ index ] = model;\n\t\t\tproxy.bubble();\n\t\t});\n\n\t\tproxy.resolvers.push( resolver );\n\t}\n\n\tvar ExpressionProxy = (function (Model) {\n\t\tfunction ExpressionProxy ( fragment, template ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tModel.call( this, fragment.ractive.viewmodel, null );\n\n\t\t\tthis.fragment = fragment;\n\t\t\tthis.template = template;\n\n\t\t\tthis.isReadonly = true;\n\t\t\tthis.dirty = true;\n\n\t\t\tthis.fn = getFunction( template.s, template.r.length );\n\n\t\t\tthis.resolvers = [];\n\t\t\tthis.models = this.template.r.map( function ( ref, index ) {\n\t\t\t\tvar model = resolveReference( this$1.fragment, ref );\n\n\t\t\t\tif ( !model ) {\n\t\t\t\t\tcreateResolver( this$1, ref, index );\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\t\t\tthis.dependencies = [];\n\n\t\t\tthis.shuffle = undefined;\n\n\t\t\tthis.bubble();\n\t\t}\n\n\t\tExpressionProxy.prototype = Object.create( Model && Model.prototype );\n\t\tExpressionProxy.prototype.constructor = ExpressionProxy;\n\n\t\tExpressionProxy.prototype.bubble = function bubble ( actuallyChanged ) {\n\t\t\t// refresh the keypath\n\t\t\tif ( actuallyChanged === void 0 ) actuallyChanged = true;\n\n\t\t\tif ( this.registered ) delete this.root.expressions[ this.keypath ];\n\t\t\tthis.keypath = undefined;\n\n\t\t\tif ( actuallyChanged ) {\n\t\t\t\tthis.dirty = true;\n\t\t\t\tthis.handleChange();\n\t\t\t}\n\t\t};\n\n\t\tExpressionProxy.prototype.get = function get ( shouldCapture ) {\n\t\t\tif ( shouldCapture ) capture( this );\n\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tthis.value = this.getValue();\n\t\t\t\tif ( this.wrapper ) this.newWrapperValue = this.value;\n\t\t\t\tthis.adapt();\n\t\t\t}\n\n\t\t\treturn shouldCapture && this.wrapper ? this.wrapperValue : this.value;\n\t\t};\n\n\t\tExpressionProxy.prototype.getKeypath = function getKeypath () {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( !this.template ) return '@undefined';\n\t\t\tif ( !this.keypath ) {\n\t\t\t\tthis.keypath = '@' + this.template.s.replace( /_(\\d+)/g, function ( match, i ) {\n\t\t\t\t\tif ( i >= this$1.models.length ) return match;\n\n\t\t\t\t\tvar model = this$1.models[i];\n\t\t\t\t\treturn model ? model.getKeypath() : '@undefined';\n\t\t\t\t});\n\n\t\t\t\tthis.root.expressions[ this.keypath ] = this;\n\t\t\t\tthis.registered = true;\n\t\t\t}\n\n\t\t\treturn this.keypath;\n\t\t};\n\n\t\tExpressionProxy.prototype.getValue = function getValue () {\n\t\t\tvar this$1 = this;\n\n\t\t\tstartCapturing();\n\t\t\tvar result;\n\n\t\t\ttry {\n\t\t\t\tvar params = this.models.map( function ( m ) { return m ? m.get( true ) : undefined; } );\n\t\t\t\tresult = this.fn.apply( this.fragment.ractive, params );\n\t\t\t} catch ( err ) {\n\t\t\t\twarnIfDebug( (\"Failed to compute \" + (this.getKeypath()) + \": \" + (err.message || err)) );\n\t\t\t}\n\n\t\t\tvar dependencies = stopCapturing();\n\t\t\t// remove missing deps\n\t\t\tthis.dependencies.filter( function ( d ) { return !~dependencies.indexOf( d ); } ).forEach( function ( d ) {\n\t\t\t\td.unregister( this$1 );\n\t\t\t\tremoveFromArray( this$1.dependencies, d );\n\t\t\t});\n\t\t\t// register new deps\n\t\t\tdependencies.filter( function ( d ) { return !~this$1.dependencies.indexOf( d ); } ).forEach( function ( d ) {\n\t\t\t\td.register( this$1 );\n\t\t\t\tthis$1.dependencies.push( d );\n\t\t\t});\n\n\t\t\treturn result;\n\t\t};\n\n\t\tExpressionProxy.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.dirty = true;\n\n\t\t\tthis.links.forEach( marked );\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.children.forEach( handleChange );\n\n\t\t\tthis.clearUnresolveds();\n\t\t};\n\n\t\tExpressionProxy.prototype.joinKey = function joinKey ( key ) {\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new ComputationChild( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tExpressionProxy.prototype.mark = function mark () {\n\t\t\tthis.handleChange();\n\t\t};\n\n\t\tExpressionProxy.prototype.rebinding = function rebinding ( next, previous, safe ) {\n\t\t\tvar idx = this.models.indexOf( previous );\n\n\t\t\tif ( ~idx ) {\n\t\t\t\tnext = rebindMatch( this.template.r[idx], next, previous );\n\t\t\t\tif ( next !== previous ) {\n\t\t\t\t\tprevious.unregister( this );\n\t\t\t\t\tthis.models.splice( idx, 1, next );\n\t\t\t\t\t// TODO: set up a resolver if there is no next?\n\t\t\t\t\tif ( next ) next.addShuffleRegister( this, 'mark' );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.bubble( !safe );\n\t\t};\n\n\t\tExpressionProxy.prototype.retrieve = function retrieve () {\n\t\t\treturn this.get();\n\t\t};\n\n\t\tExpressionProxy.prototype.teardown = function teardown () {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.unbind();\n\t\t\tthis.fragment = undefined;\n\t\t\tif ( this.dependencies ) this.dependencies.forEach( function ( d ) { return d.unregister( this$1 ); } );\n\t\t\tModel.prototype.teardown.call(this);\n\t\t};\n\n\t\tExpressionProxy.prototype.unreference = function unreference () {\n\t\t\tModel.prototype.unreference.call(this);\n\t\t\tif ( !this.deps.length && !this.refs ) this.teardown();\n\t\t};\n\n\t\tExpressionProxy.prototype.unregister = function unregister( dep ) {\n\t\t\tModel.prototype.unregister.call( this, dep );\n\t\t\tif ( !this.deps.length && !this.refs ) this.teardown();\n\t\t};\n\n\t\tExpressionProxy.prototype.unbind = function unbind$1 () {\n\t\t\tthis.resolvers.forEach( unbind );\n\t\t};\n\n\t\treturn ExpressionProxy;\n\t}(Model));\n\n\tvar ReferenceExpressionChild = (function (Model) {\n\t\tfunction ReferenceExpressionChild ( parent, key ) {\n\t\t\tModel.call ( this, parent, key );\n\t\t}\n\n\t\tReferenceExpressionChild.prototype = Object.create( Model && Model.prototype );\n\t\tReferenceExpressionChild.prototype.constructor = ReferenceExpressionChild;\n\n\t\tReferenceExpressionChild.prototype.applyValue = function applyValue ( value ) {\n\t\t\tif ( isEqual( value, this.value ) ) return;\n\n\t\t\tvar parent = this.parent, keys = [ this.key ];\n\t\t\twhile ( parent ) {\n\t\t\t\tif ( parent.base ) {\n\t\t\t\t\tvar target = parent.model.joinAll( keys );\n\t\t\t\t\ttarget.applyValue( value );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tkeys.unshift( parent.key );\n\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\t\t};\n\n\t\tReferenceExpressionChild.prototype.joinKey = function joinKey ( key ) {\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new ReferenceExpressionChild( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tReferenceExpressionChild.prototype.retrieve = function retrieve () {\n\t\t\tvar parent = this.parent.get();\n\t\t\treturn parent && parent[ this.key ];\n\t\t};\n\n\t\treturn ReferenceExpressionChild;\n\t}(Model));\n\n\tvar ReferenceExpressionProxy = (function (Model) {\n\t\tfunction ReferenceExpressionProxy ( fragment, template ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tModel.call( this, null, null );\n\t\t\tthis.dirty = true;\n\t\t\tthis.root = fragment.ractive.viewmodel;\n\t\t\tthis.template = template;\n\n\t\t\tthis.resolvers = [];\n\n\t\t\tthis.base = resolve$2( fragment, template );\n\t\t\tvar baseResolver;\n\n\t\t\tif ( !this.base ) {\n\t\t\t\tbaseResolver = fragment.resolve( template.r, function ( model ) {\n\t\t\t\t\tthis$1.base = model;\n\t\t\t\t\tthis$1.bubble();\n\n\t\t\t\t\tremoveFromArray( this$1.resolvers, baseResolver );\n\t\t\t\t});\n\n\t\t\t\tthis.resolvers.push( baseResolver );\n\t\t\t}\n\n\t\t\tvar intermediary = this.intermediary = {\n\t\t\t\thandleChange: function () { return this$1.handleChange(); },\n\t\t\t\trebinding: function ( next, previous ) {\n\t\t\t\t\tif ( previous === this$1.base ) {\n\t\t\t\t\t\tnext = rebindMatch( template, next, previous );\n\t\t\t\t\t\tif ( next !== this$1.base ) {\n\t\t\t\t\t\t\tthis$1.base.unregister( intermediary );\n\t\t\t\t\t\t\tthis$1.base = next;\n\t\t\t\t\t\t\t// TODO: if there is no next, set up a resolver?\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar idx = this$1.members.indexOf( previous );\n\t\t\t\t\t\tif ( ~idx ) {\n\t\t\t\t\t\t\t// only direct references will rebind... expressions handle themselves\n\t\t\t\t\t\t\tnext = rebindMatch( template.m[idx].n, next, previous );\n\t\t\t\t\t\t\tif ( next !== this$1.members[idx] ) {\n\t\t\t\t\t\t\t\tthis$1.members.splice( idx, 1, next );\n\t\t\t\t\t\t\t\t// TODO: if there is no next, set up a resolver?\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( next !== previous ) previous.unregister( intermediary );\n\t\t\t\t\tif ( next ) next.addShuffleTask( function () { return next.register( intermediary ); } );\n\n\t\t\t\t\tthis$1.bubble();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.members = template.m.map( function ( template, i ) {\n\t\t\t\tif ( typeof template === 'string' ) {\n\t\t\t\t\treturn { get: function () { return template; } };\n\t\t\t\t}\n\n\t\t\t\tvar model;\n\t\t\t\tvar resolver;\n\n\t\t\t\tif ( template.t === REFERENCE ) {\n\t\t\t\t\tmodel = resolveReference( fragment, template.n );\n\n\t\t\t\t\tif ( model ) {\n\t\t\t\t\t\tmodel.register( intermediary );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolver = fragment.resolve( template.n, function ( model ) {\n\t\t\t\t\t\t\tthis$1.members[i] = model;\n\n\t\t\t\t\t\t\tmodel.register( intermediary );\n\t\t\t\t\t\t\tthis$1.handleChange();\n\n\t\t\t\t\t\t\tremoveFromArray( this$1.resolvers, resolver );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis$1.resolvers.push( resolver );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tmodel = new ExpressionProxy( fragment, template );\n\t\t\t\tmodel.register( intermediary );\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\tthis.isUnresolved = true;\n\t\t\tthis.bubble();\n\t\t}\n\n\t\tReferenceExpressionProxy.prototype = Object.create( Model && Model.prototype );\n\t\tReferenceExpressionProxy.prototype.constructor = ReferenceExpressionProxy;\n\n\t\tReferenceExpressionProxy.prototype.bubble = function bubble () {\n\t\t\tif ( !this.base ) return;\n\t\t\tif ( !this.dirty ) this.handleChange();\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.forceResolution = function forceResolution () {\n\t\t\tthis.resolvers.forEach( function ( resolver ) { return resolver.forceResolution(); } );\n\t\t\tthis.dirty = true;\n\t\t\tthis.bubble();\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.get = function get ( shouldCapture ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.bubble();\n\n\t\t\t\tvar i = this.members.length, resolved = true;\n\t\t\t\twhile ( resolved && i-- ) {\n\t\t\t\t\tif ( !this$1.members[i] ) resolved = false;\n\t\t\t\t}\n\n\t\t\t\tif ( this.base && resolved ) {\n\t\t\t\t\tvar keys = this.members.map( function ( m ) { return escapeKey( String( m.get() ) ); } );\n\t\t\t\t\tvar model = this.base.joinAll( keys );\n\n\t\t\t\t\tif ( model !== this.model ) {\n\t\t\t\t\t\tif ( this.model ) {\n\t\t\t\t\t\t\tthis.model.unregister( this );\n\t\t\t\t\t\t\tthis.model.unregisterTwowayBinding( this );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.model = model;\n\t\t\t\t\t\tthis.parent = model.parent;\n\t\t\t\t\t\tthis.model.register( this );\n\t\t\t\t\t\tthis.model.registerTwowayBinding( this );\n\n\t\t\t\t\t\tif ( this.keypathModel ) this.keypathModel.handleChange();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.value = this.model ? this.model.get( shouldCapture ) : undefined;\n\t\t\t\tthis.dirty = false;\n\t\t\t\tthis.mark();\n\t\t\t\treturn this.value;\n\t\t\t} else {\n\t\t\t\treturn this.model ? this.model.get( shouldCapture ) : undefined;\n\t\t\t}\n\t\t};\n\n\t\t// indirect two-way bindings\n\t\tReferenceExpressionProxy.prototype.getValue = function getValue () {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.value = this.model ? this.model.get() : undefined;\n\n\t\t\tvar i = this.bindings.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar value = this$1.bindings[i].getValue();\n\t\t\t\tif ( value !== this$1.value ) return value;\n\t\t\t}\n\n\t\t\t// check one-way bindings\n\t\t\tvar oneway = findBoundValue( this.deps );\n\t\t\tif ( oneway ) return oneway.value;\n\n\t\t\treturn this.value;\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.getKeypath = function getKeypath () {\n\t\t\treturn this.model ? this.model.getKeypath() : '@undefined';\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.dirty = true;\n\t\t\tthis.mark();\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.joinKey = function joinKey ( key ) {\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new ReferenceExpressionChild( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.mark = function mark$1 () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.deps.forEach( handleChange );\n\t\t\t}\n\n\t\t\tthis.links.forEach( marked );\n\t\t\tthis.children.forEach( mark );\n\t\t\tthis.clearUnresolveds();\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.retrieve = function retrieve () {\n\t\t\treturn this.value;\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.rebinding = function rebinding () { }; // NOOP\n\n\t\tReferenceExpressionProxy.prototype.set = function set ( value ) {\n\t\t\tif ( !this.model ) throw new Error( 'Unresolved reference expression. This should not happen!' );\n\t\t\tthis.model.set( value );\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.teardown = function teardown () {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.resolvers.forEach( unbind );\n\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.unregister( this );\n\t\t\t\tthis.model.unregisterTwowayBinding( this );\n\t\t\t}\n\t\t\tif ( this.members ) {\n\t\t\t\tthis.members.forEach( function ( m ) { return m && m.unregister && m.unregister( this$1 ); } );\n\t\t\t}\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.unreference = function unreference () {\n\t\t\tModel.prototype.unreference.call(this);\n\t\t\tif ( !this.deps.length && !this.refs ) this.teardown();\n\t\t};\n\n\t\tReferenceExpressionProxy.prototype.unregister = function unregister( dep ) {\n\t\t\tModel.prototype.unregister.call( this, dep );\n\t\t\tif ( !this.deps.length && !this.refs ) this.teardown();\n\t\t};\n\n\t\treturn ReferenceExpressionProxy;\n\t}(Model));\n\n\tfunction resolve$2 ( fragment, template ) {\n\t\tif ( template.r ) {\n\t\t\treturn resolveReference( fragment, template.r );\n\t\t}\n\n\t\telse if ( template.x ) {\n\t\t\treturn new ExpressionProxy( fragment, template.x );\n\t\t}\n\n\t\telse if ( template.rx ) {\n\t\t\treturn new ReferenceExpressionProxy( fragment, template.rx );\n\t\t}\n\t}\n\n\tfunction resolveAliases( section ) {\n\t\tif ( section.template.z ) {\n\t\t\tsection.aliases = {};\n\n\t\t\tvar refs = section.template.z;\n\t\t\tfor ( var i = 0; i < refs.length; i++ ) {\n\t\t\t\tsection.aliases[ refs[i].n ] = resolve$2( section.parentFragment, refs[i].x );\n\t\t\t}\n\t\t}\n\n\t\tfor ( var k in section.aliases ) {\n\t\t\tsection.aliases[k].reference();\n\t\t}\n\t}\n\n\tvar Alias = (function (Item) {\n\t\tfunction Alias ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.fragment = null;\n\t\t}\n\n\t\tAlias.prototype = Object.create( Item && Item.prototype );\n\t\tAlias.prototype.constructor = Alias;\n\n\t\tAlias.prototype.bind = function bind () {\n\t\t\tresolveAliases( this );\n\n\t\t\tthis.fragment = new Fragment({\n\t\t\t\towner: this,\n\t\t\t\ttemplate: this.template.f\n\t\t\t}).bind();\n\t\t};\n\n\t\tAlias.prototype.detach = function detach () {\n\t\t\treturn this.fragment ? this.fragment.detach() : createDocumentFragment();\n\t\t};\n\n\t\tAlias.prototype.find = function find ( selector ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.find( selector );\n\t\t\t}\n\t\t};\n\n\t\tAlias.prototype.findAll = function findAll ( selector, query ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAll( selector, query );\n\t\t\t}\n\t\t};\n\n\t\tAlias.prototype.findComponent = function findComponent ( name ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.findComponent( name );\n\t\t\t}\n\t\t};\n\n\t\tAlias.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAllComponents( name, query );\n\t\t\t}\n\t\t};\n\n\t\tAlias.prototype.firstNode = function firstNode ( skipParent ) {\n\t\t\treturn this.fragment && this.fragment.firstNode( skipParent );\n\t\t};\n\n\t\tAlias.prototype.rebinding = function rebinding () {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( this.locked ) return;\n\t\t\tthis.locked = true;\n\t\t\trunloop.scheduleTask( function () {\n\t\t\t\tthis$1.locked = false;\n\t\t\t\tresolveAliases( this$1 );\n\t\t\t});\n\t\t};\n\n\t\tAlias.prototype.render = function render ( target ) {\n\t\t\tthis.rendered = true;\n\t\t\tif ( this.fragment ) this.fragment.render( target );\n\t\t};\n\n\t\tAlias.prototype.toString = function toString ( escape ) {\n\t\t\treturn this.fragment ? this.fragment.toString( escape ) : '';\n\t\t};\n\n\t\tAlias.prototype.unbind = function unbind () {\n\t\t\tthis.aliases = {};\n\n\t\t\tfor ( var k in this.fragment.aliases ) {\n\t\t\t\tthis.aliases[k].unreference();\n\t\t\t}\n\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\t\t};\n\n\t\tAlias.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tif ( this.rendered && this.fragment ) this.fragment.unrender( shouldDestroy );\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tAlias.prototype.update = function update () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tthis.fragment.update();\n\t\t\t}\n\t\t};\n\n\t\treturn Alias;\n\t}(Item));\n\n\tfunction findElement( start, orComponent, name ) {\n\t\tif ( orComponent === void 0 ) orComponent = true;\n\n\t\twhile ( start && ( start.type !== ELEMENT || ( name && start.name !== name ) ) && ( !orComponent || start.type !== COMPONENT ) ) {\n\t\t\t// start is a fragment - look at the owner\n\t\t\tif ( start.owner ) start = start.owner;\n\t\t\t// start is a component or yielder - look at the container\n\t\t\telse if ( start.component ) start = start.containerFragment || start.component.parentFragment;\n\t\t\t// start is an item - look at the parent\n\t\t\telse if ( start.parent ) start = start.parent;\n\t\t\t// start is an item without a parent - look at the parent fragment\n\t\t\telse if ( start.parentFragment ) start = start.parentFragment;\n\n\t\t\telse start = undefined;\n\t\t}\n\n\t\treturn start;\n\t}\n\n\tvar space = /\\s+/;\n\tvar remove$1 = /\\/\\*(?:[\\s\\S]*?)\\*\\//g;\n\tvar escape$1 = /url\\(\\s*(['\"])(?:\\\\[\\s\\S]|(?!\\1).)*\\1\\s*\\)|url\\((?:\\\\[\\s\\S]|[^)])*\\)|(['\"])(?:\\\\[\\s\\S]|(?!\\1).)*\\2/gi;\n\tvar value$1 = /\\0(\\d+)/g;\n\n\tfunction readStyle ( css ) {\n\t\tvar values = [];\n\n\t\tif ( typeof css !== 'string' ) return {};\n\n\t\treturn css.replace( escape$1, function ( match ) { return (\"\\u0000\" + (values.push( match ) - 1)); })\n\t\t\t.replace( remove$1, '' )\n\t\t\t.split( ';' )\n\t\t\t.filter( function ( rule ) { return !!rule.trim(); } )\n\t\t\t.map( function ( rule ) { return rule.replace( value$1, function ( match, n ) { return values[ n ]; } ); } )\n\t\t\t.reduce(function ( rules, rule ) {\n\t\t\t\tvar i = rule.indexOf(':');\n\t\t\t\tvar name = rule.substr( 0, i ).trim();\n\t\t\t\trules[ name ] = rule.substr( i + 1 ).trim();\n\t\t\t\treturn rules;\n\t\t\t}, {});\n\t}\n\n\tfunction readClass ( str ) {\n\t\tvar list = str.split( space );\n\n\t\t// remove any empty entries\n\t\tvar i = list.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( !list[i] ) list.splice( i, 1 );\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tvar textTypes = [ undefined, 'text', 'search', 'url', 'email', 'hidden', 'password', 'search', 'reset', 'submit' ];\n\n\tfunction getUpdateDelegate ( attribute ) {\n\t\tvar element = attribute.element, name = attribute.name;\n\n\t\tif ( name === 'id' ) return updateId;\n\n\t\tif ( name === 'value' ) {\n\t\t\tif ( attribute.interpolator ) attribute.interpolator.bound = true;\n\n\t\t\t// special case - selects\n\t\t\tif ( element.name === 'select' && name === 'value' ) {\n\t\t\t\treturn element.getAttribute( 'multiple' ) ? updateMultipleSelectValue : updateSelectValue;\n\t\t\t}\n\n\t\t\tif ( element.name === 'textarea' ) return updateStringValue;\n\n\t\t\t// special case - contenteditable\n\t\t\tif ( element.getAttribute( 'contenteditable' ) != null ) return updateContentEditableValue;\n\n\t\t\t// special case - <input>\n\t\t\tif ( element.name === 'input' ) {\n\t\t\t\tvar type = element.getAttribute( 'type' );\n\n\t\t\t\t// type='file' value='{{fileList}}'>\n\t\t\t\tif ( type === 'file' ) return noop; // read-only\n\n\t\t\t\t// type='radio' name='{{twoway}}'\n\t\t\t\tif ( type === 'radio' && element.binding && element.binding.attribute.name === 'name' ) return updateRadioValue;\n\n\t\t\t\tif ( ~textTypes.indexOf( type ) ) return updateStringValue;\n\t\t\t}\n\n\t\t\treturn updateValue;\n\t\t}\n\n\t\tvar node = element.node;\n\n\t\t// special case - <input type='radio' name='{{twoway}}' value='foo'>\n\t\tif ( attribute.isTwoway && name === 'name' ) {\n\t\t\tif ( node.type === 'radio' ) return updateRadioName;\n\t\t\tif ( node.type === 'checkbox' ) return updateCheckboxName;\n\t\t}\n\n\t\tif ( name === 'style' ) return updateStyleAttribute;\n\n\t\tif ( name.indexOf( 'style-' ) === 0 ) return updateInlineStyle;\n\n\t\t// special case - class names. IE fucks things up, again\n\t\tif ( name === 'class' && ( !node.namespaceURI || node.namespaceURI === html ) ) return updateClassName;\n\n\t\tif ( name.indexOf( 'class-' ) === 0 ) return updateInlineClass;\n\n\t\tif ( attribute.isBoolean ) {\n\t\t\tvar type$1 = element.getAttribute( 'type' );\n\t\t\tif ( attribute.interpolator && name === 'checked' && ( type$1 === 'checkbox' || type$1 === 'radio' ) ) attribute.interpolator.bound = true;\n\t\t\treturn updateBoolean;\n\t\t}\n\n\t\tif ( attribute.namespace && attribute.namespace !== attribute.node.namespaceURI ) return updateNamespacedAttribute;\n\n\t\treturn updateAttribute;\n\t}\n\n\tfunction updateId ( reset ) {\n\t\tvar ref = this, node = ref.node;\n\t\tvar value = this.getValue();\n\n\t\t// remove the mapping to this node if it hasn't already been replaced\n\t\tif ( this.ractive.nodes[ node.id ] === node ) delete this.ractive.nodes[ node.id ];\n\t\tif ( reset ) return node.removeAttribute( 'id' );\n\n\t\tthis.ractive.nodes[ value ] = node;\n\n\t\tnode.id = value;\n\t}\n\n\tfunction updateMultipleSelectValue ( reset ) {\n\t\tvar value = this.getValue();\n\n\t\tif ( !isArray( value ) ) value = [ value ];\n\n\t\tvar options = this.node.options;\n\t\tvar i = options.length;\n\n\t\tif ( reset ) {\n\t\t\twhile ( i-- ) options[i].selected = false;\n\t\t} else {\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar option = options[i];\n\t\t\t\tvar optionValue = option._ractive ?\n\t\t\t\t\toption._ractive.value :\n\t\t\t\t\toption.value; // options inserted via a triple don't have _ractive\n\n\t\t\t\toption.selected = arrayContains( value, optionValue );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateSelectValue ( reset ) {\n\t\tvar value = this.getValue();\n\n\t\tif ( !this.locked ) { // TODO is locked still a thing?\n\t\t\tthis.node._ractive.value = value;\n\n\t\t\tvar options = this.node.options;\n\t\t\tvar i = options.length;\n\t\t\tvar wasSelected = false;\n\n\t\t\tif ( reset ) {\n\t\t\t\twhile ( i-- ) options[i].selected = false;\n\t\t\t} else {\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tvar option = options[i];\n\t\t\t\t\tvar optionValue = option._ractive ?\n\t\t\t\t\t\toption._ractive.value :\n\t\t\t\t\t\toption.value; // options inserted via a triple don't have _ractive\n\t\t\t\t\tif ( option.disabled && option.selected ) wasSelected = true;\n\n\t\t\t\t\tif ( optionValue == value ) { // double equals as we may be comparing numbers with strings\n\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !wasSelected ) this.node.selectedIndex = -1;\n\t\t}\n\t}\n\n\n\tfunction updateContentEditableValue ( reset ) {\n\t\tvar value = this.getValue();\n\n\t\tif ( !this.locked ) {\n\t\t\tif ( reset ) this.node.innerHTML = '';\n\t\t\telse this.node.innerHTML = value === undefined ? '' : value;\n\t\t}\n\t}\n\n\tfunction updateRadioValue ( reset ) {\n\t\tvar node = this.node;\n\t\tvar wasChecked = node.checked;\n\n\t\tvar value = this.getValue();\n\n\t\tif ( reset ) return node.checked = false;\n\n\t\t//node.value = this.element.getAttribute( 'value' );\n\t\tnode.value = this.node._ractive.value = value;\n\t\tnode.checked = value === this.element.getAttribute( 'name' );\n\n\t\t// This is a special case - if the input was checked, and the value\n\t\t// changed so that it's no longer checked, the twoway binding is\n\t\t// most likely out of date. To fix it we have to jump through some\n\t\t// hoops... this is a little kludgy but it works\n\t\tif ( wasChecked && !node.checked && this.element.binding && this.element.binding.rendered ) {\n\t\t\tthis.element.binding.group.model.set( this.element.binding.group.getValue() );\n\t\t}\n\t}\n\n\tfunction updateValue ( reset ) {\n\t\tif ( !this.locked ) {\n\t\t\tif ( reset ) {\n\t\t\t\tthis.node.removeAttribute( 'value' );\n\t\t\t\tthis.node.value = this.node._ractive.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar value = this.getValue();\n\n\t\t\tthis.node.value = this.node._ractive.value = value;\n\t\t\tthis.node.setAttribute( 'value', safeToStringValue( value ) );\n\t\t}\n\t}\n\n\tfunction updateStringValue ( reset ) {\n\t\tif ( !this.locked ) {\n\t\t\tif ( reset ) {\n\t\t\t\tthis.node._ractive.value = '';\n\t\t\t\tthis.node.removeAttribute( 'value' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar value = this.getValue();\n\n\t\t\tthis.node._ractive.value = value;\n\n\t\t\tthis.node.value = safeToStringValue( value );\n\t\t\tthis.node.setAttribute( 'value', safeToStringValue( value ) );\n\t\t}\n\t}\n\n\tfunction updateRadioName ( reset ) {\n\t\tif ( reset ) this.node.checked = false;\n\t\telse this.node.checked = ( this.getValue() == this.node._ractive.value );\n\t}\n\n\tfunction updateCheckboxName ( reset ) {\n\t\tvar ref = this, element = ref.element, node = ref.node;\n\t\tvar binding = element.binding;\n\n\t\tvar value = this.getValue();\n\t\tvar valueAttribute = element.getAttribute( 'value' );\n\n\t\tif ( reset ) {\n\t\t\t// TODO: WAT?\n\t\t}\n\n\t\tif ( !isArray( value ) ) {\n\t\t\tbinding.isChecked = node.checked = ( value == valueAttribute );\n\t\t} else {\n\t\t\tvar i = value.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( valueAttribute == value[i] ) {\n\t\t\t\t\tbinding.isChecked = node.checked = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbinding.isChecked = node.checked = false;\n\t\t}\n\t}\n\n\tfunction updateStyleAttribute ( reset ) {\n\t\tvar props = reset ? {} : readStyle( this.getValue() || '' );\n\t\tvar style = this.node.style;\n\t\tvar keys = Object.keys( props );\n\t\tvar prev = this.previous || [];\n\n\t\tvar i = 0;\n\t\twhile ( i < keys.length ) {\n\t\t\tif ( keys[i] in style ) {\n\t\t\t\tvar safe = props[ keys[i] ].replace( '!important', '' );\n\t\t\t\tstyle.setProperty( keys[i], safe, safe.length !== props[ keys[i] ].length ? 'important' : '' );\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\t// remove now-missing attrs\n\t\ti = prev.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( !~keys.indexOf( prev[i] ) && prev[i] in style ) style.setProperty( prev[i], '', '' );\n\t\t}\n\n\t\tthis.previous = keys;\n\t}\n\n\tfunction updateInlineStyle ( reset ) {\n\t\tif ( !this.style ) {\n\t\t\tthis.style = decamelize( this.name.substr( 6 ) );\n\t\t}\n\n\t\tvar value = reset ? '' : safeToStringValue( this.getValue() );\n\t\tvar safe = value.replace( '!important', '' );\n\t\tthis.node.style.setProperty( this.style, safe, safe.length !== value.length ? 'important' : '' );\n\t}\n\n\tfunction updateClassName ( reset ) {\n\t\tvar value = reset ? [] : readClass( safeToStringValue( this.getValue() ) );\n\n\t\t// watch for weirdo svg elements\n\t\tvar cls = this.node.className;\n\t\tcls = cls.baseVal !== undefined ? cls.baseVal : cls;\n\n\t\tvar attr = readClass( cls );\n\t\tvar prev = this.previous || attr.slice( 0 );\n\n\t\tvar className = value.concat( attr.filter( function ( c ) { return !~prev.indexOf( c ); } ) ).join( ' ' );\n\n\t\tif ( className !== cls ) {\n\t\t\tif ( typeof this.node.className !== 'string' ) {\n\t\t\t\tthis.node.className.baseVal = className;\n\t\t\t} else {\n\t\t\t\tthis.node.className = className;\n\t\t\t}\n\t\t}\n\n\t\tthis.previous = value;\n\t}\n\n\tfunction updateInlineClass ( reset ) {\n\t\tvar name = this.name.substr( 6 );\n\n\t\t// watch for weirdo svg elements\n\t\tvar cls = this.node.className;\n\t\tcls = cls.baseVal !== undefined ? cls.baseVal : cls;\n\n\t\tvar attr = readClass( cls );\n\t\tvar value = reset ? false : this.getValue();\n\n\t\tif ( !this.inlineClass ) this.inlineClass = name;\n\n\t\tif ( value && !~attr.indexOf( name ) ) attr.push( name );\n\t\telse if ( !value && ~attr.indexOf( name ) ) attr.splice( attr.indexOf( name ), 1 );\n\n\t\tif ( typeof this.node.className !== 'string' ) {\n\t\t\tthis.node.className.baseVal = attr.join( ' ' );\n\t\t} else {\n\t\t\tthis.node.className = attr.join( ' ' );\n\t\t}\n\t}\n\n\tfunction updateBoolean ( reset ) {\n\t\t// with two-way binding, only update if the change wasn't initiated by the user\n\t\t// otherwise the cursor will often be sent to the wrong place\n\t\tif ( !this.locked ) {\n\t\t\tif ( reset ) {\n\t\t\t\tif ( this.useProperty ) this.node[ this.propertyName ] = false;\n\t\t\t\tthis.node.removeAttribute( this.propertyName );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.useProperty ) {\n\t\t\t\tthis.node[ this.propertyName ] = this.getValue();\n\t\t\t} else {\n\t\t\t\tif ( this.getValue() ) {\n\t\t\t\t\tthis.node.setAttribute( this.propertyName, '' );\n\t\t\t\t} else {\n\t\t\t\t\tthis.node.removeAttribute( this.propertyName );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateAttribute ( reset ) {\n\t\tif ( reset ) this.node.removeAttribute( this.name );\n\t\telse this.node.setAttribute( this.name, safeToStringValue( this.getString() ) );\n\t}\n\n\tfunction updateNamespacedAttribute ( reset ) {\n\t\tif ( reset ) this.node.removeAttributeNS( this.namespace, this.name.slice( this.name.indexOf( ':' ) + 1 ) );\n\t\telse this.node.setAttributeNS( this.namespace, this.name.slice( this.name.indexOf( ':' ) + 1 ), safeToStringValue( this.getString() ) );\n\t}\n\n\tvar propertyNames = {\n\t\t'accept-charset': 'acceptCharset',\n\t\taccesskey: 'accessKey',\n\t\tbgcolor: 'bgColor',\n\t\t'class': 'className',\n\t\tcodebase: 'codeBase',\n\t\tcolspan: 'colSpan',\n\t\tcontenteditable: 'contentEditable',\n\t\tdatetime: 'dateTime',\n\t\tdirname: 'dirName',\n\t\t'for': 'htmlFor',\n\t\t'http-equiv': 'httpEquiv',\n\t\tismap: 'isMap',\n\t\tmaxlength: 'maxLength',\n\t\tnovalidate: 'noValidate',\n\t\tpubdate: 'pubDate',\n\t\treadonly: 'readOnly',\n\t\trowspan: 'rowSpan',\n\t\ttabindex: 'tabIndex',\n\t\tusemap: 'useMap'\n\t};\n\n\tfunction lookupNamespace ( node, prefix ) {\n\t\tvar qualified = \"xmlns:\" + prefix;\n\n\t\twhile ( node ) {\n\t\t\tif ( node.hasAttribute && node.hasAttribute( qualified ) ) return node.getAttribute( qualified );\n\t\t\tnode = node.parentNode;\n\t\t}\n\n\t\treturn namespaces[ prefix ];\n\t}\n\n\tvar attribute = false;\n\tfunction inAttribute () { return attribute; }\n\n\tvar Attribute = (function (Item) {\n\t\tfunction Attribute ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.name = options.template.n;\n\t\t\tthis.namespace = null;\n\n\t\t\tthis.owner = options.owner || options.parentFragment.owner || options.element || findElement( options.parentFragment );\n\t\t\tthis.element = options.element || (this.owner.attributeByName ? this.owner : findElement( options.parentFragment ) );\n\t\t\tthis.parentFragment = options.parentFragment; // shared\n\t\t\tthis.ractive = this.parentFragment.ractive;\n\n\t\t\tthis.rendered = false;\n\t\t\tthis.updateDelegate = null;\n\t\t\tthis.fragment = null;\n\n\t\t\tthis.element.attributeByName[ this.name ] = this;\n\n\t\t\tif ( !isArray( options.template.f ) ) {\n\t\t\t\tthis.value = options.template.f;\n\t\t\t\tif ( this.value === 0 ) {\n\t\t\t\t\tthis.value = '';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.fragment = new Fragment({\n\t\t\t\t\towner: this,\n\t\t\t\t\ttemplate: options.template.f\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.interpolator = this.fragment &&\n\t\t\t\tthis.fragment.items.length === 1 &&\n\t\t\t\tthis.fragment.items[0].type === INTERPOLATOR &&\n\t\t\t\tthis.fragment.items[0];\n\n\t\t\tif ( this.interpolator ) this.interpolator.owner = this;\n\t\t}\n\n\t\tAttribute.prototype = Object.create( Item && Item.prototype );\n\t\tAttribute.prototype.constructor = Attribute;\n\n\t\tAttribute.prototype.bind = function bind () {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.bind();\n\t\t\t}\n\t\t};\n\n\t\tAttribute.prototype.bubble = function bubble () {\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.parentFragment.bubble();\n\t\t\t\tthis.element.bubble();\n\t\t\t\tthis.dirty = true;\n\t\t\t}\n\t\t};\n\n\t\tAttribute.prototype.destroyed = function destroyed () {\n\t\t\tthis.updateDelegate( true );\n\t\t};\n\n\t\tAttribute.prototype.getString = function getString () {\n\t\t\tattribute = true;\n\t\t\tvar value = this.fragment ?\n\t\t\t\tthis.fragment.toString() :\n\t\t\t\tthis.value != null ? '' + this.value : '';\n\t\t\tattribute = false;\n\t\t\treturn value;\n\t\t};\n\n\t\t// TODO could getValue ever be called for a static attribute,\n\t\t// or can we assume that this.fragment exists?\n\t\tAttribute.prototype.getValue = function getValue () {\n\t\t\tattribute = true;\n\t\t\tvar value = this.fragment ? this.fragment.valueOf() : booleanAttributes.test( this.name ) ? true : this.value;\n\t\t\tattribute = false;\n\t\t\treturn value;\n\t\t};\n\n\t\tAttribute.prototype.render = function render () {\n\t\t\tvar node = this.element.node;\n\t\t\tthis.node = node;\n\n\t\t\t// should we use direct property access, or setAttribute?\n\t\t\tif ( !node.namespaceURI || node.namespaceURI === namespaces.html ) {\n\t\t\t\tthis.propertyName = propertyNames[ this.name ] || this.name;\n\n\t\t\t\tif ( node[ this.propertyName ] !== undefined ) {\n\t\t\t\t\tthis.useProperty = true;\n\t\t\t\t}\n\n\t\t\t\t// is attribute a boolean attribute or 'value'? If so we're better off doing e.g.\n\t\t\t\t// node.selected = true rather than node.setAttribute( 'selected', '' )\n\t\t\t\tif ( booleanAttributes.test( this.name ) || this.isTwoway ) {\n\t\t\t\t\tthis.isBoolean = true;\n\t\t\t\t}\n\n\t\t\t\tif ( this.propertyName === 'value' ) {\n\t\t\t\t\tnode._ractive.value = this.value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( node.namespaceURI ) {\n\t\t\t\tvar index = this.name.indexOf( ':' );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\tthis.namespace = lookupNamespace( node, this.name.slice( 0, index ) );\n\t\t\t\t} else {\n\t\t\t\t\tthis.namespace = node.namespaceURI;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.rendered = true;\n\t\t\tthis.updateDelegate = getUpdateDelegate( this );\n\t\t\tthis.updateDelegate();\n\t\t};\n\n\t\tAttribute.prototype.toString = function toString () {\n\t\t\tattribute = true;\n\n\t\t\tvar value = this.getValue();\n\n\t\t\t// Special case - select and textarea values (should not be stringified)\n\t\t\tif ( this.name === 'value' && ( this.element.getAttribute( 'contenteditable' ) !== undefined || ( this.element.name === 'select' || this.element.name === 'textarea' ) ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Special case – bound radio `name` attributes\n\t\t\tif ( this.name === 'name' && this.element.name === 'input' && this.interpolator && this.element.getAttribute( 'type' ) === 'radio' ) {\n\t\t\t\treturn (\"name=\\\"{{\" + (this.interpolator.model.getKeypath()) + \"}}\\\"\");\n\t\t\t}\n\n\t\t\t// Special case - style and class attributes and directives\n\t\t\tif ( this.owner === this.element && ( this.name === 'style' || this.name === 'class' || this.style || this.inlineClass ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !this.rendered && this.owner === this.element && ( !this.name.indexOf( 'style-' ) || !this.name.indexOf( 'class-' ) ) ) {\n\t\t\t\tif ( !this.name.indexOf( 'style-' ) ) {\n\t\t\t\t\tthis.style = decamelize( this.name.substr( 6 ) );\n\t\t\t\t} else {\n\t\t\t\t\tthis.inlineClass = this.name.substr( 6 );\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( booleanAttributes.test( this.name ) ) return value ? this.name : '';\n\t\t\tif ( value == null ) return '';\n\n\t\t\tvar str = safeAttributeString( this.getString() );\n\t\t\tattribute = false;\n\n\t\t\treturn str ?\n\t\t\t\t(\"\" + (this.name) + \"=\\\"\" + str + \"\\\"\") :\n\t\t\t\tthis.name;\n\t\t};\n\n\t\tAttribute.prototype.unbind = function unbind () {\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\t\t};\n\n\t\tAttribute.prototype.unrender = function unrender () {\n\t\t\tthis.updateDelegate( true );\n\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tAttribute.prototype.update = function update () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tif ( this.fragment ) this.fragment.update();\n\t\t\t\tif ( this.rendered ) this.updateDelegate();\n\t\t\t\tif ( this.isTwoway && !this.locked ) {\n\t\t\t\t\tthis.interpolator.twowayBinding.lastVal( true, this.interpolator.model.get() );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn Attribute;\n\t}(Item));\n\n\tvar BindingFlag = (function (Item) {\n\t\tfunction BindingFlag ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.owner = options.owner || options.parentFragment.owner || findElement( options.parentFragment );\n\t\t\tthis.element = this.owner.attributeByName ? this.owner : findElement( options.parentFragment );\n\t\t\tthis.flag = options.template.v === 'l' ? 'lazy' : 'twoway';\n\n\t\t\tif ( this.element.type === ELEMENT ) {\n\t\t\t\tif ( isArray( options.template.f ) ) {\n\t\t\t\t\tthis.fragment = new Fragment({\n\t\t\t\t\t\towner: this,\n\t\t\t\t\t\ttemplate: options.template.f\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.interpolator = this.fragment &&\n\t\t\t\t\t\t\t\t\tthis.fragment.items.length === 1 &&\n\t\t\t\t\t\t\t\t\tthis.fragment.items[0].type === INTERPOLATOR &&\n\t\t\t\t\t\t\t\t\tthis.fragment.items[0];\n\t\t\t}\n\t\t}\n\n\t\tBindingFlag.prototype = Object.create( Item && Item.prototype );\n\t\tBindingFlag.prototype.constructor = BindingFlag;\n\n\t\tBindingFlag.prototype.bind = function bind () {\n\t\t\tif ( this.fragment ) this.fragment.bind();\n\t\t\tset$2( this, this.getValue(), true );\n\t\t};\n\n\t\tBindingFlag.prototype.bubble = function bubble () {\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.element.bubble();\n\t\t\t\tthis.dirty = true;\n\t\t\t}\n\t\t};\n\n\t\tBindingFlag.prototype.getValue = function getValue () {\n\t\t\tif ( this.fragment ) return this.fragment.valueOf();\n\t\t\telse if ( 'value' in this ) return this.value;\n\t\t\telse if ( 'f' in this.template ) return this.template.f;\n\t\t\telse return true;\n\t\t};\n\n\t\tBindingFlag.prototype.render = function render () {\n\t\t\tset$2( this, this.getValue(), true );\n\t\t};\n\n\t\tBindingFlag.prototype.toString = function toString () { return ''; };\n\n\t\tBindingFlag.prototype.unbind = function unbind () {\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\n\t\t\tdelete this.element[ this.flag ];\n\t\t};\n\n\t\tBindingFlag.prototype.unrender = function unrender () {\n\t\t\tif ( this.element.rendered ) this.element.recreateTwowayBinding();\n\t\t};\n\n\t\tBindingFlag.prototype.update = function update () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tif ( this.fragment ) this.fragment.update();\n\t\t\t\tset$2( this, this.getValue(), true );\n\t\t\t}\n\t\t};\n\n\t\treturn BindingFlag;\n\t}(Item));\n\n\tfunction set$2 ( flag, value, update ) {\n\t\tif ( value === 0 ) {\n\t\t\tflag.value = true;\n\t\t} else if ( value === 'true' ) {\n\t\t\tflag.value = true;\n\t\t} else if ( value === 'false' || value === '0' ) {\n\t\t\tflag.value = false;\n\t\t} else {\n\t\t\tflag.value = value;\n\t\t}\n\n\t\tvar current = flag.element[ flag.flag ];\n\t\tflag.element[ flag.flag ] = flag.value;\n\t\tif ( update && !flag.element.attributes.binding && current !== flag.value ) {\n\t\t\tflag.element.recreateTwowayBinding();\n\t\t}\n\n\t\treturn flag.value;\n\t}\n\n\tvar div$1 = doc ? createElement( 'div' ) : null;\n\n\tvar attributes = false;\n\tfunction inAttributes() { return attributes; }\n\tfunction doInAttributes( fn ) {\n\t\tattributes = true;\n\t\tfn();\n\t\tattributes = false;\n\t}\n\n\tvar ConditionalAttribute = (function (Item) {\n\t\tfunction ConditionalAttribute ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.attributes = [];\n\n\t\t\tthis.owner = options.owner;\n\n\t\t\tthis.fragment = new Fragment({\n\t\t\t\tractive: this.ractive,\n\t\t\t\towner: this,\n\t\t\t\ttemplate: this.template\n\t\t\t});\n\t\t\t// this fragment can't participate in node-y things\n\t\t\tthis.fragment.findNextNode = noop;\n\n\t\t\tthis.dirty = false;\n\t\t}\n\n\t\tConditionalAttribute.prototype = Object.create( Item && Item.prototype );\n\t\tConditionalAttribute.prototype.constructor = ConditionalAttribute;\n\n\t\tConditionalAttribute.prototype.bind = function bind () {\n\t\t\tthis.fragment.bind();\n\t\t};\n\n\t\tConditionalAttribute.prototype.bubble = function bubble () {\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.dirty = true;\n\t\t\t\tthis.owner.bubble();\n\t\t\t}\n\t\t};\n\n\t\tConditionalAttribute.prototype.render = function render () {\n\t\t\tthis.node = this.owner.node;\n\t\t\tif ( this.node ) {\n\t\t\t\tthis.isSvg = this.node.namespaceURI === svg$1;\n\t\t\t}\n\n\t\t\tattributes = true;\n\t\t\tif ( !this.rendered ) this.fragment.render();\n\t\t\tattributes = false;\n\n\t\t\tthis.rendered = true;\n\t\t\tthis.dirty = true; // TODO this seems hacky, but necessary for tests to pass in browser AND node.js\n\t\t\tthis.update();\n\t\t};\n\n\t\tConditionalAttribute.prototype.toString = function toString () {\n\t\t\treturn this.fragment.toString();\n\t\t};\n\n\t\tConditionalAttribute.prototype.unbind = function unbind () {\n\t\t\tthis.fragment.unbind();\n\t\t};\n\n\t\tConditionalAttribute.prototype.unrender = function unrender () {\n\t\t\tthis.rendered = false;\n\t\t\tthis.fragment.unrender();\n\t\t};\n\n\t\tConditionalAttribute.prototype.update = function update () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar str;\n\t\t\tvar attrs;\n\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\n\t\t\t\tattributes = true;\n\t\t\t\tthis.fragment.update();\n\t\t\t\tattributes = false;\n\n\t\t\t\tif ( this.rendered && this.node ) {\n\t\t\t\t\tstr = this.fragment.toString();\n\t\t\t\t\tattrs = parseAttributes( str, this.isSvg );\n\n\t\t\t\t\t// any attributes that previously existed but no longer do\n\t\t\t\t\t// must be removed\n\t\t\t\t\tthis.attributes.filter( function ( a ) { return notIn( attrs, a ); } ).forEach( function ( a ) {\n\t\t\t\t\t\tthis$1.node.removeAttribute( a.name );\n\t\t\t\t\t});\n\n\t\t\t\t\tattrs.forEach( function ( a ) {\n\t\t\t\t\t\tthis$1.node.setAttribute( a.name, a.value );\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.attributes = attrs;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn ConditionalAttribute;\n\t}(Item));\n\n\tfunction parseAttributes ( str, isSvg ) {\n\t\tvar tagName = isSvg ? 'svg' : 'div';\n\t\treturn str\n\t\t\t? (div$1.innerHTML = \"<\" + tagName + \" \" + str + \"></\" + tagName + \">\") &&\n\t\t\t\ttoArray(div$1.childNodes[0].attributes)\n\t\t\t: [];\n\t}\n\n\tfunction notIn ( haystack, needle ) {\n\t\tvar i = haystack.length;\n\n\t\twhile ( i-- ) {\n\t\t\tif ( haystack[i].name === needle.name ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction processWrapper ( wrapper, array, methodName, newIndices ) {\n\t\tvar __model = wrapper.__model;\n\n\t\tif ( newIndices ) {\n\t\t\t__model.shuffle( newIndices );\n\t\t} else {\n\t\t\t// If this is a sort or reverse, we just do root.set()...\n\t\t\t// TODO use merge logic?\n\t\t\t//root.viewmodel.mark( keypath );\n\t\t}\n\t}\n\n\tvar mutatorMethods = [ 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift' ];\n\tvar patchedArrayProto = [];\n\n\tmutatorMethods.forEach( function ( methodName ) {\n\t\tvar method = function () {\n\t\t\tvar this$1 = this;\n\t\t\tvar args = [], len = arguments.length;\n\t\t\twhile ( len-- ) args[ len ] = arguments[ len ];\n\n\t\t\tvar newIndices = getNewIndices( this.length, methodName, args );\n\n\t\t\t// lock any magic array wrappers, so that things don't get fudged\n\t\t\tthis._ractive.wrappers.forEach( function ( r ) { if ( r.magic ) r.magic.locked = true; } );\n\n\t\t\t// apply the underlying method\n\t\t\tvar result = Array.prototype[ methodName ].apply( this, arguments );\n\n\t\t\t// trigger changes\n\t\t\trunloop.start();\n\n\t\t\tthis._ractive.setting = true;\n\t\t\tvar i = this._ractive.wrappers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tprocessWrapper( this$1._ractive.wrappers[i], this$1, methodName, newIndices );\n\t\t\t}\n\n\t\t\trunloop.end();\n\n\t\t\tthis._ractive.setting = false;\n\n\t\t\t// unlock the magic arrays... magic... bah\n\t\t\tthis._ractive.wrappers.forEach( function ( r ) { if ( r.magic ) r.magic.locked = false; } );\n\n\t\t\treturn result;\n\t\t};\n\n\t\tdefineProperty( patchedArrayProto, methodName, {\n\t\t\tvalue: method,\n\t\t\tconfigurable: true\n\t\t});\n\t});\n\n\tvar patchArrayMethods;\n\tvar unpatchArrayMethods;\n\n\t// can we use prototype chain injection?\n\t// http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/#wrappers_prototype_chain_injection\n\tif ( ({}).__proto__ ) {\n\t\t// yes, we can\n\t\tpatchArrayMethods = function ( array ) { return array.__proto__ = patchedArrayProto; };\n\t\tunpatchArrayMethods = function ( array ) { return array.__proto__ = Array.prototype; };\n\t}\n\n\telse {\n\t\t// no, we can't\n\t\tpatchArrayMethods = function ( array ) {\n\t\t\tvar i = mutatorMethods.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar methodName = mutatorMethods[i];\n\t\t\t\tdefineProperty( array, methodName, {\n\t\t\t\t\tvalue: patchedArrayProto[ methodName ],\n\t\t\t\t\tconfigurable: true\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tunpatchArrayMethods = function ( array ) {\n\t\t\tvar i = mutatorMethods.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete array[ mutatorMethods[i] ];\n\t\t\t}\n\t\t};\n\t}\n\n\tpatchArrayMethods.unpatch = unpatchArrayMethods; // TODO export separately?\n\tvar patch = patchArrayMethods;\n\n\tvar errorMessage$1 = 'Something went wrong in a rather interesting way';\n\n\tvar arrayAdaptor = {\n\t\tfilter: function ( object ) {\n\t\t\t// wrap the array if a) b) it's an array, and b) either it hasn't been wrapped already,\n\t\t\t// or the array didn't trigger the get() itself\n\t\t\treturn isArray( object ) && ( !object._ractive || !object._ractive.setting );\n\t\t},\n\t\twrap: function ( ractive, array, keypath ) {\n\t\t\treturn new ArrayWrapper( ractive, array, keypath );\n\t\t}\n\t};\n\n\tvar ArrayWrapper = function ArrayWrapper ( ractive, array ) {\n\t\tthis.root = ractive;\n\t\tthis.value = array;\n\t\tthis.__model = null; // filled in later\n\n\t\t// if this array hasn't already been ractified, ractify it\n\t\tif ( !array._ractive ) {\n\t\t\t// define a non-enumerable _ractive property to store the wrappers\n\t\t\tdefineProperty( array, '_ractive', {\n\t\t\t\tvalue: {\n\t\t\t\t\twrappers: [],\n\t\t\t\t\tinstances: [],\n\t\t\t\t\tsetting: false\n\t\t\t\t},\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\tpatch( array );\n\t\t}\n\n\t\t// store the ractive instance, so we can handle transitions later\n\t\tif ( !array._ractive.instances[ ractive._guid ] ) {\n\t\t\tarray._ractive.instances[ ractive._guid ] = 0;\n\t\t\tarray._ractive.instances.push( ractive );\n\t\t}\n\n\t\tarray._ractive.instances[ ractive._guid ] += 1;\n\t\tarray._ractive.wrappers.push( this );\n\t};\n\n\tArrayWrapper.prototype.get = function get () {\n\t\treturn this.value;\n\t};\n\n\tArrayWrapper.prototype.reset = function reset ( value ) {\n\t\treturn this.value === value;\n\t};\n\n\tArrayWrapper.prototype.teardown = function teardown () {\n\t\tvar array, storage, wrappers, instances, index;\n\n\t\tarray = this.value;\n\t\tstorage = array._ractive;\n\t\twrappers = storage.wrappers;\n\t\tinstances = storage.instances;\n\n\t\t// if teardown() was invoked because we're clearing the cache as a result of\n\t\t// a change that the array itself triggered, we can save ourselves the teardown\n\t\t// and immediate setup\n\t\tif ( storage.setting ) {\n\t\t\treturn false; // so that we don't remove it from cached wrappers\n\t\t}\n\n\t\tindex = wrappers.indexOf( this );\n\t\tif ( index === -1 ) {\n\t\t\tthrow new Error( errorMessage$1 );\n\t\t}\n\n\t\twrappers.splice( index, 1 );\n\n\t\t// if nothing else depends on this array, we can revert it to its\n\t\t// natural state\n\t\tif ( !wrappers.length ) {\n\t\t\tdelete array._ractive;\n\t\t\tpatch.unpatch( this.value );\n\t\t}\n\n\t\telse {\n\t\t\t// remove ractive instance if possible\n\t\t\tinstances[ this.root._guid ] -= 1;\n\t\t\tif ( !instances[ this.root._guid ] ) {\n\t\t\t\tindex = instances.indexOf( this.root );\n\n\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\tthrow new Error( errorMessage$1 );\n\t\t\t\t}\n\n\t\t\t\tinstances.splice( index, 1 );\n\t\t\t}\n\t\t}\n\t};\n\n\tvar magicAdaptor;\n\n\ttry {\n\t\tObject.defineProperty({}, 'test', { get: function() {}, set: function() {} });\n\n\t\tmagicAdaptor = {\n\t\t\tfilter: function ( value ) {\n\t\t\t\treturn value && typeof value === 'object';\n\t\t\t},\n\t\t\twrap: function ( ractive, value, keypath ) {\n\t\t\t\treturn new MagicWrapper( ractive, value, keypath );\n\t\t\t}\n\t\t};\n\t} catch ( err ) {\n\t\tmagicAdaptor = false;\n\t}\n\n\tvar magicAdaptor$1 = magicAdaptor;\n\n\tfunction createOrWrapDescriptor ( originalDescriptor, ractive, keypath, wrapper ) {\n\t\tif ( originalDescriptor.set && originalDescriptor.set.__magic ) {\n\t\t\toriginalDescriptor.set.__magic.dependants.push({ ractive: ractive, keypath: keypath });\n\t\t\treturn originalDescriptor;\n\t\t}\n\n\t\tvar setting;\n\n\t\tvar dependants = [{ ractive: ractive, keypath: keypath }];\n\n\t\tvar descriptor = {\n\t\t\tget: function () {\n\t\t\t\treturn 'value' in originalDescriptor ? originalDescriptor.value : originalDescriptor.get.call( this );\n\t\t\t},\n\t\t\tset: function (value) {\n\t\t\t\tif ( setting ) return;\n\n\t\t\t\tif ( 'value' in originalDescriptor ) {\n\t\t\t\t\toriginalDescriptor.value = value;\n\t\t\t\t} else {\n\t\t\t\t\toriginalDescriptor.set.call( this, value );\n\t\t\t\t}\n\n\t\t\t\tif ( wrapper.locked ) return;\n\t\t\t\tsetting = true;\n\t\t\t\tdependants.forEach( function (ref) {\n\t\t\t\t\tvar ractive = ref.ractive;\n\t\t\t\t\tvar keypath = ref.keypath;\n\n\t\t\t\t\tractive.set( keypath, value );\n\t\t\t\t});\n\t\t\t\tsetting = false;\n\t\t\t},\n\t\t\tenumerable: true\n\t\t};\n\n\t\tdescriptor.set.__magic = { dependants: dependants, originalDescriptor: originalDescriptor };\n\n\t\treturn descriptor;\n\t}\n\n\tfunction revert ( descriptor, ractive, keypath ) {\n\t\tif ( !descriptor.set || !descriptor.set.__magic ) return true;\n\n\t\tvar dependants = descriptor.set.__magic;\n\t\tvar i = dependants.length;\n\t\twhile ( i-- ) {\n\t\t\tvar dependant = dependants[i];\n\t\t\tif ( dependant.ractive === ractive && dependant.keypath === keypath ) {\n\t\t\t\tdependants.splice( i, 1 );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar MagicWrapper = function MagicWrapper ( ractive, value, keypath ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.ractive = ractive;\n\t\tthis.value = value;\n\t\tthis.keypath = keypath;\n\n\t\tthis.originalDescriptors = {};\n\n\t\t// wrap all properties with getters\n\t\tObject.keys( value ).forEach( function ( key ) {\n\t\t\tvar originalDescriptor = Object.getOwnPropertyDescriptor( this$1.value, key );\n\t\t\tthis$1.originalDescriptors[ key ] = originalDescriptor;\n\n\t\t\tvar childKeypath = keypath ? (\"\" + keypath + \".\" + (escapeKey( key ))) : escapeKey( key );\n\n\t\t\tvar descriptor = createOrWrapDescriptor( originalDescriptor, ractive, childKeypath, this$1 );\n\n\n\n\t\t\tObject.defineProperty( this$1.value, key, descriptor );\n\t\t});\n\t};\n\n\tMagicWrapper.prototype.get = function get () {\n\t\treturn this.value;\n\t};\n\n\tMagicWrapper.prototype.reset = function reset ( value ) {\n\t\treturn this.value === value;\n\t};\n\n\tMagicWrapper.prototype.set = function set ( key, value ) {\n\t\tthis.value[ key ] = value;\n\t};\n\n\tMagicWrapper.prototype.teardown = function teardown () {\n\t\tvar this$1 = this;\n\n\t\t\tObject.keys( this.value ).forEach( function ( key ) {\n\t\t\tvar descriptor = Object.getOwnPropertyDescriptor( this$1.value, key );\n\t\t\tif ( !descriptor.set || !descriptor.set.__magic ) return;\n\n\t\t\trevert( descriptor );\n\n\t\t\tif ( descriptor.set.__magic.dependants.length === 1 ) {\n\t\t\t\tObject.defineProperty( this$1.value, key, descriptor.set.__magic.originalDescriptor );\n\t\t\t}\n\t\t});\n\t};\n\n\tvar MagicArrayWrapper = function MagicArrayWrapper ( ractive, array, keypath ) {\n\t\tthis.value = array;\n\n\t\tthis.magic = true;\n\n\t\tthis.magicWrapper = magicAdaptor$1.wrap( ractive, array, keypath );\n\t\tthis.arrayWrapper = arrayAdaptor.wrap( ractive, array, keypath );\n\t\tthis.arrayWrapper.magic = this.magicWrapper;\n\n\t\t// ugh, this really is a terrible hack\n\t\tObject.defineProperty( this, '__model', {\n\t\t\tget: function () {\n\t\t\t\treturn this.arrayWrapper.__model;\n\t\t\t},\n\t\t\tset: function ( model ) {\n\t\t\t\tthis.arrayWrapper.__model = model;\n\t\t\t}\n\t\t});\n\t};\n\n\tMagicArrayWrapper.prototype.get = function get () {\n\t\treturn this.value;\n\t};\n\n\tMagicArrayWrapper.prototype.teardown = function teardown () {\n\t\tthis.arrayWrapper.teardown();\n\t\tthis.magicWrapper.teardown();\n\t};\n\n\tMagicArrayWrapper.prototype.reset = function reset ( value ) {\n\t\treturn this.arrayWrapper.reset( value ) && this.magicWrapper.reset( value );\n\t};\n\n\tvar magicArrayAdaptor = {\n\t\tfilter: function ( object, keypath, ractive ) {\n\t\t\treturn magicAdaptor$1.filter( object, keypath, ractive ) && arrayAdaptor.filter( object );\n\t\t},\n\n\t\twrap: function ( ractive, array, keypath ) {\n\t\t\treturn new MagicArrayWrapper( ractive, array, keypath );\n\t\t}\n\t};\n\n\t// TODO this is probably a bit anal, maybe we should leave it out\n\tfunction prettify ( fnBody ) {\n\t\tvar lines = fnBody\n\t\t\t.replace( /^\\t+/gm, function ( tabs ) { return tabs.split( '\\t' ).join( '  ' ); } )\n\t\t\t.split( '\\n' );\n\n\t\tvar minIndent = lines.length < 2 ? 0 :\n\t\t\tlines.slice( 1 ).reduce( function ( prev, line ) {\n\t\t\t\treturn Math.min( prev, /^\\s*/.exec( line )[0].length );\n\t\t\t}, Infinity );\n\n\t\treturn lines.map( function ( line, i ) {\n\t\t\treturn '    ' + ( i ? line.substring( minIndent ) : line );\n\t\t}).join( '\\n' );\n\t}\n\n\t// Ditto. This function truncates the stack to only include app code\n\tfunction truncateStack ( stack ) {\n\t\tif ( !stack ) return '';\n\n\t\tvar lines = stack.split( '\\n' );\n\t\tvar name = Computation.name + '.getValue';\n\n\t\tvar truncated = [];\n\n\t\tvar len = lines.length;\n\t\tfor ( var i = 1; i < len; i += 1 ) {\n\t\t\tvar line = lines[i];\n\n\t\t\tif ( ~line.indexOf( name ) ) {\n\t\t\t\treturn truncated.join( '\\n' );\n\t\t\t} else {\n\t\t\t\ttruncated.push( line );\n\t\t\t}\n\t\t}\n\t}\n\n\tvar Computation = (function (Model) {\n\t\tfunction Computation ( viewmodel, signature, key ) {\n\t\t\tModel.call( this, null, null );\n\n\t\t\tthis.root = this.parent = viewmodel;\n\t\t\tthis.signature = signature;\n\n\t\t\tthis.key = key; // not actually used, but helps with debugging\n\t\t\tthis.isExpression = key && key[0] === '@';\n\n\t\t\tthis.isReadonly = !this.signature.setter;\n\n\t\t\tthis.context = viewmodel.computationContext;\n\n\t\t\tthis.dependencies = [];\n\n\t\t\tthis.children = [];\n\t\t\tthis.childByKey = {};\n\n\t\t\tthis.deps = [];\n\n\t\t\tthis.dirty = true;\n\n\t\t\t// TODO: is there a less hackish way to do this?\n\t\t\tthis.shuffle = undefined;\n\t\t}\n\n\t\tComputation.prototype = Object.create( Model && Model.prototype );\n\t\tComputation.prototype.constructor = Computation;\n\n\t\tComputation.prototype.get = function get ( shouldCapture ) {\n\t\t\tif ( shouldCapture ) capture( this );\n\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tthis.value = this.getValue();\n\t\t\t\tif ( this.wrapper ) this.newWrapperValue = this.value;\n\t\t\t\tthis.adapt();\n\t\t\t}\n\n\t\t\t// if capturing, this value needs to be unwrapped because it's for external use\n\t\t\treturn shouldCapture && this.wrapper ? this.wrapperValue : this.value;\n\t\t};\n\n\t\tComputation.prototype.getValue = function getValue () {\n\t\t\tstartCapturing();\n\t\t\tvar result;\n\n\t\t\ttry {\n\t\t\t\tresult = this.signature.getter.call( this.context );\n\t\t\t} catch ( err ) {\n\t\t\t\twarnIfDebug( (\"Failed to compute \" + (this.getKeypath()) + \": \" + (err.message || err)) );\n\n\t\t\t\t// TODO this is all well and good in Chrome, but...\n\t\t\t\t// ...also, should encapsulate this stuff better, and only\n\t\t\t\t// show it if Ractive.DEBUG\n\t\t\t\tif ( hasConsole ) {\n\t\t\t\t\tif ( console.groupCollapsed ) console.groupCollapsed( '%cshow details', 'color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;' );\n\t\t\t\t\tvar functionBody = prettify( this.signature.getterString );\n\t\t\t\t\tvar stack = this.signature.getterUseStack ? '\\n\\n' + truncateStack( err.stack ) : '';\n\t\t\t\t\tconsole.error( (\"\" + (err.name) + \": \" + (err.message) + \"\\n\\n\" + functionBody + \"\" + stack) );\n\t\t\t\t\tif ( console.groupCollapsed ) console.groupEnd();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar dependencies = stopCapturing();\n\t\t\tthis.setDependencies( dependencies );\n\n\t\t\t// if not the first computation and the value is not the same,\n\t\t\t// register the change for change events\n\t\t\tif ( 'value' in this && result !== this.value ) {\n\t\t\t\tthis.registerChange( this.getKeypath(), result );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\tComputation.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.dirty = true;\n\n\t\t\tthis.links.forEach( marked );\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.children.forEach( handleChange );\n\t\t\tthis.clearUnresolveds(); // TODO same question as on Model - necessary for primitives?\n\t\t};\n\n\t\tComputation.prototype.joinKey = function joinKey ( key ) {\n\t\t\tif ( key === undefined || key === '' ) return this;\n\n\t\t\tif ( !this.childByKey.hasOwnProperty( key ) ) {\n\t\t\t\tvar child = new ComputationChild( this, key );\n\t\t\t\tthis.children.push( child );\n\t\t\t\tthis.childByKey[ key ] = child;\n\t\t\t}\n\n\t\t\treturn this.childByKey[ key ];\n\t\t};\n\n\t\tComputation.prototype.mark = function mark () {\n\t\t\tthis.handleChange();\n\t\t};\n\n\t\tComputation.prototype.rebinding = function rebinding ( next, previous ) {\n\t\t\t// computations will grab all of their deps again automagically\n\t\t\tif ( next !== previous ) this.handleChange();\n\t\t};\n\n\t\tComputation.prototype.set = function set ( value ) {\n\t\t\tif ( !this.signature.setter ) {\n\t\t\t\tthrow new Error( (\"Cannot set read-only computed value '\" + (this.key) + \"'\") );\n\t\t\t}\n\n\t\t\tthis.signature.setter( value );\n\t\t\tthis.mark();\n\t\t};\n\n\t\tComputation.prototype.setDependencies = function setDependencies ( dependencies ) {\n\t\t\t// unregister any soft dependencies we no longer have\n\t\t\tvar this$1 = this;\n\n\t\t\tvar i = this.dependencies.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar model = this$1.dependencies[i];\n\t\t\t\tif ( !~dependencies.indexOf( model ) ) model.unregister( this$1 );\n\t\t\t}\n\n\t\t\t// and add any new ones\n\t\t\ti = dependencies.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar model$1 = dependencies[i];\n\t\t\t\tif ( !~this$1.dependencies.indexOf( model$1 ) ) model$1.register( this$1 );\n\t\t\t}\n\n\t\t\tthis.dependencies = dependencies;\n\t\t};\n\n\t\tComputation.prototype.teardown = function teardown () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar i = this.dependencies.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( this$1.dependencies[i] ) this$1.dependencies[i].unregister( this$1 );\n\t\t\t}\n\t\t\tif ( this.root.computations[this.key] === this ) delete this.root.computations[this.key];\n\t\t\tModel.prototype.teardown.call(this);\n\t\t};\n\n\t\tComputation.prototype.unregister = function unregister ( dependent ) {\n\t\t\tModel.prototype.unregister.call( this, dependent );\n\t\t\t// tear down expressions with no deps, because they will be replaced when needed\n\t\t\tif ( this.isExpression && this.deps.length === 0 ) this.teardown();\n\t\t};\n\n\t\treturn Computation;\n\t}(Model));\n\n\tvar RactiveModel = (function (Model) {\n\t\tfunction RactiveModel ( ractive ) {\n\t\t\tModel.call( this, null, '' );\n\t\t\tthis.value = ractive;\n\t\t\tthis.isRoot = true;\n\t\t\tthis.root = this;\n\t\t\tthis.adaptors = [];\n\t\t\tthis.ractive = ractive;\n\t\t\tthis.changes = {};\n\t\t}\n\n\t\tRactiveModel.prototype = Object.create( Model && Model.prototype );\n\t\tRactiveModel.prototype.constructor = RactiveModel;\n\n\t\tRactiveModel.prototype.getKeypath = function getKeypath() {\n\t\t\treturn '@this';\n\t\t};\n\n\t\treturn RactiveModel;\n\t}(Model));\n\n\tvar hasProp$1 = Object.prototype.hasOwnProperty;\n\n\tvar RootModel = (function (Model) {\n\t\tfunction RootModel ( options ) {\n\t\t\tModel.call( this, null, null );\n\n\t\t\t// TODO deprecate this\n\t\t\tthis.changes = {};\n\n\t\t\tthis.isRoot = true;\n\t\t\tthis.root = this;\n\t\t\tthis.ractive = options.ractive; // TODO sever this link\n\n\t\t\tthis.value = options.data;\n\t\t\tthis.adaptors = options.adapt;\n\t\t\tthis.adapt();\n\n\t\t\tthis.computationContext = options.ractive;\n\t\t\tthis.computations = {};\n\n\t\t\t// TODO this is only for deprecation of using expression keypaths\n\t\t\tthis.expressions = {};\n\t\t}\n\n\t\tRootModel.prototype = Object.create( Model && Model.prototype );\n\t\tRootModel.prototype.constructor = RootModel;\n\n\t\tRootModel.prototype.applyChanges = function applyChanges () {\n\t\t\tthis._changeHash = {};\n\t\t\tthis.flush();\n\n\t\t\treturn this._changeHash;\n\t\t};\n\n\t\tRootModel.prototype.compute = function compute ( key, signature ) {\n\t\t\tvar computation = new Computation( this, signature, key );\n\t\t\tthis.computations[ escapeKey( key ) ] = computation;\n\n\t\t\treturn computation;\n\t\t};\n\n\t\tRootModel.prototype.createLink = function createLink ( keypath, target, targetPath ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar keys = splitKeypathI( keypath );\n\n\t\t\tvar model = this;\n\t\t\twhile ( keys.length ) {\n\t\t\t\tvar key = keys.shift();\n\t\t\t\tmodel = this$1.childByKey[ key ] || this$1.joinKey( key );\n\t\t\t}\n\n\t\t\treturn model.link( target, targetPath );\n\t\t};\n\n\t\tRootModel.prototype.get = function get ( shouldCapture, options ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( shouldCapture ) capture( this );\n\n\t\t\tif ( !options || options.virtual !== false ) {\n\t\t\t\tvar result = this.getVirtual();\n\t\t\t\tvar keys = Object.keys( this.computations );\n\t\t\t\tvar i = keys.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tvar computation = this$1.computations[ keys[i] ];\n\t\t\t\t\t// exclude template expressions\n\t\t\t\t\tif ( !computation.isExpression ) {\n\t\t\t\t\t\tresult[ keys[i] ] = computation.get();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this.value;\n\t\t\t}\n\t\t};\n\n\t\tRootModel.prototype.getKeypath = function getKeypath () {\n\t\t\treturn '';\n\t\t};\n\n\t\tRootModel.prototype.getRactiveModel = function getRactiveModel() {\n\t\t\treturn this.ractiveModel || ( this.ractiveModel = new RactiveModel( this.ractive ) );\n\t\t};\n\n\t\tRootModel.prototype.getValueChildren = function getValueChildren () {\n\t\t\tvar children = Model.prototype.getValueChildren.call( this, this.value );\n\n\t\t\tthis.children.forEach( function ( child ) {\n\t\t\t\tif ( child._link ) {\n\t\t\t\t\tvar idx = children.indexOf( child );\n\t\t\t\t\tif ( ~idx ) children.splice( idx, 1, child._link );\n\t\t\t\t\telse children.push( child._link );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor ( var k in this.computations ) {\n\t\t\t\tchildren.push( this.computations[k] );\n\t\t\t}\n\n\t\t\treturn children;\n\t\t};\n\n\t\tRootModel.prototype.handleChange = function handleChange$1 () {\n\t\t\tthis.deps.forEach( handleChange );\n\t\t};\n\n\t\tRootModel.prototype.has = function has ( key ) {\n\t\t\tvar value = this.value;\n\t\t\tvar unescapedKey = unescapeKey( key );\n\n\t\t\tif ( hasProp$1.call( value, unescapedKey ) ) return true;\n\n\t\t\t// mappings/links and computations\n\t\t\tif ( key in this.computations || this.childByKey[unescapedKey] && this.childByKey[unescapedKey]._link ) return true;\n\t\t\t// TODO remove this after deprecation is done\n\t\t\tif ( key in this.expressions ) return true;\n\n\t\t\t// We climb up the constructor chain to find if one of them contains the unescapedKey\n\t\t\tvar constructor = value.constructor;\n\t\t\twhile ( constructor !== Function && constructor !== Array && constructor !== Object ) {\n\t\t\t\tif ( hasProp$1.call( constructor.prototype, unescapedKey ) ) return true;\n\t\t\t\tconstructor = constructor.constructor;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tRootModel.prototype.joinKey = function joinKey ( key, opts ) {\n\t\t\tif ( key === '@global' ) return GlobalModel$1;\n\t\t\tif ( key === '@this' ) return this.getRactiveModel();\n\n\t\t\tif ( this.expressions.hasOwnProperty( key ) ) {\n\t\t\t\twarnIfDebug( (\"Accessing expression keypaths (\" + (key.substr(1)) + \") from the instance is deprecated. You can used a getNodeInfo or event object to access keypaths with expression context.\") );\n\t\t\t\treturn this.expressions[ key ];\n\t\t\t}\n\n\t\t\treturn this.computations.hasOwnProperty( key ) ? this.computations[ key ] :\n\t\t\t       Model.prototype.joinKey.call( this, key, opts );\n\t\t};\n\n\t\tRootModel.prototype.map = function map ( localKey, origin ) {\n\t\t\tvar local = this.joinKey( localKey );\n\t\t\tlocal.link( origin );\n\t\t};\n\n\t\tRootModel.prototype.rebinding = function rebinding () {\n\t\t};\n\n\t\tRootModel.prototype.set = function set ( value ) {\n\t\t\t// TODO wrapping root node is a baaaad idea. We should prevent this\n\t\t\tvar wrapper = this.wrapper;\n\t\t\tif ( wrapper ) {\n\t\t\t\tvar shouldTeardown = !wrapper.reset || wrapper.reset( value ) === false;\n\n\t\t\t\tif ( shouldTeardown ) {\n\t\t\t\t\twrapper.teardown();\n\t\t\t\t\tthis.wrapper = null;\n\t\t\t\t\tthis.value = value;\n\t\t\t\t\tthis.adapt();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.value = value;\n\t\t\t\tthis.adapt();\n\t\t\t}\n\n\t\t\tthis.deps.forEach( handleChange );\n\t\t\tthis.children.forEach( mark );\n\t\t\tthis.clearUnresolveds(); // TODO do we need to do this with primitive values? if not, what about e.g. unresolved `length` property of null -> string?\n\t\t};\n\n\t\tRootModel.prototype.retrieve = function retrieve () {\n\t\t\treturn this.wrapper ? this.wrapper.get() : this.value;\n\t\t};\n\n\t\tRootModel.prototype.teardown = function teardown () {\n\t\t\tModel.prototype.teardown.call(this);\n\t\t\tfor ( var k in this.computations ) {\n\t\t\t\tthis.computations[ k ].teardown();\n\t\t\t}\n\t\t};\n\n\t\tRootModel.prototype.update = function update () {\n\t\t\t// noop\n\t\t};\n\n\t\treturn RootModel;\n\t}(Model));\n\n\tfunction getComputationSignature ( ractive, key, signature ) {\n\t\tvar getter;\n\t\tvar setter;\n\n\t\t// useful for debugging\n\t\tvar getterString;\n\t\tvar getterUseStack;\n\t\tvar setterString;\n\n\t\tif ( typeof signature === 'function' ) {\n\t\t\tgetter = bind( signature, ractive );\n\t\t\tgetterString = signature.toString();\n\t\t\tgetterUseStack = true;\n\t\t}\n\n\t\tif ( typeof signature === 'string' ) {\n\t\t\tgetter = createFunctionFromString( signature, ractive );\n\t\t\tgetterString = signature;\n\t\t}\n\n\t\tif ( typeof signature === 'object' ) {\n\t\t\tif ( typeof signature.get === 'string' ) {\n\t\t\t\tgetter = createFunctionFromString( signature.get, ractive );\n\t\t\t\tgetterString = signature.get;\n\t\t\t} else if ( typeof signature.get === 'function' ) {\n\t\t\t\tgetter = bind( signature.get, ractive );\n\t\t\t\tgetterString = signature.get.toString();\n\t\t\t\tgetterUseStack = true;\n\t\t\t} else {\n\t\t\t\tfatal( '`%s` computation must have a `get()` method', key );\n\t\t\t}\n\n\t\t\tif ( typeof signature.set === 'function' ) {\n\t\t\t\tsetter = bind( signature.set, ractive );\n\t\t\t\tsetterString = signature.set.toString();\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tgetter: getter,\n\t\t\tsetter: setter,\n\t\t\tgetterString: getterString,\n\t\t\tsetterString: setterString,\n\t\t\tgetterUseStack: getterUseStack\n\t\t};\n\t}\n\n\tvar constructHook = new Hook( 'construct' );\n\n\tvar registryNames$1 = [\n\t\t'adaptors',\n\t\t'components',\n\t\t'decorators',\n\t\t'easing',\n\t\t'events',\n\t\t'interpolators',\n\t\t'partials',\n\t\t'transitions'\n\t];\n\n\tvar uid = 0;\n\n\tfunction construct ( ractive, options ) {\n\t\tif ( Ractive.DEBUG ) welcome();\n\n\t\tinitialiseProperties( ractive );\n\n\t\t// TODO remove this, eventually\n\t\tdefineProperty( ractive, 'data', { get: deprecateRactiveData });\n\n\t\t// TODO don't allow `onconstruct` with `new Ractive()`, there's no need for it\n\t\tconstructHook.fire( ractive, options );\n\n\t\t// Add registries\n\t\tregistryNames$1.forEach( function ( name ) {\n\t\t\tractive[ name ] = extendObj( create( ractive.constructor[ name ] || null ), options[ name ] );\n\t\t});\n\n\t\t// Create a viewmodel\n\t\tvar viewmodel = new RootModel({\n\t\t\tadapt: getAdaptors( ractive, ractive.adapt, options ),\n\t\t\tdata: dataConfigurator.init( ractive.constructor, ractive, options ),\n\t\t\tractive: ractive\n\t\t});\n\n\t\tractive.viewmodel = viewmodel;\n\n\t\t// Add computed properties\n\t\tvar computed = extendObj( create( ractive.constructor.prototype.computed ), options.computed );\n\n\t\tfor ( var key in computed ) {\n\t\t\tvar signature = getComputationSignature( ractive, key, computed[ key ] );\n\t\t\tviewmodel.compute( key, signature );\n\t\t}\n\t}\n\n\tfunction combine$2 ( arrays ) {\n\t\tvar res = [];\n\t\tvar args = res.concat.apply( res, arrays );\n\n\t\tvar i = args.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( !~res.indexOf( args[i] ) ) {\n\t\t\t\tres.unshift( args[i] );\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tfunction getAdaptors ( ractive, protoAdapt, options ) {\n\t\tprotoAdapt = protoAdapt.map( lookup );\n\t\tvar adapt = ensureArray( options.adapt ).map( lookup );\n\n\t\tvar builtins = [];\n\t\tvar srcs = [ protoAdapt, adapt ];\n\t\tif ( ractive.parent && !ractive.isolated ) {\n\t\t\tsrcs.push( ractive.parent.viewmodel.adaptors );\n\t\t}\n\t\tsrcs.push( builtins );\n\n\t\tvar magic = 'magic' in options ? options.magic : ractive.magic;\n\t\tvar modifyArrays = 'modifyArrays' in options ? options.modifyArrays : ractive.modifyArrays;\n\n\t\tif ( magic ) {\n\t\t\tif ( !magicSupported ) {\n\t\t\t\tthrow new Error( 'Getters and setters (magic mode) are not supported in this browser' );\n\t\t\t}\n\n\t\t\tif ( modifyArrays ) {\n\t\t\t\tbuiltins.push( magicArrayAdaptor );\n\t\t\t}\n\n\t\t\tbuiltins.push( magicAdaptor$1 );\n\t\t}\n\n\t\tif ( modifyArrays ) {\n\t\t\tbuiltins.push( arrayAdaptor );\n\t\t}\n\n\t\treturn combine$2( srcs );\n\n\n\t\tfunction lookup ( adaptor ) {\n\t\t\tif ( typeof adaptor === 'string' ) {\n\t\t\t\tadaptor = findInViewHierarchy( 'adaptors', ractive, adaptor );\n\n\t\t\t\tif ( !adaptor ) {\n\t\t\t\t\tfatal( missingPlugin( adaptor, 'adaptor' ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn adaptor;\n\t\t}\n\t}\n\n\tfunction initialiseProperties ( ractive ) {\n\t\t// Generate a unique identifier, for places where you'd use a weak map if it\n\t\t// existed\n\t\tractive._guid = 'r-' + uid++;\n\n\t\t// events\n\t\tractive._subs = create( null );\n\n\t\t// storage for item configuration from instantiation to reset,\n\t\t// like dynamic functions or original values\n\t\tractive._config = {};\n\n\t\t// nodes registry\n\t\tractive.nodes = {};\n\n\t\t// events\n\t\tractive.event = null;\n\t\tractive._eventQueue = [];\n\n\t\t// live queries\n\t\tractive._liveQueries = [];\n\t\tractive._liveComponentQueries = [];\n\n\t\t// observers\n\t\tractive._observers = [];\n\n\t\tif(!ractive.component){\n\t\t\tractive.root = ractive;\n\t\t\tractive.parent = ractive.container = null; // TODO container still applicable?\n\t\t}\n\n\t}\n\n\tfunction deprecateRactiveData () {\n\t\tthrow new Error( 'Using `ractive.data` is no longer supported - you must use the `ractive.get()` API instead' );\n\t}\n\n\tfunction getChildQueue ( queue, ractive ) {\n\t\treturn queue[ ractive._guid ] || ( queue[ ractive._guid ] = [] );\n\t}\n\n\tfunction fire ( hookQueue, ractive ) {\n\t\tvar childQueue = getChildQueue( hookQueue.queue, ractive );\n\n\t\thookQueue.hook.fire( ractive );\n\n\t\t// queue is \"live\" because components can end up being\n\t\t// added while hooks fire on parents that modify data values.\n\t\twhile ( childQueue.length ) {\n\t\t\tfire( hookQueue, childQueue.shift() );\n\t\t}\n\n\t\tdelete hookQueue.queue[ ractive._guid ];\n\t}\n\n\tvar HookQueue = function HookQueue ( event ) {\n\t\tthis.hook = new Hook( event );\n\t\tthis.inProcess = {};\n\t\tthis.queue = {};\n\t};\n\n\tHookQueue.prototype.begin = function begin ( ractive ) {\n\t\tthis.inProcess[ ractive._guid ] = true;\n\t};\n\n\tHookQueue.prototype.end = function end ( ractive ) {\n\t\tvar parent = ractive.parent;\n\n\t\t// If this is *isn't* a child of a component that's in process,\n\t\t// it should call methods or fire at this point\n\t\tif ( !parent || !this.inProcess[ parent._guid ] ) {\n\t\t\tfire( this, ractive );\n\t\t}\n\t\t// elsewise, handoff to parent to fire when ready\n\t\telse {\n\t\t\tgetChildQueue( this.queue, parent ).push( ractive );\n\t\t}\n\n\t\tdelete this.inProcess[ ractive._guid ];\n\t};\n\n\tvar configHook = new Hook( 'config' );\n\tvar initHook = new HookQueue( 'init' );\n\n\tfunction initialise ( ractive, userOptions, options ) {\n\t\tObject.keys( ractive.viewmodel.computations ).forEach( function ( key ) {\n\t\t\tvar computation = ractive.viewmodel.computations[ key ];\n\n\t\t\tif ( ractive.viewmodel.value.hasOwnProperty( key ) ) {\n\t\t\t\tcomputation.set( ractive.viewmodel.value[ key ] );\n\t\t\t}\n\t\t});\n\n\t\t// init config from Parent and options\n\t\tconfig.init( ractive.constructor, ractive, userOptions );\n\n\t\tconfigHook.fire( ractive );\n\t\tinitHook.begin( ractive );\n\n\t\tvar fragment;\n\n\t\t// Render virtual DOM\n\t\tif ( ractive.template ) {\n\t\t\tvar cssIds;\n\n\t\t\tif ( options.cssIds || ractive.cssId ) {\n\t\t\t\tcssIds = options.cssIds ? options.cssIds.slice() : [];\n\n\t\t\t\tif ( ractive.cssId ) {\n\t\t\t\t\tcssIds.push( ractive.cssId );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tractive.fragment = fragment = new Fragment({\n\t\t\t\towner: ractive,\n\t\t\t\ttemplate: ractive.template,\n\t\t\t\tcssIds: cssIds\n\t\t\t}).bind( ractive.viewmodel );\n\t\t}\n\n\t\tinitHook.end( ractive );\n\n\t\tif ( fragment ) {\n\t\t\t// render automatically ( if `el` is specified )\n\t\t\tvar el = getElement( ractive.el );\n\t\t\tif ( el ) {\n\t\t\t\tvar promise = ractive.render( el, ractive.append );\n\n\t\t\t\tif ( Ractive.DEBUG_PROMISES ) {\n\t\t\t\t\tpromise['catch']( function ( err ) {\n\t\t\t\t\t\twarnOnceIfDebug( 'Promise debugging is enabled, to help solve errors that happen asynchronously. Some browsers will log unhandled promise rejections, in which case you can safely disable promise debugging:\\n  Ractive.DEBUG_PROMISES = false;' );\n\t\t\t\t\t\twarnIfDebug( 'An error happened during rendering', { ractive: ractive });\n\t\t\t\t\t\tlogIfDebug( err );\n\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar DOMEvent = function DOMEvent ( name, owner ) {\n\t\tif ( name.indexOf( '*' ) !== -1 ) {\n\t\t\tfatal( (\"Only component proxy-events may contain \\\"*\\\" wildcards, <\" + (owner.name) + \" on-\" + name + \"=\\\"...\\\"/> is not valid\") );\n\t\t}\n\n\t\tthis.name = name;\n\t\tthis.owner = owner;\n\t\tthis.node = null;\n\t\tthis.handler = null;\n\t};\n\n\tDOMEvent.prototype.listen = function listen ( directive ) {\n\t\tvar node = this.node = this.owner.node;\n\t\tvar name = this.name;\n\n\t\tif ( !( (\"on\" + name) in node ) ) {\n\t\t\twarnOnce( missingPlugin( name, 'events' ) );\n\t\t\t}\n\n\t\t\tnode.addEventListener( name, this.handler = function( event ) {\n\t\t\tdirective.fire({\n\t\t\t\t\tnode: node,\n\t\t\t\toriginal: event\n\t\t\t\t});\n\t\t\t}, false );\n\t};\n\n\tDOMEvent.prototype.unlisten = function unlisten () {\n\t\tif ( this.handler ) this.node.removeEventListener( this.name, this.handler, false );\n\t};\n\n\tvar CustomEvent = function CustomEvent ( eventPlugin, owner ) {\n\t\tthis.eventPlugin = eventPlugin;\n\t\tthis.owner = owner;\n\t\tthis.handler = null;\n\t};\n\n\tCustomEvent.prototype.listen = function listen ( directive ) {\n\t\tvar node = this.owner.node;\n\n\t\tthis.handler = this.eventPlugin( node, function ( event ) {\n\t\t\tif ( event === void 0 ) event = {};\n\n\t\t\t\tevent.node = event.node || node;\n\t\t\tdirective.fire( event );\n\t\t});\n\t};\n\n\tCustomEvent.prototype.unlisten = function unlisten () {\n\t\tthis.handler.teardown();\n\t};\n\n\tvar RactiveEvent = function RactiveEvent ( ractive, name ) {\n\t\tthis.ractive = ractive;\n\t\tthis.name = name;\n\t\tthis.handler = null;\n\t};\n\n\tRactiveEvent.prototype.listen = function listen ( directive ) {\n\t\tvar ractive = this.ractive;\n\n\t\tthis.handler = ractive.on( this.name, function () {\n\t\t\tvar event;\n\n\t\t\t// semi-weak test, but what else? tag the event obj ._isEvent ?\n\t\t\tif ( arguments.length && arguments[0] && arguments[0].node ) {\n\t\t\t\tevent = Array.prototype.shift.call( arguments );\n\t\t\t\tevent.component = ractive;\n\t\t\t}\n\n\t\t\tvar args = Array.prototype.slice.call( arguments );\n\t\t\tdirective.fire( event, args );\n\n\t\t\t// cancel bubbling\n\t\t\treturn false;\n\t\t});\n\t};\n\n\tRactiveEvent.prototype.unlisten = function unlisten () {\n\t\tthis.handler.cancel();\n\t};\n\n\tvar specialPattern = /^(event|arguments)(\\..+)?$/;\n\tvar dollarArgsPattern = /^\\$(\\d+)(\\..+)?$/;\n\n\tvar EventDirective = function EventDirective ( options ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.owner = options.owner || options.parentFragment.owner || findElement( options.parentFragment );\n\t\tthis.element = this.owner.attributeByName ? this.owner : findElement( options.parentFragment );\n\t\tthis.template = options.template;\n\t\tthis.parentFragment = options.parentFragment;\n\t\tthis.ractive = options.parentFragment.ractive;\n\n\t\tthis.events = [];\n\n\t\tif ( this.element.type === COMPONENT ) {\n\t\t\tthis.template.n.split( '-' ).forEach( function ( n ) {\n\t\t\t\tthis$1.events.push( new RactiveEvent( this$1.element.instance, n ) );\n\t\t\t});\n\t\t} else {\n\t\t\tthis.template.n.split( '-' ).forEach( function ( n ) {\n\t\t\t\tvar fn = findInViewHierarchy( 'events', this$1.ractive, n );\n\t\t\t\t// we need to pass in \"this\" in order to get\n\t\t\t\t// access to node when it is created.\n\t\t\t\tthis$1.events.push(fn ? new CustomEvent( fn, this$1.element ) : new DOMEvent( n, this$1.element ));\n\t\t\t});\n\t\t}\n\n\t\tthis.context = null;\n\n\t\t// method calls\n\t\tthis.resolvers = null;\n\t\tthis.models = null;\n\n\t\t// handler directive\n\t\tthis.action = null;\n\t\tthis.args = null;\n\t};\n\n\tEventDirective.prototype.bind = function bind () {\n\t\tvar this$1 = this;\n\n\t\t\tthis.context = this.parentFragment.findContext();\n\n\t\tvar template = this.template.f;\n\n\t\tif ( template.x ) {\n\t\t\tthis.fn = getFunction( template.x.s, template.x.r.length );\n\t\t\tthis.resolvers = [];\n\t\t\tthis.models = template.x.r.map( function ( ref, i ) {\n\t\t\t\tvar specialMatch = specialPattern.exec( ref );\n\t\t\t\tif ( specialMatch ) {\n\t\t\t\t\t// on-click=\"foo(event.node)\"\n\t\t\t\t\treturn {\n\t\t\t\t\t\tspecial: specialMatch[1],\n\t\t\t\t\t\tkeys: specialMatch[2] ? splitKeypathI( specialMatch[2].substr(1) ) : []\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar dollarMatch = dollarArgsPattern.exec( ref );\n\t\t\t\tif ( dollarMatch ) {\n\t\t\t\t\t// on-click=\"foo($1)\"\n\t\t\t\t\treturn {\n\t\t\t\t\t\tspecial: 'arguments',\n\t\t\t\t\t\tkeys: [ dollarMatch[1] - 1 ].concat( dollarMatch[2] ? splitKeypathI( dollarMatch[2].substr( 1 ) ) : [] )\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar resolver;\n\n\t\t\t\tvar model = resolveReference( this$1.parentFragment, ref );\n\t\t\t\tif ( !model ) {\n\t\t\t\t\tresolver = this$1.parentFragment.resolve( ref, function ( model ) {\n\t\t\t\t\t\tthis$1.models[i] = model;\n\t\t\t\t\t\tremoveFromArray( this$1.resolvers, resolver );\n\t\t\t\t\t\tmodel.register( this$1 );\n\t\t\t\t\t});\n\n\t\t\t\t\tthis$1.resolvers.push( resolver );\n\t\t\t\t} else model.register( this$1 );\n\n\t\t\t\treturn model;\n\t\t\t});\n\t\t}\n\n\t\telse {\n\t\t\t// TODO deprecate this style of directive\n\t\t\tthis.action = typeof template === 'string' ? // on-click='foo'\n\t\t\t\ttemplate :\n\t\t\t\ttypeof template.n === 'string' ? // on-click='{{dynamic}}'\n\t\t\t\t\ttemplate.n :\n\t\t\t\t\tnew Fragment({\n\t\t\t\t\t\towner: this,\n\t\t\t\t\t\ttemplate: template.n\n\t\t\t\t\t});\n\n\t\t\tthis.args = template.a ? // static arguments\n\t\t\t\t( typeof template.a === 'string' ? [ template.a ] : template.a ) :\n\t\t\t\ttemplate.d ? // dynamic arguments\n\t\t\t\t\tnew Fragment({\n\t\t\t\t\t\towner: this,\n\t\t\t\t\t\ttemplate: template.d\n\t\t\t\t\t}) :\n\t\t\t\t\t[]; // no arguments\n\t\t}\n\n\t\tif ( this.action && typeof this.action !== 'string' ) this.action.bind();\n\t\tif ( this.args && template.d ) this.args.bind();\n\t};\n\n\tEventDirective.prototype.bubble = function bubble () {\n\t\tif ( !this.dirty ) {\n\t\t\tthis.dirty = true;\n\t\t\tthis.owner.bubble();\n\t\t}\n\t};\n\n\tEventDirective.prototype.destroyed = function destroyed () {\n\t\tthis.events.forEach( function ( e ) { return e.unlisten(); } );\n\t};\n\n\tEventDirective.prototype.fire = function fire ( event, passedArgs ) {\n\n\t\t// augment event object\n\t\tif ( passedArgs === void 0 ) passedArgs = [];\n\n\t\t\tif ( event && !event.hasOwnProperty( '_element' ) ) {\n\t\t\t   addHelpers( event, this.owner );\n\t\t}\n\n\t\tif ( this.fn ) {\n\t\t\tvar values = [];\n\n\t\t\tif ( event ) passedArgs.unshift( event );\n\n\t\t\tif ( this.models ) {\n\t\t\t\tthis.models.forEach( function ( model ) {\n\t\t\t\t\tif ( !model ) return values.push( undefined );\n\n\t\t\t\t\tif ( model.special ) {\n\t\t\t\t\t\tvar obj = model.special === 'event' ? event : passedArgs;\n\t\t\t\t\t\tvar keys = model.keys.slice();\n\n\t\t\t\t\t\twhile ( keys.length ) obj = obj[ keys.shift() ];\n\t\t\t\t\t\treturn values.push( obj );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( model.wrapper ) {\n\t\t\t\t\t\treturn values.push( model.wrapperValue );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalues.push( model.get() );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// make event available as `this.event`\n\t\t\tvar ractive = this.ractive;\n\t\t\tvar oldEvent = ractive.event;\n\n\t\t\tractive.event = event;\n\t\t\tvar result = this.fn.apply( ractive, values ).pop();\n\n\t\t\t// Auto prevent and stop if return is explicitly false\n\t\t\tif ( result === false ) {\n\t\t\t\tvar original = event ? event.original : undefined;\n\t\t\t\tif ( original ) {\n\t\t\t\t\toriginal.preventDefault && original.preventDefault();\n\t\t\t\t\toriginal.stopPropagation && original.stopPropagation();\n\t\t\t\t} else {\n\t\t\t\t\twarnOnceIfDebug( (\"handler '\" + (this.template.n) + \"' returned false, but there is no event available to cancel\") );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tractive.event = oldEvent;\n\t\t}\n\n\t\telse {\n\t\t\tvar action = this.action.toString();\n\t\t\tvar args = this.template.f.d ? this.args.getArgsList() : this.args;\n\n\t\t\tif ( passedArgs.length ) args = args.concat( passedArgs );\n\n\t\t\tif ( event ) event.name = action;\n\n\t\t\tfireEvent( this.ractive, action, {\n\t\t\t\tevent: event,\n\t\t\t\targs: args\n\t\t\t});\n\t\t}\n\t};\n\n\tEventDirective.prototype.handleChange = function handleChange () {};\n\n\tEventDirective.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !this.models ) return;\n\t\tvar idx = this.models.indexOf( previous );\n\n\t\tif ( ~idx ) {\n\t\t\tthis.models.splice( idx, 1, next );\n\t\t\tprevious.unregister( this );\n\t\t\tif ( next ) next.addShuffleTask( function () { return next.register( this$1 ); } );\n\t\t}\n\t};\n\n\tEventDirective.prototype.render = function render () {\n\t\t// render events after everything else, so they fire after bindings\n\t\tvar this$1 = this;\n\n\t\t\trunloop.scheduleTask( function () { return this$1.events.forEach( function ( e ) { return e.listen( this$1 ); }, true ); } );\n\t};\n\n\tEventDirective.prototype.toString = function toString() { return ''; };\n\n\tEventDirective.prototype.unbind = function unbind$1 () {\n\t\tvar this$1 = this;\n\n\t\t\tvar template = this.template.f;\n\n\t\tif ( template.x ) {\n\t\t\tif ( this.resolvers ) this.resolvers.forEach( unbind );\n\t\t\tthis.resolvers = [];\n\n\t\t\tif ( this.models ) this.models.forEach( function ( m ) {\n\t\t\t\tif ( m && m.unregister ) m.unregister( this$1 );\n\t\t\t});\n\t\t\tthis.models = null;\n\t\t}\n\n\t\telse {\n\t\t\t// TODO this is brittle and non-explicit, fix it\n\t\t\tif ( this.action && this.action.unbind ) this.action.unbind();\n\t\t\tif ( this.args && this.args.unbind ) this.args.unbind();\n\t\t}\n\t};\n\n\tEventDirective.prototype.unrender = function unrender () {\n\t\tthis.events.forEach( function ( e ) { return e.unlisten(); } );\n\t};\n\n\tEventDirective.prototype.update = function update () {\n\t\tif ( this.method || !this.dirty ) return; // nothing to do\n\n\t\tthis.dirty = false;\n\n\t\t// ugh legacy\n\t\tif ( this.action && this.action.update ) this.action.update();\n\t\tif ( this.args && this.args.update ) this.args.update();\n\t};\n\n\t// TODO it's unfortunate that this has to run every time a\n\t// component is rendered... is there a better way?\n\tfunction updateLiveQueries ( component ) {\n\t\t// Does this need to be added to any live queries?\n\t\tvar instance = component.ractive;\n\n\t\tdo {\n\t\t\tvar liveQueries = instance._liveComponentQueries;\n\n\t\t\tvar i = liveQueries.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar name = liveQueries[i];\n\t\t\t\tvar query = liveQueries[ (\"_\" + name) ];\n\n\t\t\t\tif ( query.test( component ) ) {\n\t\t\t\t\tquery.add( component.instance );\n\t\t\t\t\t// keep register of applicable selectors, for when we teardown\n\t\t\t\t\tcomponent.liveQueries.push( query );\n\t\t\t\t}\n\t\t\t}\n\t\t} while ( instance = instance.parent );\n\t}\n\n\tfunction removeFromLiveComponentQueries ( component ) {\n\t\tvar instance = component.ractive;\n\n\t\twhile ( instance ) {\n\t\t\tvar query = instance._liveComponentQueries[ (\"_\" + (component.name)) ];\n\t\t\tif ( query ) query.remove( component );\n\n\t\t\tinstance = instance.parent;\n\t\t}\n\t}\n\n\tfunction makeDirty ( query ) {\n\t\tquery.makeDirty();\n\t}\n\n\tvar teardownHook = new Hook( 'teardown' );\n\n\tvar Component = (function (Item) {\n\t\tfunction Component ( options, ComponentConstructor ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tItem.call( this, options );\n\t\t\tthis.type = COMPONENT; // override ELEMENT from super\n\n\t\t\tvar instance = create( ComponentConstructor.prototype );\n\n\t\t\tthis.instance = instance;\n\t\t\tthis.name = options.template.e;\n\t\t\tthis.parentFragment = options.parentFragment;\n\n\t\t\tthis.liveQueries = [];\n\n\t\t\tif ( instance.el ) {\n\t\t\t\twarnIfDebug( (\"The <\" + (this.name) + \"> component has a default 'el' property; it has been disregarded\") );\n\t\t\t}\n\n\t\t\tvar partials = options.template.p || {};\n\t\t\tif ( !( 'content' in partials ) ) partials.content = options.template.f || [];\n\t\t\tthis._partials = partials; // TEMP\n\n\t\t\tthis.yielders = {};\n\n\t\t\t// find container\n\t\t\tvar fragment = options.parentFragment;\n\t\t\tvar container;\n\t\t\twhile ( fragment ) {\n\t\t\t\tif ( fragment.owner.type === YIELDER ) {\n\t\t\t\t\tcontainer = fragment.owner.container;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tfragment = fragment.parent;\n\t\t\t}\n\n\t\t\t// add component-instance-specific properties\n\t\t\tinstance.parent = this.parentFragment.ractive;\n\t\t\tinstance.container = container || null;\n\t\t\tinstance.root = instance.parent.root;\n\t\t\tinstance.component = this;\n\n\t\t\tconstruct( this.instance, { partials: partials });\n\n\t\t\t// for hackability, this could be an open option\n\t\t\t// for any ractive instance, but for now, just\n\t\t\t// for components and just for ractive...\n\t\t\tinstance._inlinePartials = partials;\n\n\t\t\tthis.attributeByName = {};\n\n\t\t\tthis.attributes = [];\n\t\t\tvar leftovers = [];\n\t\t\t( this.template.m || [] ).forEach( function ( template ) {\n\t\t\t\tswitch ( template.t ) {\n\t\t\t\t\tcase ATTRIBUTE:\n\t\t\t\t\tcase EVENT:\n\t\t\t\t\tcase TRANSITION:\n\t\t\t\t\t\tthis$1.attributes.push( createItem({\n\t\t\t\t\t\t\towner: this$1,\n\t\t\t\t\t\t\tparentFragment: this$1.parentFragment,\n\t\t\t\t\t\t\ttemplate: template\n\t\t\t\t\t\t}) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase BINDING_FLAG:\n\t\t\t\t\tcase DECORATOR:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tleftovers.push( template );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.attributes.push( new ConditionalAttribute({\n\t\t\t\towner: this,\n\t\t\t\tparentFragment: this.parentFragment,\n\t\t\t\ttemplate: leftovers\n\t\t\t}) );\n\n\t\t\tthis.eventHandlers = [];\n\t\t\tif ( this.template.v ) this.setupEvents();\n\t\t}\n\n\t\tComponent.prototype = Object.create( Item && Item.prototype );\n\t\tComponent.prototype.constructor = Component;\n\n\t\tComponent.prototype.bind = function bind$1$$ () {\n\t\t\tthis.attributes.forEach( bind$1 );\n\n\t\t\tinitialise( this.instance, {\n\t\t\t\tpartials: this._partials\n\t\t\t}, {\n\t\t\t\tcssIds: this.parentFragment.cssIds\n\t\t\t});\n\n\t\t\tthis.eventHandlers.forEach( bind$1 );\n\n\t\t\tthis.bound = true;\n\t\t};\n\n\t\tComponent.prototype.bubble = function bubble () {\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.dirty = true;\n\t\t\t\tthis.parentFragment.bubble();\n\t\t\t}\n\t\t};\n\n\t\tComponent.prototype.checkYielders = function checkYielders () {\n\t\t\tvar this$1 = this;\n\n\t\t\tObject.keys( this.yielders ).forEach( function ( name ) {\n\t\t\t\tif ( this$1.yielders[ name ].length > 1 ) {\n\t\t\t\t\trunloop.end();\n\t\t\t\t\tthrow new Error( (\"A component template can only have one {{yield\" + (name ? ' ' + name : '') + \"}} declaration at a time\") );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tComponent.prototype.destroyed = function destroyed () {\n\t\t\tif ( this.instance.fragment ) this.instance.fragment.destroyed();\n\t\t};\n\n\t\tComponent.prototype.detach = function detach () {\n\t\t\treturn this.instance.fragment.detach();\n\t\t};\n\n\t\tComponent.prototype.find = function find ( selector ) {\n\t\t\treturn this.instance.fragment.find( selector );\n\t\t};\n\n\t\tComponent.prototype.findAll = function findAll ( selector, query ) {\n\t\t\tthis.instance.fragment.findAll( selector, query );\n\t\t};\n\n\t\tComponent.prototype.findComponent = function findComponent ( name ) {\n\t\t\tif ( !name || this.name === name ) return this.instance;\n\n\t\t\tif ( this.instance.fragment ) {\n\t\t\t\treturn this.instance.fragment.findComponent( name );\n\t\t\t}\n\t\t};\n\n\t\tComponent.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\t\tif ( query.test( this ) ) {\n\t\t\t\tquery.add( this.instance );\n\n\t\t\t\tif ( query.live ) {\n\t\t\t\t\tthis.liveQueries.push( query );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.instance.fragment.findAllComponents( name, query );\n\t\t};\n\n\t\tComponent.prototype.firstNode = function firstNode ( skipParent ) {\n\t\t\treturn this.instance.fragment.firstNode( skipParent );\n\t\t};\n\n\t\tComponent.prototype.render = function render$1$$ ( target, occupants ) {\n\t\t\trender$1( this.instance, target, null, occupants );\n\n\t\t\tthis.checkYielders();\n\t\t\tthis.attributes.forEach( render );\n\t\t\tthis.eventHandlers.forEach( render );\n\t\t\tupdateLiveQueries( this );\n\n\t\t\tthis.rendered = true;\n\t\t};\n\n\t\tComponent.prototype.setupEvents = function setupEvents () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar handlers = this.eventHandlers;\n\n\t\t\tObject.keys( this.template.v ).forEach( function ( key ) {\n\t\t\t\tvar eventNames = key.split( '-' );\n\t\t\t\tvar template = this$1.template.v[ key ];\n\n\t\t\t\teventNames.forEach( function ( eventName ) {\n\t\t\t\t\tvar event = new RactiveEvent( this$1.instance, eventName );\n\t\t\t\t\thandlers.push( new EventDirective( this$1, event, template ) );\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tComponent.prototype.shuffled = function shuffled () {\n\t\t\tthis.liveQueries.forEach( makeDirty );\n\t\t\tItem.prototype.shuffled.call(this);\n\t\t};\n\n\t\tComponent.prototype.toString = function toString () {\n\t\t\treturn this.instance.toHTML();\n\t\t};\n\n\t\tComponent.prototype.unbind = function unbind$1 () {\n\t\t\tthis.bound = false;\n\n\t\t\tthis.attributes.forEach( unbind );\n\n\t\t\tvar instance = this.instance;\n\t\t\tinstance.viewmodel.teardown();\n\t\t\tinstance.fragment.unbind();\n\t\t\tinstance._observers.forEach( cancel );\n\n\t\t\tremoveFromLiveComponentQueries( this );\n\n\t\t\tif ( instance.el && instance.el.__ractive_instances__ ) {\n\t\t\t\tremoveFromArray( instance.el.__ractive_instances__, instance );\n\t\t\t}\n\n\t\t\tteardownHook.fire( instance );\n\t\t};\n\n\t\tComponent.prototype.unrender = function unrender$1 ( shouldDestroy ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.rendered = false;\n\n\t\t\tthis.shouldDestroy = shouldDestroy;\n\t\t\tthis.instance.unrender();\n\t\t\tthis.attributes.forEach( unrender );\n\t\t\tthis.eventHandlers.forEach( unrender );\n\t\t\tthis.liveQueries.forEach( function ( query ) { return query.remove( this$1.instance ); } );\n\t\t};\n\n\t\tComponent.prototype.update = function update$1 () {\n\t\t\tthis.dirty = false;\n\t\t\tthis.instance.fragment.update();\n\t\t\tthis.checkYielders();\n\t\t\tthis.attributes.forEach( update );\n\t\t\tthis.eventHandlers.forEach( update );\n\t\t};\n\n\t\treturn Component;\n\t}(Item));\n\n\tvar missingDecorator = {\n\t\tupdate: noop,\n\t\tteardown: noop\n\t};\n\n\tvar Decorator = function Decorator ( options ) {\n\t\tthis.owner = options.owner || options.parentFragment.owner || findElement( options.parentFragment );\n\t\tthis.element = this.owner.attributeByName ? this.owner : findElement( options.parentFragment );\n\t\tthis.parentFragment = this.owner.parentFragment;\n\t\tthis.ractive = this.owner.ractive;\n\t\tvar template = this.template = options.template;\n\n\t\tthis.dynamicName = typeof template.f.n === 'object';\n\t\tthis.dynamicArgs = !!template.f.d;\n\n\t\tif ( this.dynamicName ) {\n\t\t\tthis.nameFragment = new Fragment({\n\t\t\t\towner: this,\n\t\t\t\ttemplate: template.f.n\n\t\t\t});\n\t\t} else {\n\t\t\tthis.name = template.f.n || template.f;\n\t\t}\n\n\t\tif ( this.dynamicArgs ) {\n\t\t\tthis.argsFragment = new Fragment({\n\t\t\t\towner: this,\n\t\t\t\ttemplate: template.f.d\n\t\t\t});\n\t\t} else {\n\t\t\tif ( template.f.a && template.f.a.s ) {\n\t\t\t\tthis.args = [];\n\t\t\t} else {\n\t\t\t\tthis.args = template.f.a || [];\n\t\t\t}\n\t\t}\n\n\t\tthis.node = null;\n\t\tthis.intermediary = null;\n\n\t\tthis.element.decorators.push( this );\n\t};\n\n\tDecorator.prototype.bind = function bind () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.dynamicName ) {\n\t\t\tthis.nameFragment.bind();\n\t\t\tthis.name = this.nameFragment.toString();\n\t\t}\n\n\t\tif ( this.dynamicArgs ) this.argsFragment.bind();\n\n\t\t// TODO: dry this up once deprecation is done\n\t\tif ( this.template.f.a && this.template.f.a.s ) {\n\t\t\tthis.resolvers = [];\n\t\t\tthis.models = this.template.f.a.r.map( function ( ref, i ) {\n\t\t\t\tvar resolver;\n\t\t\t\tvar model = resolveReference( this$1.parentFragment, ref );\n\t\t\t\tif ( !model ) {\n\t\t\t\t\tresolver = this$1.parentFragment.resolve( ref, function ( model ) {\n\t\t\t\t\t\tthis$1.models[i] = model;\n\t\t\t\t\t\tremoveFromArray( this$1.resolvers, resolver );\n\t\t\t\t\t\tmodel.register( this$1 );\n\t\t\t\t\t});\n\n\t\t\t\t\tthis$1.resolvers.push( resolver );\n\t\t\t\t} else model.register( this$1 );\n\n\t\t\t\treturn model;\n\t\t\t});\n\t\t\tthis.argsFn = getFunction( this.template.f.a.s, this.template.f.a.r.length );\n\t\t}\n\t};\n\n\tDecorator.prototype.bubble = function bubble () {\n\t\tif ( !this.dirty ) {\n\t\t\tthis.dirty = true;\n\t\t\tthis.owner.bubble();\n\t\t}\n\t};\n\n\tDecorator.prototype.destroyed = function destroyed () {\n\t\tif ( this.intermediary ) this.intermediary.teardown();\n\t\tthis.shouldDestroy = true;\n\t};\n\n\tDecorator.prototype.handleChange = function handleChange () { this.bubble(); };\n\n\tDecorator.prototype.rebinding = function rebinding ( next, previous, safe ) {\n\t\tvar idx = this.models.indexOf( previous );\n\t\tif ( !~idx ) return;\n\n\t\tnext = rebindMatch( this.template.f.a.r[ idx ], next, previous );\n\t\tif ( next === previous ) return;\n\n\t\tprevious.unregister( this );\n\t\tthis.models.splice( idx, 1, next );\n\t\tif ( next ) next.addShuffleRegister( this, 'mark' );\n\n\t\tif ( !safe ) this.bubble();\n\t};\n\n\tDecorator.prototype.render = function render () {\n\t\tvar this$1 = this;\n\n\t\t\trunloop.scheduleTask( function () {\n\t\t\tvar fn = findInViewHierarchy( 'decorators', this$1.ractive, this$1.name );\n\n\t\t\tif ( !fn ) {\n\t\t\t\twarnOnce( missingPlugin( this$1.name, 'decorator' ) );\n\t\t\t\tthis$1.intermediary = missingDecorator;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis$1.node = this$1.element.node;\n\n\t\t\tvar args;\n\t\t\tif ( this$1.argsFn ) {\n\t\t\t\targs = this$1.models.map( function ( model ) {\n\t\t\t\t\tif ( !model ) return undefined;\n\n\t\t\t\t\treturn model.get();\n\t\t\t\t});\n\t\t\t\targs = this$1.argsFn.apply( this$1.ractive, args );\n\t\t\t} else {\n\t\t\t\targs = this$1.dynamicArgs ? this$1.argsFragment.getArgsList() : this$1.args;\n\t\t\t}\n\n\t\t\tthis$1.intermediary = fn.apply( this$1.ractive, [ this$1.node ].concat( args ) );\n\n\t\t\tif ( !this$1.intermediary || !this$1.intermediary.teardown ) {\n\t\t\t\tthrow new Error( (\"The '\" + (this$1.name) + \"' decorator must return an object with a teardown method\") );\n\t\t\t}\n\n\t\t\t// watch out for decorators that cause their host element to be unrendered\n\t\t\tif ( this$1.shouldDestroy ) this$1.destroyed();\n\t\t}, true );\n\t\tthis.rendered = true;\n\t};\n\n\tDecorator.prototype.toString = function toString () { return ''; };\n\n\tDecorator.prototype.unbind = function unbind$1 () {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.dynamicName ) this.nameFragment.unbind();\n\t\tif ( this.dynamicArgs ) this.argsFragment.unbind();\n\t\tif ( this.resolvers ) this.resolvers.forEach( unbind );\n\t\tif ( this.models ) this.models.forEach( function ( m ) {\n\t\t\tif ( m ) m.unregister( this$1 );\n\t\t});\n\t};\n\n\tDecorator.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\tif ( ( !shouldDestroy || this.element.rendered ) && this.intermediary ) this.intermediary.teardown();\n\t\tthis.rendered = false;\n\t};\n\n\tDecorator.prototype.update = function update () {\n\t\tif ( !this.dirty ) return;\n\n\t\tthis.dirty = false;\n\n\t\tvar nameChanged = false;\n\n\t\tif ( this.dynamicName && this.nameFragment.dirty ) {\n\t\t\tvar name = this.nameFragment.toString();\n\t\t\tnameChanged = name !== this.name;\n\t\t\tthis.name = name;\n\t\t}\n\n\t\tif ( this.intermediary ) {\n\t\t\tif ( nameChanged || !this.intermediary.update ) {\n\t\t\t\tthis.unrender();\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( this.dynamicArgs ) {\n\t\t\t\t\tif ( this.argsFragment.dirty ) {\n\t\t\t\t\t\tvar args = this.argsFragment.getArgsList();\n\t\t\t\t\t\tthis.intermediary.update.apply( this.ractive, args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( this.argsFn ) {\n\t\t\t\t\tvar args$1 = this.models.map( function ( model ) {\n\t\t\t\t\t\tif ( !model ) return undefined;\n\n\t\t\t\t\t\treturn model.get();\n\t\t\t\t\t});\n\t\t\t\t\tthis.intermediary.update.apply( this.ractive, this.argsFn.apply( this.ractive, args$1 ) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.intermediary.update.apply( this.ractive, this.args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// need to run these for unrender/render cases\n\t\t// so can't just be in conditional if above\n\n\t\tif ( this.dynamicName && this.nameFragment.dirty ) {\n\t\t\tthis.nameFragment.update();\n\t\t}\n\n\t\tif ( this.dynamicArgs && this.argsFragment.dirty ) {\n\t\t\tthis.argsFragment.update();\n\t\t}\n\t};\n\n\tvar Doctype = (function (Item) {\n\t\tfunction Doctype () {\n\t\t\tItem.apply(this, arguments);\n\t\t}\n\n\t\tDoctype.prototype = Object.create( Item && Item.prototype );\n\t\tDoctype.prototype.constructor = Doctype;\n\n\t\tDoctype.prototype.bind = function bind () {\n\t\t\t// noop\n\t\t};\n\n\t\tDoctype.prototype.render = function render () {\n\t\t\t// noop\n\t\t};\n\n\t\tDoctype.prototype.teardown = function teardown () {\n\t\t\t// noop\n\t\t};\n\n\t\tDoctype.prototype.toString = function toString () {\n\t\t\treturn '<!DOCTYPE' + this.template.a + '>';\n\t\t};\n\n\t\tDoctype.prototype.unbind = function unbind () {\n\t\t\t// noop\n\t\t};\n\n\t\tDoctype.prototype.unrender = function unrender () {\n\t\t\t// noop\n\t\t};\n\n\t\tDoctype.prototype.update = function update () {\n\t\t\t// noop\n\t\t};\n\n\t\treturn Doctype;\n\t}(Item));\n\n\tfunction updateLiveQueries$1 ( element ) {\n\t\t// Does this need to be added to any live queries?\n\t\tvar node = element.node;\n\t\tvar instance = element.ractive;\n\n\t\tdo {\n\t\t\tvar liveQueries = instance._liveQueries;\n\n\t\t\tvar i = liveQueries.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar selector = liveQueries[i];\n\t\t\t\tvar query = liveQueries[ (\"_\" + selector) ];\n\n\t\t\t\tif ( query.test( node ) ) {\n\t\t\t\t\tquery.add( node );\n\t\t\t\t\t// keep register of applicable selectors, for when we teardown\n\t\t\t\t\telement.liveQueries.push( query );\n\t\t\t\t}\n\t\t\t}\n\t\t} while ( instance = instance.parent );\n\t}\n\n\tfunction warnAboutAmbiguity ( description, ractive ) {\n\t\twarnOnceIfDebug( (\"The \" + description + \" being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity\"), { ractive: ractive });\n\t}\n\n\tvar Binding = function Binding ( element, name ) {\n\t\tif ( name === void 0 ) name = 'value';\n\n\t\t\tthis.element = element;\n\t\tthis.ractive = element.ractive;\n\t\tthis.attribute = element.attributeByName[ name ];\n\n\t\tvar interpolator = this.attribute.interpolator;\n\t\tinterpolator.twowayBinding = this;\n\n\t\tvar model = interpolator.model;\n\n\t\t// not bound?\n\t\tif ( !model ) {\n\t\t\t// try to force resolution\n\t\t\tinterpolator.resolver.forceResolution();\n\t\t\tmodel = interpolator.model;\n\n\t\t\twarnAboutAmbiguity( (\"'\" + (interpolator.template.r) + \"' reference\"), this.ractive );\n\t\t\t}\n\n\t\t\telse if ( model.isUnresolved ) {\n\t\t\t\t// reference expressions (e.g. foo[bar])\n\t\t\t\tmodel.forceResolution();\n\t\t\t\twarnAboutAmbiguity( 'expression', this.ractive );\n\t\t}\n\n\t\t// TODO include index/key/keypath refs as read-only\n\t\telse if ( model.isReadonly ) {\n\t\t\tvar keypath = model.getKeypath().replace( /^@/, '' );\n\t\t\twarnOnceIfDebug( (\"Cannot use two-way binding on <\" + (element.name) + \"> element: \" + keypath + \" is read-only. To suppress this warning use <\" + (element.name) + \" twoway='false'...>\"), { ractive: this.ractive });\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.attribute.isTwoway = true;\n\t\tthis.model = model;\n\n\t\t// initialise value, if it's undefined\n\t\tvar value = model.get();\n\t\tthis.wasUndefined = value === undefined;\n\n\t\tif ( value === undefined && this.getInitialValue ) {\n\t\t\tvalue = this.getInitialValue();\n\t\t\tmodel.set( value );\n\t\t}\n\t\tthis.lastVal( true, value );\n\n\t\tvar parentForm = findElement( this.element, false, 'form' );\n\t\tif ( parentForm ) {\n\t\t\tthis.resetValue = value;\n\t\t\tparentForm.formBindings.push( this );\n\t\t}\n\t};\n\n\tBinding.prototype.bind = function bind () {\n\t\tthis.model.registerTwowayBinding( this );\n\t};\n\n\tBinding.prototype.handleChange = function handleChange () {\n\t\tvar this$1 = this;\n\n\t\t\tvar value = this.getValue();\n\t\tif ( this.lastVal() === value ) return;\n\n\t\trunloop.start( this.root );\n\t\tthis.attribute.locked = true;\n\t\tthis.model.set( value );\n\t\tthis.lastVal( true, value );\n\n\t\t// if the value changes before observers fire, unlock to be updatable cause something weird and potentially freezy is up\n\t\tif ( this.model.get() !== value ) this.attribute.locked = false;\n\t\telse runloop.scheduleTask( function () { return this$1.attribute.locked = false; } );\n\n\t\trunloop.end();\n\t};\n\n\tBinding.prototype.lastVal = function lastVal ( setting, value ) {\n\t\tif ( setting ) this.lastValue = value;\n\t\telse return this.lastValue;\n\t};\n\n\tBinding.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.model && this.model === previous ) previous.unregisterTwowayBinding( this );\n\t\tif ( next ) {\n\t\t\tthis.model = next;\n\t\t\trunloop.scheduleTask( function () { return next.registerTwowayBinding( this$1 ); } );\n\t\t}\n\t};\n\n\tBinding.prototype.render = function render () {\n\t\tthis.node = this.element.node;\n\t\tthis.node._ractive.binding = this;\n\t\tthis.rendered = true; // TODO is this used anywhere?\n\t};\n\n\t\tBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tthis.model.set( node.value );\n\t};\n\n\tBinding.prototype.unbind = function unbind () {\n\t\tthis.model.unregisterTwowayBinding( this );\n\t};\n\n\tBinding.prototype.unrender = function unrender () {\n\t\t\t// noop?\n\t\t};\n\n\t// This is the handler for DOM events that would lead to a change in the model\n\t// (i.e. change, sometimes, input, and occasionally click and keyup)\n\tfunction handleDomEvent () {\n\t\tthis._ractive.binding.handleChange();\n\t}\n\n\tvar CheckboxBinding = (function (Binding) {\n\t\tfunction CheckboxBinding ( element ) {\n\t\t\tBinding.call( this, element, 'checked' );\n\t\t}\n\n\t\tCheckboxBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tCheckboxBinding.prototype.constructor = CheckboxBinding;\n\n\t\tCheckboxBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tthis.node.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\tif ( this.node.attachEvent ) {\n\t\t\t\tthis.node.addEventListener( 'click', handleDomEvent, false );\n\t\t\t}\n\t\t};\n\n\t\tCheckboxBinding.prototype.unrender = function unrender () {\n\t\t\tthis.node.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tthis.node.removeEventListener( 'click', handleDomEvent, false );\n\t\t};\n\n\t\tCheckboxBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn !!this.element.getAttribute( 'checked' );\n\t\t};\n\n\t\tCheckboxBinding.prototype.getValue = function getValue () {\n\t\t\treturn this.node.checked;\n\t\t};\n\n\t\tCheckboxBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tthis.model.set( node.checked );\n\t\t};\n\n\t\treturn CheckboxBinding;\n\t}(Binding));\n\n\tfunction getBindingGroup ( group, model, getValue ) {\n\t\tvar hash = \"\" + group + \"-bindingGroup\";\n\t\treturn model[hash] || ( model[ hash ] = new BindingGroup( hash, model, getValue ) );\n\t}\n\n\tvar BindingGroup = function BindingGroup ( hash, model, getValue ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.model = model;\n\t\tthis.hash = hash;\n\t\tthis.getValue = function () {\n\t\t\tthis$1.value = getValue.call(this$1);\n\t\t\treturn this$1.value;\n\t\t};\n\n\t\tthis.bindings = [];\n\t};\n\n\tBindingGroup.prototype.add = function add ( binding ) {\n\t\tthis.bindings.push( binding );\n\t};\n\n\tBindingGroup.prototype.bind = function bind () {\n\t\tthis.value = this.model.get();\n\t\tthis.model.registerTwowayBinding( this );\n\t\tthis.bound = true;\n\t};\n\n\t\tBindingGroup.prototype.remove = function remove ( binding ) {\n\t\tremoveFromArray( this.bindings, binding );\n\t\tif ( !this.bindings.length ) {\n\t\t\tthis.unbind();\n\t\t}\n\t};\n\n\tBindingGroup.prototype.unbind = function unbind () {\n\t\tthis.model.unregisterTwowayBinding( this );\n\t\tthis.bound = false;\n\t\tdelete this.model[this.hash];\n\t};\n\n\tBindingGroup.prototype.rebinding = Binding.prototype.rebinding;\n\n\tvar push$2 = [].push;\n\n\tfunction getValue() {\n\t\tvar all = this.bindings.filter(function ( b ) { return b.node && b.node.checked; }).map(function ( b ) { return b.element.getAttribute( 'value' ); });\n\t\tvar res = [];\n\t\tall.forEach(function ( v ) { if ( !arrayContains( res, v ) ) res.push( v ); });\n\t\treturn res;\n\t}\n\n\tvar CheckboxNameBinding = (function (Binding) {\n\t\tfunction CheckboxNameBinding ( element ) {\n\t\t\tBinding.call( this, element, 'name' );\n\n\t\t\tthis.checkboxName = true; // so that ractive.updateModel() knows what to do with this\n\n\t\t\t// Each input has a reference to an array containing it and its\n\t\t\t// group, as two-way binding depends on being able to ascertain\n\t\t\t// the status of all inputs within the group\n\t\t\tthis.group = getBindingGroup( 'checkboxes', this.model, getValue );\n\t\t\tthis.group.add( this );\n\n\t\t\tif ( this.noInitialValue ) {\n\t\t\t\tthis.group.noInitialValue = true;\n\t\t\t}\n\n\t\t\t// If no initial value was set, and this input is checked, we\n\t\t\t// update the model\n\t\t\tif ( this.group.noInitialValue && this.element.getAttribute( 'checked' ) ) {\n\t\t\t\tvar existingValue = this.model.get();\n\t\t\t\tvar bindingValue = this.element.getAttribute( 'value' );\n\n\t\t\t\tif ( !arrayContains( existingValue, bindingValue ) ) {\n\t\t\t\t\tpush$2.call( existingValue, bindingValue ); // to avoid triggering runloop with array adaptor\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tCheckboxNameBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tCheckboxNameBinding.prototype.constructor = CheckboxNameBinding;\n\n\t\tCheckboxNameBinding.prototype.bind = function bind () {\n\t\t\tif ( !this.group.bound ) {\n\t\t\t\tthis.group.bind();\n\t\t\t}\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.changed = function changed () {\n\t\t\tvar wasChecked = !!this.isChecked;\n\t\t\tthis.isChecked = this.node.checked;\n\t\t\treturn this.isChecked === wasChecked;\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\t// This only gets called once per group (of inputs that\n\t\t\t// share a name), because it only gets called if there\n\t\t\t// isn't an initial value. By the same token, we can make\n\t\t\t// a note of that fact that there was no initial value,\n\t\t\t// and populate it using any `checked` attributes that\n\t\t\t// exist (which users should avoid, but which we should\n\t\t\t// support anyway to avoid breaking expectations)\n\t\t\tthis.noInitialValue = true; // TODO are noInitialValue and wasUndefined the same thing?\n\t\t\treturn [];\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.getValue = function getValue$1 () {\n\t\t\treturn this.group.value;\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.handleChange = function handleChange () {\n\t\t\tthis.isChecked = this.element.node.checked;\n\t\t\tthis.group.value = this.model.get();\n\t\t\tvar value = this.element.getAttribute( 'value' );\n\t\t\tif ( this.isChecked && !arrayContains( this.group.value, value ) ) {\n\t\t\t\tthis.group.value.push( value );\n\t\t\t} else if ( !this.isChecked && arrayContains( this.group.value, value ) ) {\n\t\t\t\tremoveFromArray( this.group.value, value );\n\t\t\t}\n\t\t\t// make sure super knows there's a change\n\t\t\tthis.lastValue = null;\n\t\t\tBinding.prototype.handleChange.call(this);\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tvar node = this.node;\n\n\t\t\tvar existingValue = this.model.get();\n\t\t\tvar bindingValue = this.element.getAttribute( 'value' );\n\n\t\t\tif ( isArray( existingValue ) ) {\n\t\t\t\tthis.isChecked = arrayContains( existingValue, bindingValue );\n\t\t\t} else {\n\t\t\t\tthis.isChecked = existingValue == bindingValue;\n\t\t\t}\n\n\t\t\tnode.name = '{{' + this.model.getKeypath() + '}}';\n\t\t\tnode.checked = this.isChecked;\n\n\t\t\tnode.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\t// in case of IE emergency, bind to click event as well\n\t\t\tif ( node.attachEvent ) {\n\t\t\t\tnode.addEventListener( 'click', handleDomEvent, false );\n\t\t\t}\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tthis.group.bindings.forEach( function ( binding ) { return binding.wasUndefined = true; } );\n\n\t\t\tif ( node.checked ) {\n\t\t\t\tvar valueSoFar = this.group.getValue();\n\t\t\t\tvalueSoFar.push( this.element.getAttribute( 'value' ) );\n\n\t\t\t\tthis.group.model.set( valueSoFar );\n\t\t\t}\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.unbind = function unbind () {\n\t\t\tthis.group.remove( this );\n\t\t};\n\n\t\tCheckboxNameBinding.prototype.unrender = function unrender () {\n\t\t\tvar node = this.element.node;\n\n\t\t\tnode.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'click', handleDomEvent, false );\n\t\t};\n\n\t\treturn CheckboxNameBinding;\n\t}(Binding));\n\n\tvar ContentEditableBinding = (function (Binding) {\n\t\tfunction ContentEditableBinding () {\n\t\t\tBinding.apply(this, arguments);\n\t\t}\n\n\t\tContentEditableBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tContentEditableBinding.prototype.constructor = ContentEditableBinding;\n\n\t\tContentEditableBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn this.element.fragment ? this.element.fragment.toString() : '';\n\t\t};\n\n\t\tContentEditableBinding.prototype.getValue = function getValue () {\n\t\t\treturn this.element.node.innerHTML;\n\t\t};\n\n\t\tContentEditableBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tvar node = this.node;\n\n\t\t\tnode.addEventListener( 'change', handleDomEvent, false );\n\t\t\tnode.addEventListener( 'blur', handleDomEvent, false );\n\n\t\t\tif ( !this.ractive.lazy ) {\n\t\t\t\tnode.addEventListener( 'input', handleDomEvent, false );\n\n\t\t\t\tif ( node.attachEvent ) {\n\t\t\t\t\tnode.addEventListener( 'keyup', handleDomEvent, false );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tContentEditableBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tthis.model.set( node.innerHTML );\n\t\t};\n\n\t\tContentEditableBinding.prototype.unrender = function unrender () {\n\t\t\tvar node = this.node;\n\n\t\t\tnode.removeEventListener( 'blur', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'input', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'keyup', handleDomEvent, false );\n\t\t};\n\n\t\treturn ContentEditableBinding;\n\t}(Binding));\n\n\tfunction handleBlur () {\n\t\thandleDomEvent.call( this );\n\n\t\tvar value = this._ractive.binding.model.get();\n\t\tthis.value = value == undefined ? '' : value;\n\t}\n\n\tfunction handleDelay ( delay ) {\n\t\tvar timeout;\n\n\t\treturn function () {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( timeout ) clearTimeout( timeout );\n\n\t\t\ttimeout = setTimeout( function () {\n\t\t\t\tvar binding = this$1._ractive.binding;\n\t\t\t\tif ( binding.rendered ) handleDomEvent.call( this$1 );\n\t\t\t\ttimeout = null;\n\t\t\t}, delay );\n\t\t};\n\t}\n\n\tvar GenericBinding = (function (Binding) {\n\t\tfunction GenericBinding () {\n\t\t\tBinding.apply(this, arguments);\n\t\t}\n\n\t\tGenericBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tGenericBinding.prototype.constructor = GenericBinding;\n\n\t\tGenericBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn '';\n\t\t};\n\n\t\tGenericBinding.prototype.getValue = function getValue () {\n\t\t\treturn this.node.value;\n\t\t};\n\n\t\tGenericBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\t// any lazy setting for this element overrides the root\n\t\t\t// if the value is a number, it's a timeout\n\t\t\tvar lazy = this.ractive.lazy;\n\t\t\tvar timeout = false;\n\n\t\t\tif ( 'lazy' in this.element ) {\n\t\t\t\tlazy = this.element.lazy;\n\t\t\t}\n\n\t\t\tif ( isNumeric( lazy ) ) {\n\t\t\t\ttimeout = +lazy;\n\t\t\t\tlazy = false;\n\t\t\t}\n\n\t\t\tthis.handler = timeout ? handleDelay( timeout ) : handleDomEvent;\n\n\t\t\tvar node = this.node;\n\n\t\t\tnode.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\tif ( !lazy ) {\n\t\t\t\tnode.addEventListener( 'input', this.handler, false );\n\n\t\t\t\tif ( node.attachEvent ) {\n\t\t\t\t\tnode.addEventListener( 'keyup', this.handler, false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnode.addEventListener( 'blur', handleBlur, false );\n\t\t};\n\n\t\tGenericBinding.prototype.unrender = function unrender () {\n\t\t\tvar node = this.element.node;\n\t\t\tthis.rendered = false;\n\n\t\t\tnode.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'input', this.handler, false );\n\t\t\tnode.removeEventListener( 'keyup', this.handler, false );\n\t\t\tnode.removeEventListener( 'blur', handleBlur, false );\n\t\t};\n\n\t\treturn GenericBinding;\n\t}(Binding));\n\n\tvar FileBinding = (function (GenericBinding) {\n\t\tfunction FileBinding () {\n\t\t\tGenericBinding.apply(this, arguments);\n\t\t}\n\n\t\tFileBinding.prototype = Object.create( GenericBinding && GenericBinding.prototype );\n\t\tFileBinding.prototype.constructor = FileBinding;\n\n\t\tFileBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn undefined;\n\t\t};\n\n\t\tFileBinding.prototype.getValue = function getValue () {\n\t\t\treturn this.node.files;\n\t\t};\n\n\t\tFileBinding.prototype.render = function render () {\n\t\t\tthis.element.lazy = false;\n\t\t\tGenericBinding.prototype.render.call(this);\n\t\t};\n\n\t\tFileBinding.prototype.setFromNode = function setFromNode( node ) {\n\t\t\tthis.model.set( node.files );\n\t\t};\n\n\t\treturn FileBinding;\n\t}(GenericBinding));\n\n\tfunction getSelectedOptions ( select ) {\n\t    return select.selectedOptions\n\t\t\t? toArray( select.selectedOptions )\n\t\t\t: select.options\n\t\t\t\t? toArray( select.options ).filter( function ( option ) { return option.selected; } )\n\t\t\t\t: [];\n\t}\n\n\tvar MultipleSelectBinding = (function (Binding) {\n\t\tfunction MultipleSelectBinding () {\n\t\t\tBinding.apply(this, arguments);\n\t\t}\n\n\t\tMultipleSelectBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tMultipleSelectBinding.prototype.constructor = MultipleSelectBinding;\n\n\t\tMultipleSelectBinding.prototype.forceUpdate = function forceUpdate () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar value = this.getValue();\n\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tthis.attribute.locked = true;\n\t\t\t\trunloop.scheduleTask( function () { return this$1.attribute.locked = false; } );\n\t\t\t\tthis.model.set( value );\n\t\t\t}\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn this.element.options\n\t\t\t\t.filter( function ( option ) { return option.getAttribute( 'selected' ); } )\n\t\t\t\t.map( function ( option ) { return option.getAttribute( 'value' ); } );\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.getValue = function getValue () {\n\t\t\tvar options = this.element.node.options;\n\t\t\tvar len = options.length;\n\n\t\t\tvar selectedValues = [];\n\n\t\t\tfor ( var i = 0; i < len; i += 1 ) {\n\t\t\t\tvar option = options[i];\n\n\t\t\t\tif ( option.selected ) {\n\t\t\t\t\tvar optionValue = option._ractive ? option._ractive.value : option.value;\n\t\t\t\t\tselectedValues.push( optionValue );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn selectedValues;\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.handleChange = function handleChange () {\n\t\t\tvar attribute = this.attribute;\n\t\t\tvar previousValue = attribute.getValue();\n\n\t\t\tvar value = this.getValue();\n\n\t\t\tif ( previousValue === undefined || !arrayContentsMatch( value, previousValue ) ) {\n\t\t\t\tBinding.prototype.handleChange.call(this);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tthis.node.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\tif ( this.model.get() === undefined ) {\n\t\t\t\t// get value from DOM, if possible\n\t\t\t\tthis.handleChange();\n\t\t\t}\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tvar selectedOptions = getSelectedOptions( node );\n\t\t\tvar i = selectedOptions.length;\n\t\t\tvar result = new Array( i );\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar option = selectedOptions[i];\n\t\t\t\tresult[i] = option._ractive ? option._ractive.value : option.value;\n\t\t\t}\n\n\t\t\tthis.model.set( result );\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.setValue = function setValue () {\n\t\t\tthrow new Error( 'TODO not implemented yet' );\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.unrender = function unrender () {\n\t\t\tthis.node.removeEventListener( 'change', handleDomEvent, false );\n\t\t};\n\n\t\tMultipleSelectBinding.prototype.updateModel = function updateModel () {\n\t\t\tif ( this.attribute.value === undefined || !this.attribute.value.length ) {\n\t\t\t\tthis.keypath.set( this.initialValue );\n\t\t\t}\n\t\t};\n\n\t\treturn MultipleSelectBinding;\n\t}(Binding));\n\n\tvar NumericBinding = (function (GenericBinding) {\n\t\tfunction NumericBinding () {\n\t\t\tGenericBinding.apply(this, arguments);\n\t\t}\n\n\t\tNumericBinding.prototype = Object.create( GenericBinding && GenericBinding.prototype );\n\t\tNumericBinding.prototype.constructor = NumericBinding;\n\n\t\tNumericBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\treturn undefined;\n\t\t};\n\n\t\tNumericBinding.prototype.getValue = function getValue () {\n\t\t\tvar value = parseFloat( this.node.value );\n\t\t\treturn isNaN( value ) ? undefined : value;\n\t\t};\n\n\t\tNumericBinding.prototype.setFromNode = function setFromNode( node ) {\n\t\t\tvar value = parseFloat( node.value );\n\t\t\tif ( !isNaN( value ) ) this.model.set( value );\n\t\t};\n\n\t\treturn NumericBinding;\n\t}(GenericBinding));\n\n\tvar siblings = {};\n\n\tfunction getSiblings ( hash ) {\n\t\treturn siblings[ hash ] || ( siblings[ hash ] = [] );\n\t}\n\n\tvar RadioBinding = (function (Binding) {\n\t\tfunction RadioBinding ( element ) {\n\t\t\tBinding.call( this, element, 'checked' );\n\n\t\t\tthis.siblings = getSiblings( this.ractive._guid + this.element.getAttribute( 'name' ) );\n\t\t\tthis.siblings.push( this );\n\t\t}\n\n\t\tRadioBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tRadioBinding.prototype.constructor = RadioBinding;\n\n\t\tRadioBinding.prototype.getValue = function getValue () {\n\t\t\treturn this.node.checked;\n\t\t};\n\n\t\tRadioBinding.prototype.handleChange = function handleChange () {\n\t\t\trunloop.start( this.root );\n\n\t\t\tthis.siblings.forEach( function ( binding ) {\n\t\t\t\tbinding.model.set( binding.getValue() );\n\t\t\t});\n\n\t\t\trunloop.end();\n\t\t};\n\n\t\tRadioBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tthis.node.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\tif ( this.node.attachEvent ) {\n\t\t\t\tthis.node.addEventListener( 'click', handleDomEvent, false );\n\t\t\t}\n\t\t};\n\n\t\tRadioBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tthis.model.set( node.checked );\n\t\t};\n\n\t\tRadioBinding.prototype.unbind = function unbind () {\n\t\t\tremoveFromArray( this.siblings, this );\n\t\t};\n\n\t\tRadioBinding.prototype.unrender = function unrender () {\n\t\t\tthis.node.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tthis.node.removeEventListener( 'click', handleDomEvent, false );\n\t\t};\n\n\t\treturn RadioBinding;\n\t}(Binding));\n\n\tfunction getValue$1() {\n\t\tvar checked = this.bindings.filter( function ( b ) { return b.node.checked; } );\n\t\tif ( checked.length > 0 ) {\n\t\t\treturn checked[0].element.getAttribute( 'value' );\n\t\t}\n\t}\n\n\tvar RadioNameBinding = (function (Binding) {\n\t\tfunction RadioNameBinding ( element ) {\n\t\t\tBinding.call( this, element, 'name' );\n\n\t\t\tthis.group = getBindingGroup( 'radioname', this.model, getValue$1 );\n\t\t\tthis.group.add( this );\n\n\t\t\tif ( element.checked ) {\n\t\t\t\tthis.group.value = this.getValue();\n\t\t\t}\n\t\t}\n\n\t\tRadioNameBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tRadioNameBinding.prototype.constructor = RadioNameBinding;\n\n\t\tRadioNameBinding.prototype.bind = function bind () {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( !this.group.bound ) {\n\t\t\t\tthis.group.bind();\n\t\t\t}\n\n\t\t\t// update name keypath when necessary\n\t\t\tthis.nameAttributeBinding = {\n\t\t\t\thandleChange: function () { return this$1.node.name = \"{{\" + (this$1.model.getKeypath()) + \"}}\"; },\n\t\t\t\trebinding: noop\n\t\t\t};\n\n\t\t\tthis.model.getKeypathModel().register( this.nameAttributeBinding );\n\t\t};\n\n\t\tRadioNameBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\tif ( this.element.getAttribute( 'checked' ) ) {\n\t\t\t\treturn this.element.getAttribute( 'value' );\n\t\t\t}\n\t\t};\n\n\t\tRadioNameBinding.prototype.getValue = function getValue$1 () {\n\t\t\treturn this.element.getAttribute( 'value' );\n\t\t};\n\n\t\tRadioNameBinding.prototype.handleChange = function handleChange () {\n\t\t\t// If this <input> is the one that's checked, then the value of its\n\t\t\t// `name` model gets set to its value\n\t\t\tif ( this.node.checked ) {\n\t\t\t\tthis.group.value = this.getValue();\n\t\t\t\tBinding.prototype.handleChange.call(this);\n\t\t\t}\n\t\t};\n\n\t\tRadioNameBinding.prototype.lastVal = function lastVal ( setting, value ) {\n\t\t\tif ( !this.group ) return;\n\t\t\tif ( setting ) this.group.lastValue = value;\n\t\t\telse return this.group.lastValue;\n\t\t};\n\n\t\tRadioNameBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\n\t\t\tvar node = this.node;\n\n\t\t\tnode.name = \"{{\" + (this.model.getKeypath()) + \"}}\";\n\t\t\tnode.checked = this.model.get() == this.element.getAttribute( 'value' );\n\n\t\t\tnode.addEventListener( 'change', handleDomEvent, false );\n\n\t\t\tif ( node.attachEvent ) {\n\t\t\t\tnode.addEventListener( 'click', handleDomEvent, false );\n\t\t\t}\n\t\t};\n\n\t\tRadioNameBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tif ( node.checked ) {\n\t\t\t\tthis.group.model.set( this.element.getAttribute( 'value' ) );\n\t\t\t}\n\t\t};\n\n\t\tRadioNameBinding.prototype.unbind = function unbind () {\n\t\t\tthis.group.remove( this );\n\n\t\t\tthis.model.getKeypathModel().unregister( this.nameAttributeBinding );\n\t\t};\n\n\t\tRadioNameBinding.prototype.unrender = function unrender () {\n\t\t\tvar node = this.node;\n\n\t\t\tnode.removeEventListener( 'change', handleDomEvent, false );\n\t\t\tnode.removeEventListener( 'click', handleDomEvent, false );\n\t\t};\n\n\t\treturn RadioNameBinding;\n\t}(Binding));\n\n\tvar SingleSelectBinding = (function (Binding) {\n\t\tfunction SingleSelectBinding () {\n\t\t\tBinding.apply(this, arguments);\n\t\t}\n\n\t\tSingleSelectBinding.prototype = Object.create( Binding && Binding.prototype );\n\t\tSingleSelectBinding.prototype.constructor = SingleSelectBinding;\n\n\t\tSingleSelectBinding.prototype.forceUpdate = function forceUpdate () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar value = this.getValue();\n\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tthis.attribute.locked = true;\n\t\t\t\trunloop.scheduleTask( function () { return this$1.attribute.locked = false; } );\n\t\t\t\tthis.model.set( value );\n\t\t\t}\n\t\t};\n\n\t\tSingleSelectBinding.prototype.getInitialValue = function getInitialValue () {\n\t\t\tif ( this.element.getAttribute( 'value' ) !== undefined ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar options = this.element.options;\n\t\t\tvar len = options.length;\n\n\t\t\tif ( !len ) return;\n\n\t\t\tvar value;\n\t\t\tvar optionWasSelected;\n\t\t\tvar i = len;\n\n\t\t\t// take the final selected option...\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar option = options[i];\n\n\t\t\t\tif ( option.getAttribute( 'selected' ) ) {\n\t\t\t\t\tif ( !option.getAttribute( 'disabled' ) ) {\n\t\t\t\t\t\tvalue = option.getAttribute( 'value' );\n\t\t\t\t\t}\n\n\t\t\t\t\toptionWasSelected = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// or the first non-disabled option, if none are selected\n\t\t\tif ( !optionWasSelected ) {\n\t\t\t\twhile ( ++i < len ) {\n\t\t\t\t\tif ( !options[i].getAttribute( 'disabled' ) ) {\n\t\t\t\t\t\tvalue = options[i].getAttribute( 'value' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// This is an optimisation (aka hack) that allows us to forgo some\n\t\t\t// other more expensive work\n\t\t\t// TODO does it still work? seems at odds with new architecture\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tthis.element.attributeByName.value.value = value;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t};\n\n\t\tSingleSelectBinding.prototype.getValue = function getValue () {\n\t\t\tvar options = this.node.options;\n\t\t\tvar len = options.length;\n\n\t\t\tvar i;\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar option = options[i];\n\n\t\t\t\tif ( options[i].selected && !options[i].disabled ) {\n\t\t\t\t\treturn option._ractive ? option._ractive.value : option.value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tSingleSelectBinding.prototype.render = function render () {\n\t\t\tBinding.prototype.render.call(this);\n\t\t\tthis.node.addEventListener( 'change', handleDomEvent, false );\n\t\t};\n\n\t\tSingleSelectBinding.prototype.setFromNode = function setFromNode ( node ) {\n\t\t\tvar option = getSelectedOptions( node )[0];\n\t\t\tthis.model.set( option._ractive ? option._ractive.value : option.value );\n\t\t};\n\n\t\t// TODO this method is an anomaly... is it necessary?\n\t\tSingleSelectBinding.prototype.setValue = function setValue ( value ) {\n\t\t\tthis.model.set( value );\n\t\t};\n\n\t\tSingleSelectBinding.prototype.unrender = function unrender () {\n\t\t\tthis.node.removeEventListener( 'change', handleDomEvent, false );\n\t\t};\n\n\t\treturn SingleSelectBinding;\n\t}(Binding));\n\n\tfunction isBindable ( attribute ) {\n\t\treturn attribute &&\n\t\t\t   attribute.template.f &&\n\t\t       attribute.template.f.length === 1 &&\n\t\t       attribute.template.f[0].t === INTERPOLATOR &&\n\t\t       !attribute.template.f[0].s;\n\t}\n\n\tfunction selectBinding ( element ) {\n\t\tvar attributes = element.attributeByName;\n\n\t\t// contenteditable - bind if the contenteditable attribute is true\n\t\t// or is bindable and may thus become true...\n\t\tif ( element.getAttribute( 'contenteditable' ) || isBindable( attributes.contenteditable ) ) {\n\t\t\t// ...and this element also has a value attribute to bind\n\t\t\treturn isBindable( attributes.value ) ? ContentEditableBinding : null;\n\t\t}\n\n\t\t// <input>\n\t\tif ( element.name === 'input' ) {\n\t\t\tvar type = element.getAttribute( 'type' );\n\n\t\t\tif ( type === 'radio' || type === 'checkbox' ) {\n\t\t\t\tvar bindName = isBindable( attributes.name );\n\t\t\t\tvar bindChecked = isBindable( attributes.checked );\n\n\t\t\t\t// for radios we can either bind the name attribute, or the checked attribute - not both\n\t\t\t\tif ( bindName && bindChecked ) {\n\t\t\t\t\tif ( type === 'radio' ) {\n\t\t\t\t\t\twarnIfDebug( 'A radio input can have two-way binding on its name attribute, or its checked attribute - not both', { ractive: element.root });\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A checkbox with bindings for both name and checked - see https://github.com/ractivejs/ractive/issues/1749\n\t\t\t\t\t\treturn CheckboxBinding;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( bindName ) {\n\t\t\t\t\treturn type === 'radio' ? RadioNameBinding : CheckboxNameBinding;\n\t\t\t\t}\n\n\t\t\t\tif ( bindChecked ) {\n\t\t\t\t\treturn type === 'radio' ? RadioBinding : CheckboxBinding;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( type === 'file' && isBindable( attributes.value ) ) {\n\t\t\t\treturn FileBinding;\n\t\t\t}\n\n\t\t\tif ( isBindable( attributes.value ) ) {\n\t\t\t\treturn ( type === 'number' || type === 'range' ) ? NumericBinding : GenericBinding;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\t// <select>\n\t\tif ( element.name === 'select' && isBindable( attributes.value ) ) {\n\t\t\treturn element.getAttribute( 'multiple' ) ? MultipleSelectBinding : SingleSelectBinding;\n\t\t}\n\n\t\t// <textarea>\n\t\tif ( element.name === 'textarea' && isBindable( attributes.value ) ) {\n\t\t\treturn GenericBinding;\n\t\t}\n\t}\n\n\tfunction makeDirty$1 ( query ) {\n\t\tquery.makeDirty();\n\t}\n\n\tvar endsWithSemi = /;\\s*$/;\n\n\tvar Element = (function (Item) {\n\t\tfunction Element ( options ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.liveQueries = []; // TODO rare case. can we handle differently?\n\n\t\t\tthis.name = options.template.e.toLowerCase();\n\t\t\tthis.isVoid = voidElementNames.test( this.name );\n\n\t\t\t// find parent element\n\t\t\tthis.parent = findElement( this.parentFragment, false );\n\n\t\t\tif ( this.parent && this.parent.name === 'option' ) {\n\t\t\t\tthrow new Error( (\"An <option> element cannot contain other elements (encountered <\" + (this.name) + \">)\") );\n\t\t\t}\n\n\t\t\tthis.decorators = [];\n\n\t\t\t// create attributes\n\t\t\tthis.attributeByName = {};\n\n\t\t\tthis.attributes = [];\n\t\t\tvar leftovers = [];\n\t\t\t( this.template.m || [] ).forEach( function ( template ) {\n\t\t\t\tswitch ( template.t ) {\n\t\t\t\t\tcase ATTRIBUTE:\n\t\t\t\t\tcase BINDING_FLAG:\n\t\t\t\t\tcase DECORATOR:\n\t\t\t\t\tcase EVENT:\n\t\t\t\t\tcase TRANSITION:\n\t\t\t\t\t\tthis$1.attributes.push( createItem({\n\t\t\t\t\t\t\towner: this$1,\n\t\t\t\t\t\t\tparentFragment: this$1.parentFragment,\n\t\t\t\t\t\t\ttemplate: template\n\t\t\t\t\t\t}) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tleftovers.push( template );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif ( leftovers.length ) {\n\t\t\t\tthis.attributes.push( new ConditionalAttribute({\n\t\t\t\t\towner: this,\n\t\t\t\t\tparentFragment: this.parentFragment,\n\t\t\t\t\ttemplate: leftovers\n\t\t\t\t}) );\n\t\t\t}\n\n\t\t\tvar i = this.attributes.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar attr = this$1.attributes[ i ];\n\t\t\t\tif ( attr.name === 'type' ) this$1.attributes.unshift( this$1.attributes.splice( i, 1 )[ 0 ] );\n\t\t\t\telse if ( attr.name === 'max' ) this$1.attributes.unshift( this$1.attributes.splice( i, 1 )[ 0 ] );\n\t\t\t\telse if ( attr.name === 'min' ) this$1.attributes.unshift( this$1.attributes.splice( i, 1 )[ 0 ] );\n\t\t\t\telse if ( attr.name === 'class' ) this$1.attributes.unshift( this$1.attributes.splice( i, 1 )[ 0 ] );\n\t\t\t\telse if ( attr.name === 'value' ) {\n\t\t\t\t\tthis$1.attributes.push( this$1.attributes.splice( i, 1 )[ 0 ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// create children\n\t\t\tif ( options.template.f && !options.deferContent ) {\n\t\t\t\tthis.fragment = new Fragment({\n\t\t\t\t\ttemplate: options.template.f,\n\t\t\t\t\towner: this,\n\t\t\t\t\tcssIds: null\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.binding = null; // filled in later\n\t\t}\n\n\t\tElement.prototype = Object.create( Item && Item.prototype );\n\t\tElement.prototype.constructor = Element;\n\n\t\tElement.prototype.bind = function bind$1$$ () {\n\t\t\tthis.attributes.binding = true;\n\t\t\tthis.attributes.forEach( bind$1 );\n\t\t\tthis.attributes.binding = false;\n\n\t\t\tif ( this.fragment ) this.fragment.bind();\n\n\t\t\t// create two-way binding if necessary\n\t\t\tif ( !this.binding ) this.recreateTwowayBinding();\n\t\t};\n\n\t\tElement.prototype.createTwowayBinding = function createTwowayBinding () {\n\t\t\tvar shouldBind = 'twoway' in this ? this.twoway : this.ractive.twoway;\n\n\t\t\tif ( !shouldBind ) return null;\n\n\t\t\tvar Binding = selectBinding( this );\n\n\t\t\tif ( !Binding ) return null;\n\n\t\t\tvar binding = new Binding( this );\n\n\t\t\treturn binding && binding.model ?\n\t\t\t\tbinding :\n\t\t\t\tnull;\n\t\t};\n\n\t\tElement.prototype.destroyed = function destroyed () {\n\t\t\tthis.attributes.forEach( function ( a ) { return a.destroyed(); } );\n\t\t\tif ( this.fragment ) this.fragment.destroyed();\n\t\t};\n\n\t\tElement.prototype.detach = function detach () {\n\t\t\t// if this element is no longer rendered, the transitions are complete and the attributes can be torn down\n\t\t\tif ( !this.rendered ) this.destroyed();\n\n\t\t\treturn detachNode( this.node );\n\t\t};\n\n\t\tElement.prototype.find = function find ( selector ) {\n\t\t\tif ( this.node && matches( this.node, selector ) ) return this.node;\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.find( selector );\n\t\t\t}\n\t\t};\n\n\t\tElement.prototype.findAll = function findAll ( selector, query ) {\n\t\t\t// Add this node to the query, if applicable, and register the\n\t\t\t// query on this element\n\t\t\tvar matches = query.test( this.node );\n\t\t\tif ( matches ) {\n\t\t\t\tquery.add( this.node );\n\t\t\t\tif ( query.live ) this.liveQueries.push( query );\n\t\t\t}\n\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAll( selector, query );\n\t\t\t}\n\t\t};\n\n\t\tElement.prototype.findComponent = function findComponent ( name ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.findComponent( name );\n\t\t\t}\n\t\t};\n\n\t\tElement.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAllComponents( name, query );\n\t\t\t}\n\t\t};\n\n\t\tElement.prototype.findNextNode = function findNextNode () {\n\t\t\treturn null;\n\t\t};\n\n\t\tElement.prototype.firstNode = function firstNode () {\n\t\t\treturn this.node;\n\t\t};\n\n\t\tElement.prototype.getAttribute = function getAttribute ( name ) {\n\t\t\tvar attribute = this.attributeByName[ name ];\n\t\t\treturn attribute ? attribute.getValue() : undefined;\n\t\t};\n\n\t\tElement.prototype.recreateTwowayBinding = function recreateTwowayBinding () {\n\t\t\tif ( this.binding ) {\n\t\t\t\tthis.binding.unbind();\n\t\t\t\tthis.binding.unrender();\n\t\t\t}\n\n\t\t\tif ( this.binding = this.createTwowayBinding() ) {\n\t\t\t\tthis.binding.bind();\n\t\t\t\tif ( this.rendered ) this.binding.render();\n\t\t\t}\n\t\t};\n\n\t\tElement.prototype.render = function render$1 ( target, occupants ) {\n\t\t\t// TODO determine correct namespace\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.namespace = getNamespace( this );\n\n\t\t\tvar node;\n\t\t\tvar existing = false;\n\n\t\t\tif ( occupants ) {\n\t\t\t\tvar n;\n\t\t\t\twhile ( ( n = occupants.shift() ) ) {\n\t\t\t\t\tif ( n.nodeName.toUpperCase() === this$1.template.e.toUpperCase() && n.namespaceURI === this$1.namespace ) {\n\t\t\t\t\t\tthis$1.node = node = n;\n\t\t\t\t\t\texisting = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdetachNode( n );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !node ) {\n\t\t\t\tnode = createElement( this.template.e, this.namespace, this.getAttribute( 'is' ) );\n\t\t\t\tthis.node = node;\n\t\t\t}\n\n\t\t\tdefineProperty( node, '_ractive', {\n\t\t\t\tvalue: {\n\t\t\t\t\tproxy: this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Is this a top-level node of a component? If so, we may need to add\n\t\t\t// a data-ractive-css attribute, for CSS encapsulation\n\t\t\tif ( this.parentFragment.cssIds ) {\n\t\t\t\tnode.setAttribute( 'data-ractive-css', this.parentFragment.cssIds.map( function ( x ) { return (\"{\" + x + \"}\"); } ).join( ' ' ) );\n\t\t\t}\n\n\t\t\tif ( existing && this.foundNode ) this.foundNode( node );\n\n\t\t\tif ( this.fragment ) {\n\t\t\t\tvar children = existing ? toArray( node.childNodes ) : undefined;\n\n\t\t\t\tthis.fragment.render( node, children );\n\n\t\t\t\t// clean up leftover children\n\t\t\t\tif ( children ) {\n\t\t\t\t\tchildren.forEach( detachNode );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( existing ) {\n\t\t\t\t// store initial values for two-way binding\n\t\t\t\tif ( this.binding && this.binding.wasUndefined ) this.binding.setFromNode( node );\n\t\t\t\t// remove unused attributes\n\t\t\t\tvar i = node.attributes.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tvar name = node.attributes[i].name;\n\t\t\t\t\tif ( !( name in this$1.attributeByName ) ) node.removeAttribute( name );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.attributes.forEach( render );\n\n\t\t\tif ( this.binding ) this.binding.render();\n\n\t\t\tupdateLiveQueries$1( this );\n\n\t\t\tif ( this._introTransition && this.ractive.transitionsEnabled ) {\n\t\t\t\tthis._introTransition.isIntro = true;\n\t\t\t\trunloop.registerTransition( this._introTransition );\n\t\t\t}\n\n\t\t\tif ( !existing ) {\n\t\t\t\ttarget.appendChild( node );\n\t\t\t}\n\n\t\t\tthis.rendered = true;\n\t\t};\n\n\t\tElement.prototype.shuffled = function shuffled () {\n\t\t\tthis.liveQueries.forEach( makeDirty$1 );\n\t\t\tItem.prototype.shuffled.call(this);\n\t\t};\n\n\t\tElement.prototype.toString = function toString () {\n\t\t\tvar tagName = this.template.e;\n\n\t\t\tvar attrs = this.attributes.map( stringifyAttribute ).join( '' );\n\n\t\t\t// Special case - selected options\n\t\t\tif ( this.name === 'option' && this.isSelected() ) {\n\t\t\t\tattrs += ' selected';\n\t\t\t}\n\n\t\t\t// Special case - two-way radio name bindings\n\t\t\tif ( this.name === 'input' && inputIsCheckedRadio( this ) ) {\n\t\t\t\tattrs += ' checked';\n\t\t\t}\n\n\t\t\t// Special case style and class attributes and directives\n\t\t\tvar style, cls;\n\t\t\tthis.attributes.forEach( function ( attr ) {\n\t\t\t\tif ( attr.name === 'class' ) {\n\t\t\t\t\tcls = ( cls || '' ) + ( cls ? ' ' : '' ) + safeAttributeString( attr.getString() );\n\t\t\t\t} else if ( attr.name === 'style' ) {\n\t\t\t\t\tstyle = ( style || '' ) + ( style ? ' ' : '' ) + safeAttributeString( attr.getString() );\n\t\t\t\t\tif ( style && !endsWithSemi.test( style ) ) style += ';';\n\t\t\t\t} else if ( attr.style ) {\n\t\t\t\t\tstyle = ( style || '' ) + ( style ? ' ' : '' ) +  \"\" + (attr.style) + \": \" + (safeAttributeString( attr.getString() )) + \";\";\n\t\t\t\t} else if ( attr.inlineClass && attr.getValue() ) {\n\t\t\t\t\tcls = ( cls || '' ) + ( cls ? ' ' : '' ) + attr.inlineClass;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// put classes first, then inline style\n\t\t\tif ( style !== undefined ) attrs = ' style' + ( style ? (\"=\\\"\" + style + \"\\\"\") : '' ) + attrs;\n\t\t\tif ( cls !== undefined ) attrs = ' class' + (cls ? (\"=\\\"\" + cls + \"\\\"\") : '') + attrs;\n\n\t\t\tvar str = \"<\" + tagName + \"\" + attrs + \">\";\n\n\t\t\tif ( this.isVoid ) return str;\n\n\t\t\t// Special case - textarea\n\t\t\tif ( this.name === 'textarea' && this.getAttribute( 'value' ) !== undefined ) {\n\t\t\t\tstr += escapeHtml( this.getAttribute( 'value' ) );\n\t\t\t}\n\n\t\t\t// Special case - contenteditable\n\t\t\telse if ( this.getAttribute( 'contenteditable' ) !== undefined ) {\n\t\t\t\tstr += ( this.getAttribute( 'value' ) || '' );\n\t\t\t}\n\n\t\t\tif ( this.fragment ) {\n\t\t\t\tstr += this.fragment.toString( !/^(?:script|style)$/i.test( this.template.e ) ); // escape text unless script/style\n\t\t\t}\n\n\t\t\tstr += \"</\" + tagName + \">\";\n\t\t\treturn str;\n\t\t};\n\n\t\tElement.prototype.unbind = function unbind$1 () {\n\t\t\tthis.attributes.unbinding = true;\n\t\t\tthis.attributes.forEach( unbind );\n\t\t\tthis.attributes.unbinding = false;\n\n\t\t\tif ( this.binding ) this.binding.unbind();\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\t\t};\n\n\t\tElement.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tif ( !this.rendered ) return;\n\t\t\tthis.rendered = false;\n\n\t\t\t// unrendering before intro completed? complete it now\n\t\t\t// TODO should be an API for aborting transitions\n\t\t\tvar transition = this._introTransition;\n\t\t\tif ( transition && transition.complete ) transition.complete();\n\n\t\t\t// Detach as soon as we can\n\t\t\tif ( this.name === 'option' ) {\n\t\t\t\t// <option> elements detach immediately, so that\n\t\t\t\t// their parent <select> element syncs correctly, and\n\t\t\t\t// since option elements can't have transitions anyway\n\t\t\t\tthis.detach();\n\t\t\t} else if ( shouldDestroy ) {\n\t\t\t\trunloop.detachWhenReady( this );\n\t\t\t}\n\n\t\t\tif ( this.fragment ) this.fragment.unrender();\n\n\t\t\tif ( this.binding ) this.binding.unrender();\n\n\t\t\t// outro transition\n\t\t\tif ( this._outroTransition && this.ractive.transitionsEnabled ) {\n\t\t\t\tthis._outroTransition.isIntro = false;\n\t\t\t\trunloop.registerTransition( this._outroTransition );\n\t\t\t}\n\n\t\t\tremoveFromLiveQueries( this );\n\t\t\t// TODO forms are a special case\n\t\t};\n\n\t\tElement.prototype.update = function update$1 () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\n\t\t\t\tthis.attributes.forEach( update );\n\n\t\t\t\tif ( this.fragment ) this.fragment.update();\n\t\t\t}\n\t\t};\n\n\t\treturn Element;\n\t}(Item));\n\n\tfunction inputIsCheckedRadio ( element ) {\n\t\tvar attributes = element.attributeByName;\n\n\t\tvar typeAttribute  = attributes.type;\n\t\tvar valueAttribute = attributes.value;\n\t\tvar nameAttribute  = attributes.name;\n\n\t\tif ( !typeAttribute || ( typeAttribute.value !== 'radio' ) || !valueAttribute || !nameAttribute.interpolator ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( valueAttribute.getValue() === nameAttribute.interpolator.model.get() ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tfunction stringifyAttribute ( attribute ) {\n\t\tvar str = attribute.toString();\n\t\treturn str ? ' ' + str : '';\n\t}\n\n\tfunction removeFromLiveQueries ( element ) {\n\t\tvar i = element.liveQueries.length;\n\t\twhile ( i-- ) {\n\t\t\tvar query = element.liveQueries[i];\n\t\t\tquery.remove( element.node );\n\t\t}\n\t}\n\n\tfunction getNamespace ( element ) {\n\t\t// Use specified namespace...\n\t\tvar xmlns = element.getAttribute( 'xmlns' );\n\t\tif ( xmlns ) return xmlns;\n\n\t\t// ...or SVG namespace, if this is an <svg> element\n\t\tif ( element.name === 'svg' ) return svg$1;\n\n\t\tvar parent = element.parent;\n\n\t\tif ( parent ) {\n\t\t\t// ...or HTML, if the parent is a <foreignObject>\n\t\t\tif ( parent.name === 'foreignobject' ) return html;\n\n\t\t\t// ...or inherit from the parent node\n\t\t\treturn parent.node.namespaceURI;\n\t\t}\n\n\t\treturn element.ractive.el.namespaceURI;\n\t}\n\n\tvar Form = (function (Element) {\n\t\tfunction Form ( options ) {\n\t\t\tElement.call( this, options );\n\t\t\tthis.formBindings = [];\n\t\t}\n\n\t\tForm.prototype = Object.create( Element && Element.prototype );\n\t\tForm.prototype.constructor = Form;\n\n\t\tForm.prototype.render = function render ( target, occupants ) {\n\t\t\tElement.prototype.render.call( this, target, occupants );\n\t\t\tthis.node.addEventListener( 'reset', handleReset, false );\n\t\t};\n\n\t\tForm.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tthis.node.removeEventListener( 'reset', handleReset, false );\n\t\t\tElement.prototype.unrender.call( this, shouldDestroy );\n\t\t};\n\n\t\treturn Form;\n\t}(Element));\n\n\tfunction handleReset () {\n\t\tvar element = this._ractive.proxy;\n\n\t\trunloop.start();\n\t\telement.formBindings.forEach( updateModel$1 );\n\t\trunloop.end();\n\t}\n\n\tfunction updateModel$1 ( binding ) {\n\t\tbinding.model.set( binding.resetValue );\n\t}\n\n\tvar Mustache = (function (Item) {\n\t\tfunction Mustache ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.parentFragment = options.parentFragment;\n\t\t\tthis.template = options.template;\n\t\t\tthis.index = options.index;\n\t\t\tif ( options.owner ) this.parent = options.owner;\n\n\t\t\tthis.isStatic = !!options.template.s;\n\n\t\t\tthis.model = null;\n\t\t\tthis.dirty = false;\n\t\t}\n\n\t\tMustache.prototype = Object.create( Item && Item.prototype );\n\t\tMustache.prototype.constructor = Mustache;\n\n\t\tMustache.prototype.bind = function bind () {\n\t\t\t// try to find a model for this view\n\t\t\tvar this$1 = this;\n\n\t\t\tvar model = resolve$2( this.parentFragment, this.template );\n\t\t\tvar value = model ? model.get() : undefined;\n\n\t\t\tif ( this.isStatic ) {\n\t\t\t\tthis.model = { get: function () { return value; } };\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( model ) {\n\t\t\t\tmodel.register( this );\n\t\t\t\tthis.model = model;\n\t\t\t} else if ( this.template.r ) {\n\t\t\t\tthis.resolver = this.parentFragment.resolve( this.template.r, function ( model ) {\n\t\t\t\t\tthis$1.model = model;\n\t\t\t\t\tmodel.register( this$1 );\n\n\t\t\t\t\tthis$1.handleChange();\n\t\t\t\t\tthis$1.resolver = null;\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tMustache.prototype.handleChange = function handleChange () {\n\t\t\tthis.bubble();\n\t\t};\n\n\t\tMustache.prototype.rebinding = function rebinding ( next, previous, safe ) {\n\t\t\tnext = rebindMatch( this.template, next, previous );\n\t\t\tif ( this['static'] ) return false;\n\t\t\tif ( next === this.model ) return false;\n\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.model.unregister( this );\n\t\t\t}\n\t\t\tif ( next ) next.addShuffleRegister( this, 'mark' );\n\t\t\tthis.model = next;\n\t\t\tif ( !safe ) this.handleChange();\n\t\t\treturn true;\n\t\t};\n\n\t\tMustache.prototype.unbind = function unbind () {\n\t\t\tif ( !this.isStatic ) {\n\t\t\t\tthis.model && this.model.unregister( this );\n\t\t\t\tthis.model = undefined;\n\t\t\t\tthis.resolver && this.resolver.unbind();\n\t\t\t}\n\t\t};\n\n\t\treturn Mustache;\n\t}(Item));\n\n\tvar Interpolator = (function (Mustache) {\n\t\tfunction Interpolator () {\n\t\t\tMustache.apply(this, arguments);\n\t\t}\n\n\t\tInterpolator.prototype = Object.create( Mustache && Mustache.prototype );\n\t\tInterpolator.prototype.constructor = Interpolator;\n\n\t\tInterpolator.prototype.bubble = function bubble () {\n\t\t\tif ( this.owner ) this.owner.bubble();\n\t\t\tMustache.prototype.bubble.call(this);\n\t\t};\n\n\t\tInterpolator.prototype.detach = function detach () {\n\t\t\treturn detachNode( this.node );\n\t\t};\n\n\t\tInterpolator.prototype.firstNode = function firstNode () {\n\t\t\treturn this.node;\n\t\t};\n\n\t\tInterpolator.prototype.getString = function getString () {\n\t\t\treturn this.model ? safeToStringValue( this.model.get() ) : '';\n\t\t};\n\n\t\tInterpolator.prototype.render = function render ( target, occupants ) {\n\t\t\tif ( inAttributes() ) return;\n\t\t\tvar value = this.getString();\n\n\t\t\tthis.rendered = true;\n\n\t\t\tif ( occupants ) {\n\t\t\t\tvar n = occupants[0];\n\t\t\t\tif ( n && n.nodeType === 3 ) {\n\t\t\t\t\toccupants.shift();\n\t\t\t\t\tif ( n.nodeValue !== value ) {\n\t\t\t\t\t\tn.nodeValue = value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tn = this.node = doc.createTextNode( value );\n\t\t\t\t\tif ( occupants[0] ) {\n\t\t\t\t\t\ttarget.insertBefore( n, occupants[0] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.appendChild( n );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.node = n;\n\t\t\t} else {\n\t\t\t\tthis.node = doc.createTextNode( value );\n\t\t\t\ttarget.appendChild( this.node );\n\t\t\t}\n\t\t};\n\n\t\tInterpolator.prototype.toString = function toString ( escape ) {\n\t\t\tvar string = this.getString();\n\t\t\treturn escape ? escapeHtml( string ) : string;\n\t\t};\n\n\t\tInterpolator.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tif ( shouldDestroy ) this.detach();\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tInterpolator.prototype.update = function update () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tif ( this.rendered ) {\n\t\t\t\t\tthis.node.data = this.getString();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tInterpolator.prototype.valueOf = function valueOf () {\n\t\t\treturn this.model ? this.model.get() : undefined;\n\t\t};\n\n\t\treturn Interpolator;\n\t}(Mustache));\n\n\tvar Input = (function (Element) {\n\t\tfunction Input () {\n\t\t\tElement.apply(this, arguments);\n\t\t}\n\n\t\tInput.prototype = Object.create( Element && Element.prototype );\n\t\tInput.prototype.constructor = Input;\n\n\t\tInput.prototype.render = function render ( target, occupants ) {\n\t\t\tElement.prototype.render.call( this, target, occupants );\n\t\t\tthis.node.defaultValue = this.node.value;\n\t\t};\n\n\t\treturn Input;\n\t}(Element));\n\n\tvar Mapping = (function (Item) {\n\t\tfunction Mapping ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.name = options.template.n;\n\n\t\t\tthis.owner = options.owner || options.parentFragment.owner || options.element || findElement( options.parentFragment );\n\t\t\tthis.element = options.element || (this.owner.attributeByName ? this.owner : findElement( options.parentFragment ) );\n\t\t\tthis.parentFragment = this.element.parentFragment; // shared\n\t\t\tthis.ractive = this.parentFragment.ractive;\n\n\t\t\tthis.fragment = null;\n\n\t\t\tthis.element.attributeByName[ this.name ] = this;\n\n\t\t\tthis.value = options.template.f;\n\t\t}\n\n\t\tMapping.prototype = Object.create( Item && Item.prototype );\n\t\tMapping.prototype.constructor = Mapping;\n\n\t\tMapping.prototype.bind = function bind () {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.bind();\n\t\t\t}\n\n\t\t\tvar template = this.template.f;\n\t\t\tvar viewmodel = this.element.instance.viewmodel;\n\n\t\t\tif ( template === 0 ) {\n\t\t\t\t// empty attributes are `true`\n\t\t\t\tviewmodel.joinKey( this.name ).set( true );\n\t\t\t}\n\n\t\t\telse if ( typeof template === 'string' ) {\n\t\t\t\tvar parsed = parseJSON( template );\n\t\t\t\tviewmodel.joinKey( this.name ).set( parsed ? parsed.value : template );\n\t\t\t}\n\n\t\t\telse if ( isArray( template ) ) {\n\t\t\t\tcreateMapping( this, true );\n\t\t\t}\n\t\t};\n\n\t\tMapping.prototype.render = function render () {};\n\n\t\tMapping.prototype.unbind = function unbind () {\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\t\t\tif ( this.model ) this.model.unregister( this );\n\t\t\tif ( this.boundFragment ) this.boundFragment.unbind();\n\n\t\t\tif ( this.element.bound ) {\n\t\t\t\tif ( this.link.target === this.model ) this.link.owner.unlink();\n\t\t\t}\n\t\t};\n\n\t\tMapping.prototype.unrender = function unrender () {};\n\n\t\tMapping.prototype.update = function update () {\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tif ( this.fragment ) this.fragment.update();\n\t\t\t\tif ( this.boundFragment ) this.boundFragment.update();\n\t\t\t\tif ( this.rendered ) this.updateDelegate();\n\t\t\t}\n\t\t};\n\n\t\treturn Mapping;\n\t}(Item));\n\n\tfunction createMapping ( item ) {\n\t\tvar template = item.template.f;\n\t\tvar viewmodel = item.element.instance.viewmodel;\n\t\tvar childData = viewmodel.value;\n\n\t\tif ( template.length === 1 && template[0].t === INTERPOLATOR ) {\n\t\t\titem.model = resolve$2( item.parentFragment, template[0] );\n\n\t\t\tif ( !item.model ) {\n\t\t\t\twarnOnceIfDebug( (\"The \" + (item.name) + \"='{{\" + (template[0].r) + \"}}' mapping is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity\"), { ractive: item.element.instance }); // TODO add docs page explaining item\n\t\t\t\titem.parentFragment.ractive.get( item.name ); // side-effect: create mappings as necessary\n\t\t\t\titem.model = item.parentFragment.findContext().joinKey( item.name );\n\t\t\t}\n\n\t\t\titem.link = viewmodel.createLink( item.name, item.model, template[0].r );\n\n\t\t\tif ( item.model.get() === undefined && !item.model.isReadonly && item.name in childData ) {\n\t\t\t\titem.model.set( childData[ item.name ] );\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\titem.boundFragment = new Fragment({\n\t\t\t\towner: item,\n\t\t\t\ttemplate: template\n\t\t\t}).bind();\n\n\t\t\titem.model = viewmodel.joinKey( item.name );\n\t\t\titem.model.set( item.boundFragment.valueOf() );\n\n\t\t\t// item is a *bit* of a hack\n\t\t\titem.boundFragment.bubble = function () {\n\t\t\t\tFragment.prototype.bubble.call( item.boundFragment );\n\t\t\t\t// defer this to avoid mucking around model deps if there happens to be an expression involved\n\t\t\t\trunloop.scheduleTask(function () {\n\t\t\t\t\titem.boundFragment.update();\n\t\t\t\t\titem.model.set( item.boundFragment.valueOf() );\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\t}\n\n\tvar Option = (function (Element) {\n\t\tfunction Option ( options ) {\n\t\t\tvar template = options.template;\n\t\t\tif ( !template.a ) template.a = {};\n\n\t\t\t// If the value attribute is missing, use the element's content,\n\t\t\t// as long as it isn't disabled\n\t\t\tif ( template.a.value === undefined && !( 'disabled' in template.a ) ) {\n\t\t\t\ttemplate.a.value = template.f || '';\n\t\t\t}\n\n\t\t\tElement.call( this, options );\n\n\t\t\tthis.select = findElement( this.parent || this.parentFragment, false, 'select' );\n\t\t}\n\n\t\tOption.prototype = Object.create( Element && Element.prototype );\n\t\tOption.prototype.constructor = Option;\n\n\t\tOption.prototype.bind = function bind () {\n\t\t\tif ( !this.select ) {\n\t\t\t\tElement.prototype.bind.call(this);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the select has a value, it overrides the `selected` attribute on\n\t\t\t// this option - so we delete the attribute\n\t\t\tvar selectedAttribute = this.attributeByName.selected;\n\t\t\tif ( selectedAttribute && this.select.getAttribute( 'value' ) !== undefined ) {\n\t\t\t\tvar index = this.attributes.indexOf( selectedAttribute );\n\t\t\t\tthis.attributes.splice( index, 1 );\n\t\t\t\tdelete this.attributeByName.selected;\n\t\t\t}\n\n\t\t\tElement.prototype.bind.call(this);\n\t\t\tthis.select.options.push( this );\n\t\t};\n\n\t\tOption.prototype.bubble = function bubble () {\n\t\t\t// if we're using content as value, may need to update here\n\t\t\tvar value = this.getAttribute( 'value' );\n\t\t\tif ( this.node && this.node.value !== value ) {\n\t\t\t\tthis.node._ractive.value = value;\n\t\t\t}\n\t\t\tElement.prototype.bubble.call(this);\n\t\t};\n\n\t\tOption.prototype.getAttribute = function getAttribute ( name ) {\n\t\t\tvar attribute = this.attributeByName[ name ];\n\t\t\treturn attribute ? attribute.getValue() : name === 'value' && this.fragment ? this.fragment.valueOf() : undefined;\n\t\t};\n\n\t\tOption.prototype.isSelected = function isSelected () {\n\t\t\tvar optionValue = this.getAttribute( 'value' );\n\n\t\t\tif ( optionValue === undefined || !this.select ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar selectValue = this.select.getAttribute( 'value' );\n\n\t\t\tif ( selectValue == optionValue ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ( this.select.getAttribute( 'multiple' ) && isArray( selectValue ) ) {\n\t\t\t\tvar i = selectValue.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( selectValue[i] == optionValue ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tOption.prototype.render = function render ( target, occupants ) {\n\t\t\tElement.prototype.render.call( this, target, occupants );\n\n\t\t\tif ( !this.attributeByName.value ) {\n\t\t\t\tthis.node._ractive.value = this.getAttribute( 'value' );\n\t\t\t}\n\t\t};\n\n\t\tOption.prototype.unbind = function unbind () {\n\t\t\tElement.prototype.unbind.call(this);\n\n\t\t\tif ( this.select ) {\n\t\t\t\tremoveFromArray( this.select.options, this );\n\t\t\t}\n\t\t};\n\n\t\treturn Option;\n\t}(Element));\n\n\tfunction getPartialTemplate ( ractive, name, parentFragment ) {\n\t\t// If the partial in instance or view heirarchy instances, great\n\t\tvar partial = getPartialFromRegistry( ractive, name, parentFragment || {} );\n\t\tif ( partial ) return partial;\n\n\t\t// Does it exist on the page as a script tag?\n\t\tpartial = parser.fromId( name, { noThrow: true } );\n\t\tif ( partial ) {\n\t\t\t// parse and register to this ractive instance\n\t\t\tvar parsed = parser.parseFor( partial, ractive );\n\n\t\t\t// register extra partials on the ractive instance if they don't already exist\n\t\t\tif ( parsed.p ) fillGaps( ractive.partials, parsed.p );\n\n\t\t\t// register (and return main partial if there are others in the template)\n\t\t\treturn ractive.partials[ name ] = parsed.t;\n\t\t}\n\t}\n\n\tfunction getPartialFromRegistry ( ractive, name, parentFragment ) {\n\t\t// if there was an instance up-hierarchy, cool\n\t\tvar partial = findParentPartial( name, parentFragment.owner );\n\t\tif ( partial ) return partial;\n\n\t\t// find first instance in the ractive or view hierarchy that has this partial\n\t\tvar instance = findInstance( 'partials', ractive, name );\n\n\t\tif ( !instance ) { return; }\n\n\t\tpartial = instance.partials[ name ];\n\n\t\t// partial is a function?\n\t\tvar fn;\n\t\tif ( typeof partial === 'function' ) {\n\t\t\tfn = partial.bind( instance );\n\t\t\tfn.isOwner = instance.partials.hasOwnProperty(name);\n\t\t\tpartial = fn.call( ractive, parser );\n\t\t}\n\n\t\tif ( !partial && partial !== '' ) {\n\t\t\twarnIfDebug( noRegistryFunctionReturn, name, 'partial', 'partial', { ractive: ractive });\n\t\t\treturn;\n\t\t}\n\n\t\t// If this was added manually to the registry,\n\t\t// but hasn't been parsed, parse it now\n\t\tif ( !parser.isParsed( partial ) ) {\n\t\t\t// use the parseOptions of the ractive instance on which it was found\n\t\t\tvar parsed = parser.parseFor( partial, instance );\n\n\t\t\t// Partials cannot contain nested partials!\n\t\t\t// TODO add a test for this\n\t\t\tif ( parsed.p ) {\n\t\t\t\twarnIfDebug( 'Partials ({{>%s}}) cannot contain nested inline partials', name, { ractive: ractive });\n\t\t\t}\n\n\t\t\t// if fn, use instance to store result, otherwise needs to go\n\t\t\t// in the correct point in prototype chain on instance or constructor\n\t\t\tvar target = fn ? instance : findOwner( instance, name );\n\n\t\t\t// may be a template with partials, which need to be registered and main template extracted\n\t\t\ttarget.partials[ name ] = partial = parsed.t;\n\t\t}\n\n\t\t// store for reset\n\t\tif ( fn ) partial._fn = fn;\n\n\t\treturn partial.v ? partial.t : partial;\n\t}\n\n\tfunction findOwner ( ractive, key ) {\n\t\treturn ractive.partials.hasOwnProperty( key )\n\t\t\t? ractive\n\t\t\t: findConstructor( ractive.constructor, key);\n\t}\n\n\tfunction findConstructor ( constructor, key ) {\n\t\tif ( !constructor ) { return; }\n\t\treturn constructor.partials.hasOwnProperty( key )\n\t\t\t? constructor\n\t\t\t: findConstructor( constructor._Parent, key );\n\t}\n\n\tfunction findParentPartial( name, parent ) {\n\t\tif ( parent ) {\n\t\t\tif ( parent.template && parent.template.p && parent.template.p[name] ) {\n\t\t\t\treturn parent.template.p[name];\n\t\t\t} else if ( parent.parentFragment && parent.parentFragment.owner ) {\n\t\t\t\treturn findParentPartial( name, parent.parentFragment.owner );\n\t\t\t}\n\t\t}\n\t}\n\n\tvar Partial = (function (Mustache) {\n\t\tfunction Partial () {\n\t\t\tMustache.apply(this, arguments);\n\t\t}\n\n\t\tPartial.prototype = Object.create( Mustache && Mustache.prototype );\n\t\tPartial.prototype.constructor = Partial;\n\n\t\tPartial.prototype.bind = function bind () {\n\t\t\t// keep track of the reference name for future resets\n\t\t\tthis.refName = this.template.r;\n\n\t\t\t// name matches take priority over expressions\n\t\t\tvar template = this.refName ? getPartialTemplate( this.ractive, this.refName, this.parentFragment ) || null : null;\n\t\t\tvar templateObj;\n\n\t\t\tif ( template ) {\n\t\t\t\tthis.named = true;\n\t\t\t\tthis.setTemplate( this.template.r, template );\n\t\t\t}\n\n\t\t\tif ( !template ) {\n\t\t\t\tMustache.prototype.bind.call(this);\n\t\t\t\tif ( this.model && ( templateObj = this.model.get() ) && typeof templateObj === 'object' && ( typeof templateObj.template === 'string' || isArray( templateObj.t ) ) ) {\n\t\t\t\t\tif ( templateObj.template ) {\n\t\t\t\t\t\tthis.source = templateObj.template;\n\t\t\t\t\t\ttemplateObj = parsePartial( this.template.r, templateObj.template, this.ractive );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.source = templateObj.t;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setTemplate( this.template.r, templateObj.t );\n\t\t\t\t} else if ( ( !this.model || typeof this.model.get() !== 'string' ) && this.refName ) {\n\t\t\t\t\tthis.setTemplate( this.refName, template );\n\t\t\t\t} else {\n\t\t\t\t\tthis.setTemplate( this.model.get() );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.fragment = new Fragment({\n\t\t\t\towner: this,\n\t\t\t\ttemplate: this.partialTemplate\n\t\t\t}).bind();\n\t\t};\n\n\t\tPartial.prototype.detach = function detach () {\n\t\t\treturn this.fragment.detach();\n\t\t};\n\n\t\tPartial.prototype.find = function find ( selector ) {\n\t\t\treturn this.fragment.find( selector );\n\t\t};\n\n\t\tPartial.prototype.findAll = function findAll ( selector, query ) {\n\t\t\tthis.fragment.findAll( selector, query );\n\t\t};\n\n\t\tPartial.prototype.findComponent = function findComponent ( name ) {\n\t\t\treturn this.fragment.findComponent( name );\n\t\t};\n\n\t\tPartial.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\t\tthis.fragment.findAllComponents( name, query );\n\t\t};\n\n\t\tPartial.prototype.firstNode = function firstNode ( skipParent ) {\n\t\t\treturn this.fragment.firstNode( skipParent );\n\t\t};\n\n\t\tPartial.prototype.forceResetTemplate = function forceResetTemplate () {\n\t\t\tvar this$1 = this;\n\n\t\t\tthis.partialTemplate = undefined;\n\n\t\t\t// on reset, check for the reference name first\n\t\t\tif ( this.refName ) {\n\t\t\t\tthis.partialTemplate = getPartialTemplate( this.ractive, this.refName, this.parentFragment );\n\t\t\t}\n\n\t\t\t// then look for the resolved name\n\t\t\tif ( !this.partialTemplate ) {\n\t\t\t\tthis.partialTemplate = getPartialTemplate( this.ractive, this.name, this.parentFragment );\n\t\t\t}\n\n\t\t\tif ( !this.partialTemplate ) {\n\t\t\t\twarnOnceIfDebug( (\"Could not find template for partial '\" + (this.name) + \"'\") );\n\t\t\t\tthis.partialTemplate = [];\n\t\t\t}\n\n\t\t\tif ( this.inAttribute ) {\n\t\t\t\tdoInAttributes( function () { return this$1.fragment.resetTemplate( this$1.partialTemplate ); } );\n\t\t\t} else {\n\t\t\t\tthis.fragment.resetTemplate( this.partialTemplate );\n\t\t\t}\n\n\t\t\tthis.bubble();\n\t\t};\n\n\t\tPartial.prototype.render = function render ( target, occupants ) {\n\t\t\tthis.fragment.render( target, occupants );\n\t\t};\n\n\t\tPartial.prototype.setTemplate = function setTemplate ( name, template ) {\n\t\t\tthis.name = name;\n\n\t\t\tif ( !template && template !== null ) template = getPartialTemplate( this.ractive, name, this.parentFragment );\n\n\t\t\tif ( !template ) {\n\t\t\t\twarnOnceIfDebug( (\"Could not find template for partial '\" + name + \"'\") );\n\t\t\t}\n\n\t\t\tthis.partialTemplate = template || [];\n\t\t};\n\n\t\tPartial.prototype.toString = function toString ( escape ) {\n\t\t\treturn this.fragment.toString( escape );\n\t\t};\n\n\t\tPartial.prototype.unbind = function unbind () {\n\t\t\tMustache.prototype.unbind.call(this);\n\t\t\tthis.fragment.unbind();\n\t\t};\n\n\t\tPartial.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tthis.fragment.unrender( shouldDestroy );\n\t\t};\n\n\t\tPartial.prototype.update = function update () {\n\t\t\tvar template;\n\n\t\t\tif ( this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\n\t\t\t\tif ( !this.named ) {\n\t\t\t\t\tif ( this.model ) {\n\t\t\t\t\t\ttemplate = this.model.get();\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( template && typeof template === 'string' && template !== this.name ) {\n\t\t\t\t\t\tthis.setTemplate( template );\n\t\t\t\t\t\tthis.fragment.resetTemplate( this.partialTemplate );\n\t\t\t\t\t} else if ( template && typeof template === 'object' && ( typeof template.template === 'string' || isArray( template.t ) ) ) {\n\t\t\t\t\t\tif ( template.t !== this.source && template.template !== this.source ) {\n\t\t\t\t\t\t\tif ( template.template ) {\n\t\t\t\t\t\t\t\tthis.source = template.template;\n\t\t\t\t\t\t\t\ttemplate = parsePartial( this.name, template.template, this.ractive );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.source = template.t;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.setTemplate( this.name, template.t );\n\t\t\t\t\t\t\tthis.fragment.resetTemplate( this.partialTemplate );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.fragment.update();\n\t\t\t}\n\t\t};\n\n\t\treturn Partial;\n\t}(Mustache));\n\n\tfunction parsePartial( name, partial, ractive ) {\n\t\tvar parsed;\n\n\t\ttry {\n\t\t\tparsed = parser.parse( partial, parser.getParseOptions( ractive ) );\n\t\t} catch (e) {\n\t\t\twarnIfDebug( (\"Could not parse partial from expression '\" + name + \"'\\n\" + (e.message)) );\n\t\t}\n\n\t\treturn parsed || { t: [] };\n\t}\n\n\tvar RepeatedFragment = function RepeatedFragment ( options ) {\n\t\tthis.parent = options.owner.parentFragment;\n\n\t\t// bit of a hack, so reference resolution works without another\n\t\t// layer of indirection\n\t\tthis.parentFragment = this;\n\t\tthis.owner = options.owner;\n\t\tthis.ractive = this.parent.ractive;\n\n\t\t// encapsulated styles should be inherited until they get applied by an element\n\t\tthis.cssIds = 'cssIds' in options ? options.cssIds : ( this.parent ? this.parent.cssIds : null );\n\n\t\tthis.context = null;\n\t\tthis.rendered = false;\n\t\tthis.iterations = [];\n\n\t\tthis.template = options.template;\n\n\t\tthis.indexRef = options.indexRef;\n\t\tthis.keyRef = options.keyRef;\n\n\t\tthis.pendingNewIndices = null;\n\t\tthis.previousIterations = null;\n\n\t\t// track array versus object so updates of type rest\n\t\tthis.isArray = false;\n\t};\n\n\tRepeatedFragment.prototype.bind = function bind ( context ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.context = context;\n\t\tvar value = context.get();\n\n\t\t// {{#each array}}...\n\t\tif ( this.isArray = isArray( value ) ) {\n\t\t\t// we can't use map, because of sparse arrays\n\t\t\tthis.iterations = [];\n\t\t\tvar max = value.length;\n\t\t\tfor ( var i = 0; i < max; i += 1 ) {\n\t\t\t\tthis$1.iterations[i] = this$1.createIteration( i, i );\n\t\t\t}\n\t\t}\n\n\t\t// {{#each object}}...\n\t\telse if ( isObject( value ) ) {\n\t\t\tthis.isArray = false;\n\n\t\t\t// TODO this is a dreadful hack. There must be a neater way\n\t\t\tif ( this.indexRef ) {\n\t\t\t\tvar refs = this.indexRef.split( ',' );\n\t\t\t\tthis.keyRef = refs[0];\n\t\t\t\tthis.indexRef = refs[1];\n\t\t\t}\n\n\t\t\tthis.iterations = Object.keys( value ).map( function ( key, index ) {\n\t\t\t\treturn this$1.createIteration( key, index );\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tRepeatedFragment.prototype.bubble = function bubble () {\n\t\tthis.owner.bubble();\n\t};\n\n\tRepeatedFragment.prototype.createIteration = function createIteration ( key, index ) {\n\t\tvar fragment = new Fragment({\n\t\t\towner: this,\n\t\t\ttemplate: this.template\n\t\t});\n\n\t\t// TODO this is a bit hacky\n\t\tfragment.key = key;\n\t\tfragment.index = index;\n\t\tfragment.isIteration = true;\n\n\t\tvar model = this.context.joinKey( key );\n\n\t\t// set up an iteration alias if there is one\n\t\tif ( this.owner.template.z ) {\n\t\t\tfragment.aliases = {};\n\t\t\tfragment.aliases[ this.owner.template.z[0].n ] = model;\n\t\t}\n\n\t\treturn fragment.bind( model );\n\t};\n\n\tRepeatedFragment.prototype.destroyed = function destroyed () {\n\t\tthis.iterations.forEach( function ( i ) { return i.destroyed(); } );\n\t};\n\n\tRepeatedFragment.prototype.detach = function detach () {\n\t\tvar docFrag = createDocumentFragment();\n\t\tthis.iterations.forEach( function ( fragment ) { return docFrag.appendChild( fragment.detach() ); } );\n\t\treturn docFrag;\n\t};\n\n\tRepeatedFragment.prototype.find = function find ( selector ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.iterations.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tvar found = this$1.iterations[i].find( selector );\n\t\t\tif ( found ) return found;\n\t\t}\n\t};\n\n\tRepeatedFragment.prototype.findAll = function findAll ( selector, query ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.iterations.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tthis$1.iterations[i].findAll( selector, query );\n\t\t}\n\t};\n\n\tRepeatedFragment.prototype.findComponent = function findComponent ( name ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.iterations.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tvar found = this$1.iterations[i].findComponent( name );\n\t\t\tif ( found ) return found;\n\t\t}\n\t};\n\n\tRepeatedFragment.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.iterations.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tthis$1.iterations[i].findAllComponents( name, query );\n\t\t}\n\t};\n\n\tRepeatedFragment.prototype.findNextNode = function findNextNode ( iteration ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( iteration.index < this.iterations.length - 1 ) {\n\t\t\tfor ( var i = iteration.index + 1; i < this$1.iterations.length; i++ ) {\n\t\t\t\tvar node = this$1.iterations[ i ].firstNode( true );\n\t\t\t\tif ( node ) return node;\n\t\t\t}\n\t\t}\n\n\t\treturn this.owner.findNextNode();\n\t};\n\n\tRepeatedFragment.prototype.firstNode = function firstNode ( skipParent ) {\n\t\treturn this.iterations[0] ? this.iterations[0].firstNode( skipParent ) : null;\n\t};\n\n\tRepeatedFragment.prototype.rebinding = function rebinding ( next ) {\n\t\tvar this$1 = this;\n\n\t\t\tthis.context = next;\n\t\tthis.iterations.forEach( function ( fragment ) {\n\t\t\tvar model = next ? next.joinKey( fragment.key || fragment.index ) : undefined;\n\t\t\tfragment.context = model;\n\t\t\tif ( this$1.owner.template.z ) {\n\t\t\t\tfragment.aliases = {};\n\t\t\t\tfragment.aliases[ this$1.owner.template.z[0].n ] = model;\n\t\t\t}\n\t\t});\n\t};\n\n\tRepeatedFragment.prototype.render = function render ( target, occupants ) {\n\t\t// TODO use docFrag.cloneNode...\n\n\t\tif ( this.iterations ) {\n\t\t\tthis.iterations.forEach( function ( fragment ) { return fragment.render( target, occupants ); } );\n\t\t}\n\n\t\tthis.rendered = true;\n\t};\n\n\tRepeatedFragment.prototype.shuffle = function shuffle ( newIndices ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( !this.pendingNewIndices ) this.previousIterations = this.iterations.slice();\n\n\t\tif ( !this.pendingNewIndices ) this.pendingNewIndices = [];\n\n\t\tthis.pendingNewIndices.push( newIndices );\n\n\t\tvar iterations = [];\n\n\t\tnewIndices.forEach( function ( newIndex, oldIndex ) {\n\t\t\tif ( newIndex === -1 ) return;\n\n\t\t\tvar fragment = this$1.iterations[ oldIndex ];\n\t\t\titerations[ newIndex ] = fragment;\n\n\t\t\tif ( newIndex !== oldIndex && fragment ) fragment.dirty = true;\n\t\t});\n\n\t\tthis.iterations = iterations;\n\n\t\tthis.bubble();\n\t};\n\n\tRepeatedFragment.prototype.shuffled = function shuffled () {\n\t\tthis.iterations.forEach( function ( i ) { return i.shuffled(); } );\n\t};\n\n\tRepeatedFragment.prototype.toString = function toString$1$$ ( escape ) {\n\t\treturn this.iterations ?\n\t\t\tthis.iterations.map( escape ? toEscapedString : toString$1 ).join( '' ) :\n\t\t\t'';\n\t};\n\n\tRepeatedFragment.prototype.unbind = function unbind$1 () {\n\t\tthis.iterations.forEach( unbind );\n\t\treturn this;\n\t};\n\n\tRepeatedFragment.prototype.unrender = function unrender$1 ( shouldDestroy ) {\n\t\tthis.iterations.forEach( shouldDestroy ? unrenderAndDestroy : unrender );\n\t\tif ( this.pendingNewIndices && this.previousIterations ) {\n\t\t\tthis.previousIterations.forEach( function ( fragment ) {\n\t\t\t\tif ( fragment.rendered ) shouldDestroy ? unrenderAndDestroy( fragment ) : unrender( fragment );\n\t\t\t});\n\t\t}\n\t\tthis.rendered = false;\n\t};\n\n\t// TODO smart update\n\tRepeatedFragment.prototype.update = function update$1 () {\n\t\t// skip dirty check, since this is basically just a facade\n\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.pendingNewIndices ) {\n\t\t\tthis.updatePostShuffle();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.updating ) return;\n\t\tthis.updating = true;\n\n\t\tvar value = this.context.get(),\n\t\t\t\t  wasArray = this.isArray;\n\n\t\tvar toRemove;\n\t\tvar oldKeys;\n\t\tvar reset = true;\n\t\tvar i;\n\n\t\tif ( this.isArray = isArray( value ) ) {\n\t\t\tif ( wasArray ) {\n\t\t\t\treset = false;\n\t\t\t\tif ( this.iterations.length > value.length ) {\n\t\t\t\t\ttoRemove = this.iterations.splice( value.length );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( isObject( value ) && !wasArray ) {\n\t\t\treset = false;\n\t\t\ttoRemove = [];\n\t\t\toldKeys = {};\n\t\t\ti = this.iterations.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar fragment$1 = this$1.iterations[i];\n\t\t\t\tif ( fragment$1.key in value ) {\n\t\t\t\t\toldKeys[ fragment$1.key ] = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis$1.iterations.splice( i, 1 );\n\t\t\t\t\ttoRemove.push( fragment$1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( reset ) {\n\t\t\ttoRemove = this.iterations;\n\t\t\tthis.iterations = [];\n\t\t}\n\n\t\tif ( toRemove ) {\n\t\t\ttoRemove.forEach( function ( fragment ) {\n\t\t\t\tfragment.unbind();\n\t\t\t\tfragment.unrender( true );\n\t\t\t});\n\t\t}\n\n\t\t// update the remaining ones\n\t\tthis.iterations.forEach( update );\n\n\t\t// add new iterations\n\t\tvar newLength = isArray( value ) ?\n\t\t\tvalue.length :\n\t\t\tisObject( value ) ?\n\t\t\t\tObject.keys( value ).length :\n\t\t\t\t0;\n\n\t\tvar docFrag;\n\t\tvar fragment;\n\n\t\tif ( newLength > this.iterations.length ) {\n\t\t\tdocFrag = this.rendered ? createDocumentFragment() : null;\n\t\t\ti = this.iterations.length;\n\n\t\t\tif ( isArray( value ) ) {\n\t\t\t\twhile ( i < value.length ) {\n\t\t\t\t\tfragment = this$1.createIteration( i, i );\n\n\t\t\t\t\tthis$1.iterations.push( fragment );\n\t\t\t\t\tif ( this$1.rendered ) fragment.render( docFrag );\n\n\t\t\t\t\ti += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telse if ( isObject( value ) ) {\n\t\t\t\t// TODO this is a dreadful hack. There must be a neater way\n\t\t\t\tif ( this.indexRef && !this.keyRef ) {\n\t\t\t\t\tvar refs = this.indexRef.split( ',' );\n\t\t\t\t\tthis.keyRef = refs[0];\n\t\t\t\t\tthis.indexRef = refs[1];\n\t\t\t\t}\n\n\t\t\t\tObject.keys( value ).forEach( function ( key ) {\n\t\t\t\t\tif ( !oldKeys || !( key in oldKeys ) ) {\n\t\t\t\t\t\tfragment = this$1.createIteration( key, i );\n\n\t\t\t\t\t\tthis$1.iterations.push( fragment );\n\t\t\t\t\t\tif ( this$1.rendered ) fragment.render( docFrag );\n\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( this.rendered ) {\n\t\t\t\tvar parentNode = this.parent.findParentNode();\n\t\t\t\tvar anchor = this.parent.findNextNode( this.owner );\n\n\t\t\t\tparentNode.insertBefore( docFrag, anchor );\n\t\t\t}\n\t\t}\n\n\t\tthis.updating = false;\n\t};\n\n\tRepeatedFragment.prototype.updatePostShuffle = function updatePostShuffle () {\n\t\tvar this$1 = this;\n\n\t\t\tvar newIndices = this.pendingNewIndices[ 0 ];\n\n\t\t// map first shuffle through\n\t\tthis.pendingNewIndices.slice( 1 ).forEach( function ( indices ) {\n\t\t\tnewIndices.forEach( function ( newIndex, oldIndex ) {\n\t\t\t\tnewIndices[ oldIndex ] = indices[ newIndex ];\n\t\t\t});\n\t\t});\n\n\t\t// This algorithm (for detaching incorrectly-ordered fragments from the DOM and\n\t\t// storing them in a document fragment for later reinsertion) seems a bit hokey,\n\t\t// but it seems to work for now\n\t\tvar len = this.context.get().length, oldLen = this.previousIterations.length;\n\t\tvar i;\n\t\tvar removed = {};\n\n\t\tnewIndices.forEach( function ( newIndex, oldIndex ) {\n\t\t\tvar fragment = this$1.previousIterations[ oldIndex ];\n\t\t\tthis$1.previousIterations[ oldIndex ] = null;\n\n\t\t\tif ( newIndex === -1 ) {\n\t\t\t\tremoved[ oldIndex ] = fragment;\n\t\t\t} else if ( fragment.index !== newIndex ) {\n\t\t\t\tvar model = this$1.context.joinKey( newIndex );\n\t\t\t\tfragment.index = fragment.key = newIndex;\n\t\t\t\tfragment.context = model;\n\t\t\t\tif ( this$1.owner.template.z ) {\n\t\t\t\t\tfragment.aliases = {};\n\t\t\t\t\tfragment.aliases[ this$1.owner.template.z[0].n ] = model;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// if the array was spliced outside of ractive, sometimes there are leftover fragments not in the newIndices\n\t\tthis.previousIterations.forEach( function ( frag, i ) {\n\t\t\tif ( frag ) removed[ i ] = frag;\n\t\t});\n\n\t\t// create new/move existing iterations\n\t\tvar docFrag = this.rendered ? createDocumentFragment() : null;\n\t\tvar parentNode = this.rendered ? this.parent.findParentNode() : null;\n\n\t\tvar contiguous = 'startIndex' in newIndices;\n\t\ti = contiguous ? newIndices.startIndex : 0;\n\n\t\tfor ( i; i < len; i++ ) {\n\t\t\tvar frag = this$1.iterations[i];\n\n\t\t\tif ( frag && contiguous ) {\n\t\t\t\t// attach any built-up iterations\n\t\t\t\tif ( this$1.rendered ) {\n\t\t\t\t\tif ( removed[i] ) docFrag.appendChild( removed[i].detach() );\n\t\t\t\t\tif ( docFrag.childNodes.length  ) parentNode.insertBefore( docFrag, frag.firstNode() );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !frag ) this$1.iterations[i] = this$1.createIteration( i, i );\n\n\t\t\tif ( this$1.rendered ) {\n\t\t\t\tif ( removed[i] ) docFrag.appendChild( removed[i].detach() );\n\n\t\t\t\tif ( frag ) docFrag.appendChild( frag.detach() );\n\t\t\t\telse {\n\t\t\t\t\tthis$1.iterations[i].render( docFrag );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// append any leftovers\n\t\tif ( this.rendered ) {\n\t\t\tfor ( i = len; i < oldLen; i++ ) {\n\t\t\t\tif ( removed[i] ) docFrag.appendChild( removed[i].detach() );\n\t\t\t}\n\n\t\t\tif ( docFrag.childNodes.length ) {\n\t\t\t\tparentNode.insertBefore( docFrag, this.owner.findNextNode() );\n\t\t\t}\n\t\t}\n\n\t\t// trigger removal on old nodes\n\t\tObject.keys( removed ).forEach( function ( k ) { return removed[k].unbind().unrender( true ); } );\n\n\t\tthis.iterations.forEach( update );\n\n\t\tthis.pendingNewIndices = null;\n\n\t\tthis.shuffled();\n\t};\n\n\tfunction isEmpty ( value ) {\n\t\treturn !value ||\n\t\t       ( isArray( value ) && value.length === 0 ) ||\n\t\t\t   ( isObject( value ) && Object.keys( value ).length === 0 );\n\t}\n\n\tfunction getType ( value, hasIndexRef ) {\n\t\tif ( hasIndexRef || isArray( value ) ) return SECTION_EACH;\n\t\tif ( isObject( value ) || typeof value === 'function' ) return SECTION_IF_WITH;\n\t\tif ( value === undefined ) return null;\n\t\treturn SECTION_IF;\n\t}\n\n\tvar Section = (function (Mustache) {\n\t\tfunction Section ( options ) {\n\t\t\tMustache.call( this, options );\n\n\t\t\tthis.sectionType = options.template.n || null;\n\t\t\tthis.templateSectionType = this.sectionType;\n\t\t\tthis.subordinate = options.template.l === 1;\n\t\t\tthis.fragment = null;\n\t\t}\n\n\t\tSection.prototype = Object.create( Mustache && Mustache.prototype );\n\t\tSection.prototype.constructor = Section;\n\n\t\tSection.prototype.bind = function bind () {\n\t\t\tMustache.prototype.bind.call(this);\n\n\t\t\tif ( this.subordinate ) {\n\t\t\t\tthis.sibling = this.parentFragment.items[ this.parentFragment.items.indexOf( this ) - 1 ];\n\t\t\t\tthis.sibling.nextSibling = this;\n\t\t\t}\n\n\t\t\t// if we managed to bind, we need to create children\n\t\t\tif ( this.model ) {\n\t\t\t\tthis.dirty = true;\n\t\t\t\tthis.update();\n\t\t\t} else if ( this.sectionType && this.sectionType === SECTION_UNLESS && ( !this.sibling || !this.sibling.isTruthy() ) ) {\n\t\t\t\tthis.fragment = new Fragment({\n\t\t\t\t\towner: this,\n\t\t\t\t\ttemplate: this.template.f\n\t\t\t\t}).bind();\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.detach = function detach () {\n\t\t\treturn this.fragment ? this.fragment.detach() : createDocumentFragment();\n\t\t};\n\n\t\tSection.prototype.find = function find ( selector ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.find( selector );\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.findAll = function findAll ( selector, query ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAll( selector, query );\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.findComponent = function findComponent ( name ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\treturn this.fragment.findComponent( name );\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\t\tif ( this.fragment ) {\n\t\t\t\tthis.fragment.findAllComponents( name, query );\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.firstNode = function firstNode ( skipParent ) {\n\t\t\treturn this.fragment && this.fragment.firstNode( skipParent );\n\t\t};\n\n\t\tSection.prototype.isTruthy = function isTruthy () {\n\t\t\tif ( this.subordinate && this.sibling.isTruthy() ) return true;\n\t\t\tvar value = !this.model ? undefined : this.model.isRoot ? this.model.value : this.model.get();\n\t\t\treturn !!value && ( this.templateSectionType === SECTION_IF_WITH || !isEmpty( value ) );\n\t\t};\n\n\t\tSection.prototype.rebinding = function rebinding ( next, previous, safe ) {\n\t\t\tif ( Mustache.prototype.rebinding.call( this, next, previous, safe ) ) {\n\t\t\t\tif ( this.fragment && this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS ) {\n\t\t\t\t\tthis.fragment.rebinding( next, previous );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.render = function render ( target, occupants ) {\n\t\t\tthis.rendered = true;\n\t\t\tif ( this.fragment ) this.fragment.render( target, occupants );\n\t\t};\n\n\t\tSection.prototype.shuffle = function shuffle ( newIndices ) {\n\t\t\tif ( this.fragment && this.sectionType === SECTION_EACH ) {\n\t\t\t\tthis.fragment.shuffle( newIndices );\n\t\t\t}\n\t\t};\n\n\t\tSection.prototype.toString = function toString ( escape ) {\n\t\t\treturn this.fragment ? this.fragment.toString( escape ) : '';\n\t\t};\n\n\t\tSection.prototype.unbind = function unbind () {\n\t\t\tMustache.prototype.unbind.call(this);\n\t\t\tif ( this.fragment ) this.fragment.unbind();\n\t\t};\n\n\t\tSection.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tif ( this.rendered && this.fragment ) this.fragment.unrender( shouldDestroy );\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tSection.prototype.update = function update () {\n\t\t\tif ( !this.dirty ) return;\n\n\t\t\tif ( this.fragment && this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS ) {\n\t\t\t\tthis.fragment.context = this.model;\n\t\t\t}\n\n\t\t\tif ( !this.model && this.sectionType !== SECTION_UNLESS ) return;\n\n\t\t\tthis.dirty = false;\n\n\t\t\tvar value = !this.model ? undefined : this.model.isRoot ? this.model.value : this.model.get();\n\t\t\tvar siblingFalsey = !this.subordinate || !this.sibling.isTruthy();\n\t\t\tvar lastType = this.sectionType;\n\n\t\t\t// watch for switching section types\n\t\t\tif ( this.sectionType === null || this.templateSectionType === null ) this.sectionType = getType( value, this.template.i );\n\t\t\tif ( lastType && lastType !== this.sectionType && this.fragment ) {\n\t\t\t\tif ( this.rendered ) {\n\t\t\t\t\tthis.fragment.unbind().unrender( true );\n\t\t\t\t}\n\n\t\t\t\tthis.fragment = null;\n\t\t\t}\n\n\t\t\tvar newFragment;\n\n\t\t\tvar fragmentShouldExist = this.sectionType === SECTION_EACH || // each always gets a fragment, which may have no iterations\n\t\t\t                            this.sectionType === SECTION_WITH || // with (partial context) always gets a fragment\n\t\t\t                            ( siblingFalsey && ( this.sectionType === SECTION_UNLESS ? !this.isTruthy() : this.isTruthy() ) ); // if, unless, and if-with depend on siblings and the condition\n\n\t\t\tif ( fragmentShouldExist ) {\n\t\t\t\tif ( this.fragment ) {\n\t\t\t\t\tthis.fragment.update();\n\t\t\t\t} else {\n\t\t\t\t\tif ( this.sectionType === SECTION_EACH ) {\n\t\t\t\t\t\tnewFragment = new RepeatedFragment({\n\t\t\t\t\t\t\towner: this,\n\t\t\t\t\t\t\ttemplate: this.template.f,\n\t\t\t\t\t\t\tindexRef: this.template.i\n\t\t\t\t\t\t}).bind( this.model );\n\t\t\t\t\t} else {\n\t\t \t\t\t\t// only with and if-with provide context - if and unless do not\n\t\t\t\t\t\tvar context = this.sectionType !== SECTION_IF && this.sectionType !== SECTION_UNLESS ? this.model : null;\n\t\t\t\t\t\tnewFragment = new Fragment({\n\t\t\t\t\t\t\towner: this,\n\t\t\t\t\t\t\ttemplate: this.template.f\n\t\t\t\t\t\t}).bind( context );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( this.fragment ) {\n\t\t\t\t\tthis.fragment.unbind();\n\t\t\t\t\tif ( this.rendered ) this.fragment.unrender( true );\n\t\t\t\t}\n\n\t\t\t\tthis.fragment = null;\n\t\t\t}\n\n\t\t\tif ( newFragment ) {\n\t\t\t\tif ( this.rendered ) {\n\t\t\t\t\tvar parentNode = this.parentFragment.findParentNode();\n\t\t\t\t\tvar anchor = this.parentFragment.findNextNode( this );\n\n\t\t\t\t\tif ( anchor ) {\n\t\t\t\t\t\tvar docFrag = createDocumentFragment();\n\t\t\t\t\t\tnewFragment.render( docFrag );\n\n\t\t\t\t\t\t// we use anchor.parentNode, not parentNode, because the sibling\n\t\t\t\t\t\t// may be temporarily detached as a result of a shuffle\n\t\t\t\t\t\tanchor.parentNode.insertBefore( docFrag, anchor );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewFragment.render( parentNode );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.fragment = newFragment;\n\t\t\t}\n\n\t\t\tif ( this.nextSibling ) {\n\t\t\t\tthis.nextSibling.dirty = true;\n\t\t\t\tthis.nextSibling.update();\n\t\t\t}\n\t\t};\n\n\t\treturn Section;\n\t}(Mustache));\n\n\tfunction valueContains ( selectValue, optionValue ) {\n\t\tvar i = selectValue.length;\n\t\twhile ( i-- ) {\n\t\t\tif ( selectValue[i] == optionValue ) return true;\n\t\t}\n\t}\n\n\tvar Select = (function (Element) {\n\t\tfunction Select ( options ) {\n\t\t\tElement.call( this, options );\n\t\t\tthis.options = [];\n\t\t}\n\n\t\tSelect.prototype = Object.create( Element && Element.prototype );\n\t\tSelect.prototype.constructor = Select;\n\n\t\tSelect.prototype.foundNode = function foundNode ( node ) {\n\t\t\tif ( this.binding ) {\n\t\t\t\tvar selectedOptions = getSelectedOptions( node );\n\n\t\t\t\tif ( selectedOptions.length > 0 ) {\n\t\t\t\t\tthis.selectedOptions = selectedOptions;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tSelect.prototype.render = function render ( target, occupants ) {\n\t\t\tElement.prototype.render.call( this, target, occupants );\n\t\t\tthis.sync();\n\n\t\t\tvar node = this.node;\n\n\t\t\tvar i = node.options.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tnode.options[i].defaultSelected = node.options[i].selected;\n\t\t\t}\n\n\t\t\tthis.rendered = true;\n\t\t};\n\n\t\tSelect.prototype.sync = function sync () {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar selectNode = this.node;\n\n\t\t\tif ( !selectNode ) return;\n\n\t\t\tvar options = toArray( selectNode.options );\n\n\t\t\tif ( this.selectedOptions ) {\n\t\t\t\toptions.forEach( function ( o ) {\n\t\t\t\t\tif ( this$1.selectedOptions.indexOf( o ) >= 0 ) o.selected = true;\n\t\t\t\t\telse o.selected = false;\n\t\t\t\t});\n\t\t\t\tthis.binding.setFromNode( selectNode );\n\t\t\t\tdelete this.selectedOptions;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar selectValue = this.getAttribute( 'value' );\n\t\t\tvar isMultiple = this.getAttribute( 'multiple' );\n\t\t\tvar array = isMultiple && isArray( selectValue );\n\n\t\t\t// If the <select> has a specified value, that should override\n\t\t\t// these options\n\t\t\tif ( selectValue !== undefined ) {\n\t\t\t\tvar optionWasSelected;\n\n\t\t\t\toptions.forEach( function ( o ) {\n\t\t\t\t\tvar optionValue = o._ractive ? o._ractive.value : o.value;\n\t\t\t\t\tvar shouldSelect = isMultiple ? array && valueContains( selectValue, optionValue ) : selectValue == optionValue;\n\n\t\t\t\t\tif ( shouldSelect ) {\n\t\t\t\t\t\toptionWasSelected = true;\n\t\t\t\t\t}\n\n\t\t\t\t\to.selected = shouldSelect;\n\t\t\t\t});\n\n\t\t\t\tif ( !optionWasSelected && !isMultiple ) {\n\t\t\t\t\tif ( this.binding ) {\n\t\t\t\t\t\tthis.binding.forceUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Otherwise the value should be initialised according to which\n\t\t\t// <option> element is selected, if twoway binding is in effect\n\t\t\telse if ( this.binding ) {\n\t\t\t\tthis.binding.forceUpdate();\n\t\t\t}\n\t\t};\n\n\t\tSelect.prototype.update = function update () {\n\t\t\tvar dirty = this.dirty;\n\t\t\tElement.prototype.update.call(this);\n\t\t\tif ( dirty ) {\n\t\t\t\tthis.sync();\n\t\t\t}\n\t\t};\n\n\t\treturn Select;\n\t}(Element));\n\n\tvar Textarea = (function (Input) {\n\t\tfunction Textarea( options ) {\n\t\t\tvar template = options.template;\n\n\t\t\toptions.deferContent = true;\n\n\t\t\tInput.call( this, options );\n\n\t\t\t// check for single interpolator binding\n\t\t\tif ( !this.attributeByName.value ) {\n\t\t\t\tif ( template.f && isBindable( { template: template } ) ) {\n\t\t\t\t\tthis.attributes.push( createItem( {\n\t\t\t\t\t\towner: this,\n\t\t\t\t\t\ttemplate: { t: ATTRIBUTE, f: template.f, n: 'value' },\n\t\t\t\t\t\tparentFragment: this.parentFragment\n\t\t\t\t\t} ) );\n\t\t\t\t} else {\n\t\t\t\t\tthis.fragment = new Fragment({ owner: this, cssIds: null, template: template.f });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tTextarea.prototype = Object.create( Input && Input.prototype );\n\t\tTextarea.prototype.constructor = Textarea;\n\n\t\tTextarea.prototype.bubble = function bubble () {\n\t\t\tvar this$1 = this;\n\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.dirty = true;\n\n\t\t\t\tif ( this.rendered && !this.binding && this.fragment ) {\n\t\t\t\t\trunloop.scheduleTask( function () {\n\t\t\t\t\t\tthis$1.dirty = false;\n\t\t\t\t\t\tthis$1.node.value = this$1.fragment.toString();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.parentFragment.bubble(); // default behaviour\n\t\t\t}\n\t\t};\n\n\t\treturn Textarea;\n\t}(Input));\n\n\tvar Text = (function (Item) {\n\t\tfunction Text ( options ) {\n\t\t\tItem.call( this, options );\n\t\t\tthis.type = TEXT;\n\t\t}\n\n\t\tText.prototype = Object.create( Item && Item.prototype );\n\t\tText.prototype.constructor = Text;\n\n\t\tText.prototype.bind = function bind () {\n\t\t\t// noop\n\t\t};\n\n\t\tText.prototype.detach = function detach () {\n\t\t\treturn detachNode( this.node );\n\t\t};\n\n\t\tText.prototype.firstNode = function firstNode () {\n\t\t\treturn this.node;\n\t\t};\n\n\t\tText.prototype.render = function render ( target, occupants ) {\n\t\t\tif ( inAttributes() ) return;\n\t\t\tthis.rendered = true;\n\n\t\t\tif ( occupants ) {\n\t\t\t\tvar n = occupants[0];\n\t\t\t\tif ( n && n.nodeType === 3 ) {\n\t\t\t\t\toccupants.shift();\n\t\t\t\t\tif ( n.nodeValue !== this.template ) {\n\t\t\t\t\t\tn.nodeValue = this.template;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tn = this.node = doc.createTextNode( this.template );\n\t\t\t\t\tif ( occupants[0] ) {\n\t\t\t\t\t\ttarget.insertBefore( n, occupants[0] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.appendChild( n );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.node = n;\n\t\t\t} else {\n\t\t\t\tthis.node = doc.createTextNode( this.template );\n\t\t\t\ttarget.appendChild( this.node );\n\t\t\t}\n\t\t};\n\n\t\tText.prototype.toString = function toString ( escape ) {\n\t\t\treturn escape ? escapeHtml( this.template ) : this.template;\n\t\t};\n\n\t\tText.prototype.unbind = function unbind () {\n\t\t\t// noop\n\t\t};\n\n\t\tText.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tif ( this.rendered && shouldDestroy ) this.detach();\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tText.prototype.update = function update () {\n\t\t\t// noop\n\t\t};\n\n\t\tText.prototype.valueOf = function valueOf () {\n\t\t\treturn this.template;\n\t\t};\n\n\t\treturn Text;\n\t}(Item));\n\n\tfunction camelCase ( hyphenatedStr ) {\n\t\treturn hyphenatedStr.replace( /-([a-zA-Z])/g, function ( match, $1 ) {\n\t\t\treturn $1.toUpperCase();\n\t\t});\n\t}\n\n\tvar prefix;\n\n\tif ( !isClient ) {\n\t\tprefix = null;\n\t} else {\n\t\tvar prefixCache = {};\n\t\tvar testStyle = createElement( 'div' ).style;\n\n\t\tprefix = function ( prop ) {\n\t\t\tprop = camelCase( prop );\n\n\t\t\tif ( !prefixCache[ prop ] ) {\n\t\t\t\tif ( testStyle[ prop ] !== undefined ) {\n\t\t\t\t\tprefixCache[ prop ] = prop;\n\t\t\t\t}\n\n\t\t\t\telse {\n\t\t\t\t\t// test vendors...\n\t\t\t\t\tvar capped = prop.charAt( 0 ).toUpperCase() + prop.substring( 1 );\n\n\t\t\t\t\tvar i = vendors.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tvar vendor = vendors[i];\n\t\t\t\t\t\tif ( testStyle[ vendor + capped ] !== undefined ) {\n\t\t\t\t\t\t\tprefixCache[ prop ] = vendor + capped;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn prefixCache[ prop ];\n\t\t};\n\t}\n\n\tvar prefix$1 = prefix;\n\n\tvar visible;\n\tvar hidden = 'hidden';\n\n\tif ( doc ) {\n\t\tvar prefix$2;\n\n\t\tif ( hidden in doc ) {\n\t\t\tprefix$2 = '';\n\t\t} else {\n\t\t\tvar i$1 = vendors.length;\n\t\t\twhile ( i$1-- ) {\n\t\t\t\tvar vendor = vendors[i$1];\n\t\t\t\thidden = vendor + 'Hidden';\n\n\t\t\t\tif ( hidden in doc ) {\n\t\t\t\t\tprefix$2 = vendor;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( prefix$2 !== undefined ) {\n\t\t\tdoc.addEventListener( prefix$2 + 'visibilitychange', onChange );\n\t\t\tonChange();\n\t\t} else {\n\t\t\t// gah, we're in an old browser\n\t\t\tif ( 'onfocusout' in doc ) {\n\t\t\t\tdoc.addEventListener( 'focusout', onHide );\n\t\t\t\tdoc.addEventListener( 'focusin', onShow );\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\twin.addEventListener( 'pagehide', onHide );\n\t\t\t\twin.addEventListener( 'blur', onHide );\n\n\t\t\t\twin.addEventListener( 'pageshow', onShow );\n\t\t\t\twin.addEventListener( 'focus', onShow );\n\t\t\t}\n\n\t\t\tvisible = true; // until proven otherwise. Not ideal but hey\n\t\t}\n\t}\n\n\tfunction onChange () {\n\t\tvisible = !doc[ hidden ];\n\t}\n\n\tfunction onHide () {\n\t\tvisible = false;\n\t}\n\n\tfunction onShow () {\n\t\tvisible = true;\n\t}\n\n\tvar unprefixPattern = new RegExp( '^-(?:' + vendors.join( '|' ) + ')-' );\n\n\tfunction unprefix ( prop ) {\n\t\treturn prop.replace( unprefixPattern, '' );\n\t}\n\n\tvar vendorPattern = new RegExp( '^(?:' + vendors.join( '|' ) + ')([A-Z])' );\n\n\tfunction hyphenate ( str ) {\n\t\tif ( !str ) return ''; // edge case\n\n\t\tif ( vendorPattern.test( str ) ) str = '-' + str;\n\n\t\treturn str.replace( /[A-Z]/g, function ( match ) { return '-' + match.toLowerCase(); } );\n\t}\n\n\tvar createTransitions;\n\n\tif ( !isClient ) {\n\t\tcreateTransitions = null;\n\t} else {\n\t\tvar testStyle$1 = createElement( 'div' ).style;\n\t\tvar linear$1 = function ( x ) { return x; };\n\n\t\tvar canUseCssTransitions = {};\n\t\tvar cannotUseCssTransitions = {};\n\n\t\t// determine some facts about our environment\n\t\tvar TRANSITION$1;\n\t\tvar TRANSITIONEND;\n\t\tvar CSS_TRANSITIONS_ENABLED;\n\t\tvar TRANSITION_DURATION;\n\t\tvar TRANSITION_PROPERTY;\n\t\tvar TRANSITION_TIMING_FUNCTION;\n\n\t\tif ( testStyle$1.transition !== undefined ) {\n\t\t\tTRANSITION$1 = 'transition';\n\t\t\tTRANSITIONEND = 'transitionend';\n\t\t\tCSS_TRANSITIONS_ENABLED = true;\n\t\t} else if ( testStyle$1.webkitTransition !== undefined ) {\n\t\t\tTRANSITION$1 = 'webkitTransition';\n\t\t\tTRANSITIONEND = 'webkitTransitionEnd';\n\t\t\tCSS_TRANSITIONS_ENABLED = true;\n\t\t} else {\n\t\t\tCSS_TRANSITIONS_ENABLED = false;\n\t\t}\n\n\t\tif ( TRANSITION$1 ) {\n\t\t\tTRANSITION_DURATION = TRANSITION$1 + 'Duration';\n\t\t\tTRANSITION_PROPERTY = TRANSITION$1 + 'Property';\n\t\t\tTRANSITION_TIMING_FUNCTION = TRANSITION$1 + 'TimingFunction';\n\t\t}\n\n\t\tcreateTransitions = function ( t, to, options, changedProperties, resolve ) {\n\n\t\t\t// Wait a beat (otherwise the target styles will be applied immediately)\n\t\t\t// TODO use a fastdom-style mechanism?\n\t\t\tsetTimeout( function () {\n\t\t\t\tvar jsTransitionsComplete;\n\t\t\t\tvar cssTransitionsComplete;\n\t\t\t\tvar cssTimeout;\n\n\t\t\t\tfunction transitionDone () { clearTimeout( cssTimeout ); }\n\n\t\t\t\tfunction checkComplete () {\n\t\t\t\t\tif ( jsTransitionsComplete && cssTransitionsComplete ) {\n\t\t\t\t\t\tt.unregisterCompleteHandler( transitionDone );\n\t\t\t\t\t\t// will changes to events and fire have an unexpected consequence here?\n\t\t\t\t\t\tt.ractive.fire( t.name + ':end', t.node, t.isIntro );\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// this is used to keep track of which elements can use CSS to animate\n\t\t\t\t// which properties\n\t\t\t\tvar hashPrefix = ( t.node.namespaceURI || '' ) + t.node.tagName;\n\n\t\t\t\t// need to reset transition properties\n\t\t\t\tvar style = t.node.style;\n\t\t\t\tvar previous = {\n\t\t\t\t\tproperty: style[ TRANSITION_PROPERTY ],\n\t\t\t\t\ttiming: style[ TRANSITION_TIMING_FUNCTION ],\n\t\t\t\t\tduration: style[ TRANSITION_DURATION ]\n\t\t\t\t};\n\n\t\t\t\tstyle[ TRANSITION_PROPERTY ] = changedProperties.map( prefix$1 ).map( hyphenate ).join( ',' );\n\t\t\t\tstyle[ TRANSITION_TIMING_FUNCTION ] = hyphenate( options.easing || 'linear' );\n\t\t\t\tstyle[ TRANSITION_DURATION ] = ( options.duration / 1000 ) + 's';\n\n\t\t\t\tfunction transitionEndHandler ( event ) {\n\t\t\t\t\tvar index = changedProperties.indexOf( camelCase( unprefix( event.propertyName ) ) );\n\n\t\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\t\tchangedProperties.splice( index, 1 );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( changedProperties.length ) {\n\t\t\t\t\t\t// still transitioning...\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tclearTimeout( cssTimeout );\n\t\t\t\t\tcssTransitionsDone();\n\t\t\t\t}\n\n\t\t\t\tfunction cssTransitionsDone () {\n\t\t\t\t\tstyle[ TRANSITION_PROPERTY ] = previous.property;\n\t\t\t\t\tstyle[ TRANSITION_TIMING_FUNCTION ] = previous.duration;\n\t\t\t\t\tstyle[ TRANSITION_DURATION ] = previous.timing;\n\n\t\t\t\t\tt.node.removeEventListener( TRANSITIONEND, transitionEndHandler, false );\n\n\t\t\t\t\tcssTransitionsComplete = true;\n\t\t\t\t\tcheckComplete();\n\t\t\t\t}\n\n\t\t\t\tt.node.addEventListener( TRANSITIONEND, transitionEndHandler, false );\n\n\t\t\t\t// safety net in case transitionend never fires\n\t\t\t\tcssTimeout = setTimeout( function () {\n\t\t\t\t\tchangedProperties = [];\n\t\t\t\t\tcssTransitionsDone();\n\t\t\t\t}, options.duration + ( options.delay || 0 ) + 50 );\n\t\t\t\tt.registerCompleteHandler( transitionDone );\n\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tvar i = changedProperties.length;\n\t\t\t\t\tvar hash;\n\t\t\t\t\tvar originalValue;\n\t\t\t\t\tvar index;\n\t\t\t\t\tvar propertiesToTransitionInJs = [];\n\t\t\t\t\tvar prop;\n\t\t\t\t\tvar suffix;\n\t\t\t\t\tvar interpolator;\n\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tprop = changedProperties[i];\n\t\t\t\t\t\thash = hashPrefix + prop;\n\n\t\t\t\t\t\tif ( CSS_TRANSITIONS_ENABLED && !cannotUseCssTransitions[ hash ] ) {\n\t\t\t\t\t\t\tstyle[ prefix$1( prop ) ] = to[ prop ];\n\n\t\t\t\t\t\t\t// If we're not sure if CSS transitions are supported for\n\t\t\t\t\t\t\t// this tag/property combo, find out now\n\t\t\t\t\t\t\tif ( !canUseCssTransitions[ hash ] ) {\n\t\t\t\t\t\t\t\toriginalValue = t.getStyle( prop );\n\n\t\t\t\t\t\t\t\t// if this property is transitionable in this browser,\n\t\t\t\t\t\t\t\t// the current style will be different from the target style\n\t\t\t\t\t\t\t\tcanUseCssTransitions[ hash ] = ( t.getStyle( prop ) != to[ prop ] );\n\t\t\t\t\t\t\t\tcannotUseCssTransitions[ hash ] = !canUseCssTransitions[ hash ];\n\n\t\t\t\t\t\t\t\t// Reset, if we're going to use timers after all\n\t\t\t\t\t\t\t\tif ( cannotUseCssTransitions[ hash ] ) {\n\t\t\t\t\t\t\t\t\tstyle[ prefix$1( prop ) ] = originalValue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( !CSS_TRANSITIONS_ENABLED || cannotUseCssTransitions[ hash ] ) {\n\t\t\t\t\t\t\t// we need to fall back to timer-based stuff\n\t\t\t\t\t\t\tif ( originalValue === undefined ) {\n\t\t\t\t\t\t\t\toriginalValue = t.getStyle( prop );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// need to remove this from changedProperties, otherwise transitionEndHandler\n\t\t\t\t\t\t\t// will get confused\n\t\t\t\t\t\t\tindex = changedProperties.indexOf( prop );\n\t\t\t\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\t\t\t\twarnIfDebug( 'Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!', { node: t.node });\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedProperties.splice( index, 1 );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// TODO Determine whether this property is animatable at all\n\n\t\t\t\t\t\t\tsuffix = /[^\\d]*$/.exec( to[ prop ] )[0];\n\t\t\t\t\t\t\tinterpolator = interpolate( parseFloat( originalValue ), parseFloat( to[ prop ] ) ) || ( function () { return to[ prop ]; } );\n\n\t\t\t\t\t\t\t// ...then kick off a timer-based transition\n\t\t\t\t\t\t\tpropertiesToTransitionInJs.push({\n\t\t\t\t\t\t\t\tname: prefix$1( prop ),\n\t\t\t\t\t\t\t\tinterpolator: interpolator,\n\t\t\t\t\t\t\t\tsuffix: suffix\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// javascript transitions\n\t\t\t\t\tif ( propertiesToTransitionInJs.length ) {\n\t\t\t\t\t\tvar easing;\n\n\t\t\t\t\t\tif ( typeof options.easing === 'string' ) {\n\t\t\t\t\t\t\teasing = t.ractive.easing[ options.easing ];\n\n\t\t\t\t\t\t\tif ( !easing ) {\n\t\t\t\t\t\t\t\twarnOnceIfDebug( missingPlugin( options.easing, 'easing' ) );\n\t\t\t\t\t\t\t\teasing = linear$1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( typeof options.easing === 'function' ) {\n\t\t\t\t\t\t\teasing = options.easing;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teasing = linear$1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnew Ticker({\n\t\t\t\t\t\t\tduration: options.duration,\n\t\t\t\t\t\t\teasing: easing,\n\t\t\t\t\t\t\tstep: function ( pos ) {\n\t\t\t\t\t\t\t\tvar i = propertiesToTransitionInJs.length;\n\t\t\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\t\t\tvar prop = propertiesToTransitionInJs[i];\n\t\t\t\t\t\t\t\t\tt.node.style[ prop.name ] = prop.interpolator( pos ) + prop.suffix;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcomplete: function () {\n\t\t\t\t\t\t\t\tjsTransitionsComplete = true;\n\t\t\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjsTransitionsComplete = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !changedProperties.length ) {\n\t\t\t\t\t\t// We need to cancel the transitionEndHandler, and deal with\n\t\t\t\t\t\t// the fact that it will never fire\n\t\t\t\t\t\tt.node.removeEventListener( TRANSITIONEND, transitionEndHandler, false );\n\t\t\t\t\t\tcssTransitionsComplete = true;\n\t\t\t\t\t\tcheckComplete();\n\t\t\t\t\t}\n\t\t\t\t}, 0 );\n\t\t\t}, options.delay || 0 );\n\t\t};\n\t}\n\n\tvar createTransitions$1 = createTransitions;\n\n\tfunction resetStyle ( node, style ) {\n\t\tif ( style ) {\n\t\t\tnode.setAttribute( 'style', style );\n\t\t} else {\n\t\t\t// Next line is necessary, to remove empty style attribute!\n\t\t\t// See http://stackoverflow.com/a/7167553\n\t\t\tnode.getAttribute( 'style' );\n\t\t\tnode.removeAttribute( 'style' );\n\t\t}\n\t}\n\n\tvar getComputedStyle = win && ( win.getComputedStyle || legacy.getComputedStyle );\n\tvar resolved = Promise$1.resolve();\n\n\tvar names = {\n\t\tt0: 'intro-outro',\n\t\tt1: 'intro',\n\t\tt2: 'outro'\n\t};\n\n\tvar Transition = function Transition ( options ) {\n\t\tthis.owner = options.owner || options.parentFragment.owner || findElement( options.parentFragment );\n\t\tthis.element = this.owner.attributeByName ? this.owner : findElement( options.parentFragment );\n\t\tthis.ractive = this.owner.ractive;\n\t\tthis.template = options.template;\n\t\tthis.parentFragment = options.parentFragment;\n\t\tthis.options = options;\n\t\tthis.onComplete = [];\n\t};\n\n\tTransition.prototype.animateStyle = function animateStyle ( style, value, options ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( arguments.length === 4 ) {\n\t\t\tthrow new Error( 't.animateStyle() returns a promise - use .then() instead of passing a callback' );\n\t\t}\n\n\t\t// Special case - page isn't visible. Don't animate anything, because\n\t\t// that way you'll never get CSS transitionend events\n\t\tif ( !visible ) {\n\t\t\tthis.setStyle( style, value );\n\t\t\treturn resolved;\n\t\t}\n\n\t\tvar to;\n\n\t\tif ( typeof style === 'string' ) {\n\t\t\tto = {};\n\t\t\tto[ style ] = value;\n\t\t} else {\n\t\t\tto = style;\n\n\t\t\t// shuffle arguments\n\t\t\toptions = value;\n\t\t}\n\n\t\t// As of 0.3.9, transition authors should supply an `option` object with\n\t\t// `duration` and `easing` properties (and optional `delay`), plus a\n\t\t// callback function that gets called after the animation completes\n\n\t\t// TODO remove this check in a future version\n\t\tif ( !options ) {\n\t\t\twarnOnceIfDebug( 'The \"%s\" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340', this.name );\n\t\t\toptions = this;\n\t\t}\n\n\t\treturn new Promise$1( function ( fulfil ) {\n\t\t\t// Edge case - if duration is zero, set style synchronously and complete\n\t\t\tif ( !options.duration ) {\n\t\t\t\tthis$1.setStyle( to );\n\t\t\t\tfulfil();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get a list of the properties we're animating\n\t\t\tvar propertyNames = Object.keys( to );\n\t\t\tvar changedProperties = [];\n\n\t\t\t// Store the current styles\n\t\t\tvar computedStyle = getComputedStyle( this$1.node );\n\n\t\t\tvar i = propertyNames.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tvar prop = propertyNames[i];\n\t\t\t\tvar current = computedStyle[ prefix$1( prop ) ];\n\n\t\t\t\tif ( current === '0px' ) current = 0;\n\n\t\t\t\t// we need to know if we're actually changing anything\n\t\t\t\tif ( current != to[ prop ] ) { // use != instead of !==, so we can compare strings with numbers\n\t\t\t\t\tchangedProperties.push( prop );\n\n\t\t\t\t\t// make the computed style explicit, so we can animate where\n\t\t\t\t\t// e.g. height='auto'\n\t\t\t\t\tthis$1.node.style[ prefix$1( prop ) ] = current;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we're not actually changing anything, the transitionend event\n\t\t\t// will never fire! So we complete early\n\t\t\tif ( !changedProperties.length ) {\n\t\t\t\tfulfil();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcreateTransitions$1( this$1, to, options, changedProperties, fulfil );\n\t\t});\n\t};\n\n\tTransition.prototype.bind = function bind () {\n\t\tvar this$1 = this;\n\n\t\t\tvar options = this.options;\n\t\tvar type = options.template && options.template.v;\n\t\tif ( type ) {\n\t\t\tif ( type === 't0' || type === 't1' ) this.element._introTransition = this;\n\t\t\tif ( type === 't0' || type === 't2' ) this.element._outroTransition = this;\n\t\t\tthis.eventName = names[ type ];\n\t\t}\n\n\t\tvar ractive = this.owner.ractive;\n\n\t\tif ( options.name ) {\n\t\t\tthis.name = options.name;\n\t\t} else {\n\t\t\tvar name = options.template.f;\n\t\t\tif ( typeof name.n === 'string' ) name = name.n;\n\n\t\t\tif ( typeof name !== 'string' ) {\n\t\t\t\tvar fragment = new Fragment({\n\t\t\t\t\towner: this.owner,\n\t\t\t\t\ttemplate: name.n\n\t\t\t\t}).bind(); // TODO need a way to capture values without bind()\n\n\t\t\t\tname = fragment.toString();\n\t\t\t\tfragment.unbind();\n\n\t\t\t\tif ( name === '' ) {\n\t\t\t\t\t// empty string okay, just no transition\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.name = name;\n\t\t}\n\n\t\tif ( options.params ) {\n\t\t\tthis.params = options.params;\n\t\t} else {\n\t\t\tif ( options.template.f.a && !options.template.f.a.s ) {\n\t\t\t\tthis.params = options.template.f.a;\n\t\t\t}\n\n\t\t\telse if ( options.template.f.d ) {\n\t\t\t\t// TODO is there a way to interpret dynamic arguments without all the\n\t\t\t\t// 'dependency thrashing'?\n\t\t\t\tvar fragment$1 = new Fragment({\n\t\t\t\t\towner: this.owner,\n\t\t\t\t\ttemplate: options.template.f.d\n\t\t\t\t}).bind();\n\n\t\t\t\tthis.params = fragment$1.getArgsList();\n\t\t\t\tfragment$1.unbind();\n\t\t\t}\n\t\t}\n\n\t\tif ( typeof this.name === 'function' ) {\n\t\t\tthis._fn = this.name;\n\t\t\tthis.name = this._fn.name;\n\t\t} else {\n\t\t\tthis._fn = findInViewHierarchy( 'transitions', ractive, this.name );\n\t\t}\n\n\t\tif ( !this._fn ) {\n\t\t\twarnOnceIfDebug( missingPlugin( this.name, 'transition' ), { ractive: ractive });\n\t\t}\n\n\t\t// TODO: dry up after deprecation is done\n\t\tif ( options.template && this.template.f.a && this.template.f.a.s ) {\n\t\t\tthis.resolvers = [];\n\t\t\tthis.models = this.template.f.a.r.map( function ( ref, i ) {\n\t\t\t\tvar resolver;\n\t\t\t\tvar model = resolveReference( this$1.parentFragment, ref );\n\t\t\t\tif ( !model ) {\n\t\t\t\t\tresolver = this$1.parentFragment.resolve( ref, function ( model ) {\n\t\t\t\t\t\tthis$1.models[i] = model;\n\t\t\t\t\t\tremoveFromArray( this$1.resolvers, resolver );\n\t\t\t\t\t\tmodel.register( this$1 );\n\t\t\t\t\t});\n\n\t\t\t\t\tthis$1.resolvers.push( resolver );\n\t\t\t\t} else model.register( this$1 );\n\n\t\t\t\treturn model;\n\t\t\t});\n\t\t\tthis.argsFn = getFunction( this.template.f.a.s, this.template.f.a.r.length );\n\t\t}\n\t};\n\n\tTransition.prototype.destroyed = function destroyed () {};\n\n\tTransition.prototype.getStyle = function getStyle ( props ) {\n\t\tvar computedStyle = getComputedStyle( this.node );\n\n\t\tif ( typeof props === 'string' ) {\n\t\t\tvar value = computedStyle[ prefix$1( props ) ];\n\t\t\treturn value === '0px' ? 0 : value;\n\t\t}\n\n\t\tif ( !isArray( props ) ) {\n\t\t\tthrow new Error( 'Transition$getStyle must be passed a string, or an array of strings representing CSS properties' );\n\t\t}\n\n\t\tvar styles = {};\n\n\t\tvar i = props.length;\n\t\twhile ( i-- ) {\n\t\t\tvar prop = props[i];\n\t\t\tvar value$1 = computedStyle[ prefix$1( prop ) ];\n\n\t\t\tif ( value$1 === '0px' ) value$1 = 0;\n\t\t\tstyles[ prop ] = value$1;\n\t\t}\n\n\t\treturn styles;\n\t};\n\n\tTransition.prototype.handleChange = function handleChange () {};\n\n\tTransition.prototype.processParams = function processParams ( params, defaults ) {\n\t\tif ( typeof params === 'number' ) {\n\t\t\tparams = { duration: params };\n\t\t}\n\n\t\telse if ( typeof params === 'string' ) {\n\t\t\tif ( params === 'slow' ) {\n\t\t\t\tparams = { duration: 600 };\n\t\t\t} else if ( params === 'fast' ) {\n\t\t\t\tparams = { duration: 200 };\n\t\t\t} else {\n\t\t\t\tparams = { duration: 400 };\n\t\t\t}\n\t\t} else if ( !params ) {\n\t\t\tparams = {};\n\t\t}\n\n\t\treturn extendObj( {}, defaults, params );\n\t};\n\n\tTransition.prototype.rebinding = function rebinding ( next, previous ) {\n\t\tvar idx = this.models.indexOf( previous );\n\t\tif ( !~idx ) return;\n\n\t\tnext = rebindMatch( this.template.f.a.r[ idx ], next, previous );\n\t\tif ( next === previous ) return;\n\n\t\tprevious.unregister( this );\n\t\tthis.models.splice( idx, 1, next );\n\t\tif ( next ) next.addShuffleRegister( this, 'mark' );\n\t};\n\n\tTransition.prototype.registerCompleteHandler = function registerCompleteHandler ( fn ) {\n\t\taddToArray( this.onComplete, fn );\n\t};\n\n\tTransition.prototype.render = function render () {};\n\n\tTransition.prototype.setStyle = function setStyle ( style, value ) {\n\t\tif ( typeof style === 'string' ) {\n\t\t\tthis.node.style[ prefix$1( style ) ] = value;\n\t\t}\n\n\t\telse {\n\t\t\tvar prop;\n\t\t\tfor ( prop in style ) {\n\t\t\t\tif ( style.hasOwnProperty( prop ) ) {\n\t\t\t\t\tthis.node.style[ prefix$1( prop ) ] = style[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tTransition.prototype.start = function start () {\n\t\tvar this$1 = this;\n\n\t\t\tvar node = this.node = this.element.node;\n\t\tvar originalStyle = node.getAttribute( 'style' );\n\n\t\tvar completed;\n\t\tvar args = this.params;\n\n\t\t// create t.complete() - we don't want this on the prototype,\n\t\t// because we don't want `this` silliness when passing it as\n\t\t// an argument\n\t\tthis.complete = function ( noReset ) {\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis$1.onComplete.forEach( function ( fn ) { return fn(); } );\n\t\t\tif ( !noReset && this$1.isIntro ) {\n\t\t\t\tresetStyle( node, originalStyle);\n\t\t\t}\n\n\t\t\tthis$1._manager.remove( this$1 );\n\n\t\t\tcompleted = true;\n\t\t};\n\n\t\t// If the transition function doesn't exist, abort\n\t\tif ( !this._fn ) {\n\t\t\tthis.complete();\n\t\t\treturn;\n\t\t}\n\n\t\t// get expression args if supplied\n\t\tif ( this.argsFn ) {\n\t\t\tvar values = this.models.map( function ( model ) {\n\t\t\t\tif ( !model ) return undefined;\n\n\t\t\t\treturn model.get();\n\t\t\t});\n\t\t\targs = this.argsFn.apply( this.ractive, values );\n\t\t}\n\n\t\tvar promise = this._fn.apply( this.ractive, [ this ].concat( args ) );\n\t\tif ( promise ) promise.then( this.complete );\n\t};\n\n\tTransition.prototype.toString = function toString () { return ''; };\n\n\tTransition.prototype.unbind = function unbind$1 () {\n\t\tif ( this.resolvers ) this.resolvers.forEach( unbind );\n\t\tif ( !this.element.attributes.unbinding ) {\n\t\t\tvar type = this.options && this.options.template && this.options.template.v;\n\t\t\tif ( type === 't0' || type === 't1' ) this.element._introTransition = null;\n\t\t\tif ( type === 't0' || type === 't2' ) this.element._outroTransition = null;\n\t\t}\n\t};\n\n\tTransition.prototype.unregisterCompleteHandler = function unregisterCompleteHandler ( fn ) {\n\t\tremoveFromArray( this.onComplete, fn );\n\t};\n\n\tTransition.prototype.unrender = function unrender () {};\n\n\tTransition.prototype.update = function update () {};\n\n\tvar elementCache = {};\n\n\tvar ieBug;\n\tvar ieBlacklist;\n\n\ttry {\n\t\tcreateElement( 'table' ).innerHTML = 'foo';\n\t} catch ( err ) {\n\t\tieBug = true;\n\n\t\tieBlacklist = {\n\t\t\tTABLE:  [ '<table class=\"x\">', '</table>' ],\n\t\t\tTHEAD:  [ '<table><thead class=\"x\">', '</thead></table>' ],\n\t\t\tTBODY:  [ '<table><tbody class=\"x\">', '</tbody></table>' ],\n\t\t\tTR:     [ '<table><tr class=\"x\">', '</tr></table>' ],\n\t\t\tSELECT: [ '<select class=\"x\">', '</select>' ]\n\t\t};\n\t}\n\n\tfunction insertHtml ( html, node, docFrag ) {\n\t\tvar nodes = [];\n\n\t\t// render 0 and false\n\t\tif ( html == null || html === '' ) return nodes;\n\n\t\tvar container;\n\t\tvar wrapper;\n\t\tvar selectedOption;\n\n\t\tif ( ieBug && ( wrapper = ieBlacklist[ node.tagName ] ) ) {\n\t\t\tcontainer = element( 'DIV' );\n\t\t\tcontainer.innerHTML = wrapper[0] + html + wrapper[1];\n\t\t\tcontainer = container.querySelector( '.x' );\n\n\t\t\tif ( container.tagName === 'SELECT' ) {\n\t\t\t\tselectedOption = container.options[ container.selectedIndex ];\n\t\t\t}\n\t\t}\n\n\t\telse if ( node.namespaceURI === svg$1 ) {\n\t\t\tcontainer = element( 'DIV' );\n\t\t\tcontainer.innerHTML = '<svg class=\"x\">' + html + '</svg>';\n\t\t\tcontainer = container.querySelector( '.x' );\n\t\t}\n\n\t\telse if ( node.tagName === 'TEXTAREA' ) {\n\t\t\tcontainer = createElement( 'div' );\n\n\t\t\tif ( typeof container.textContent !== 'undefined' ) {\n\t\t\t\tcontainer.textContent = html;\n\t\t\t} else {\n\t\t\t\tcontainer.innerHTML = html;\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tcontainer = element( node.tagName );\n\t\t\tcontainer.innerHTML = html;\n\n\t\t\tif ( container.tagName === 'SELECT' ) {\n\t\t\t\tselectedOption = container.options[ container.selectedIndex ];\n\t\t\t}\n\t\t}\n\n\t\tvar child;\n\t\twhile ( child = container.firstChild ) {\n\t\t\tnodes.push( child );\n\t\t\tdocFrag.appendChild( child );\n\t\t}\n\n\t\t// This is really annoying. Extracting <option> nodes from the\n\t\t// temporary container <select> causes the remaining ones to\n\t\t// become selected. So now we have to deselect them. IE8, you\n\t\t// amaze me. You really do\n\t\t// ...and now Chrome too\n\t\tvar i;\n\t\tif ( node.tagName === 'SELECT' ) {\n\t\t\ti = nodes.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( nodes[i] !== selectedOption ) {\n\t\t\t\t\tnodes[i].selected = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\tfunction element ( tagName ) {\n\t\treturn elementCache[ tagName ] || ( elementCache[ tagName ] = createElement( tagName ) );\n\t}\n\n\tvar Triple = (function (Mustache) {\n\t\tfunction Triple ( options ) {\n\t\t\tMustache.call( this, options );\n\t\t}\n\n\t\tTriple.prototype = Object.create( Mustache && Mustache.prototype );\n\t\tTriple.prototype.constructor = Triple;\n\n\t\tTriple.prototype.detach = function detach () {\n\t\t\tvar docFrag = createDocumentFragment();\n\t\t\tthis.nodes.forEach( function ( node ) { return docFrag.appendChild( node ); } );\n\t\t\treturn docFrag;\n\t\t};\n\n\t\tTriple.prototype.find = function find ( selector ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar len = this.nodes.length;\n\t\t\tvar i;\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar node = this$1.nodes[i];\n\n\t\t\t\tif ( node.nodeType !== 1 ) continue;\n\n\t\t\t\tif ( matches( node, selector ) ) return node;\n\n\t\t\t\tvar queryResult = node.querySelector( selector );\n\t\t\t\tif ( queryResult ) return queryResult;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\tTriple.prototype.findAll = function findAll ( selector, query ) {\n\t\t\tvar this$1 = this;\n\n\t\t\tvar len = this.nodes.length;\n\t\t\tvar i;\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar node = this$1.nodes[i];\n\n\t\t\t\tif ( node.nodeType !== 1 ) continue;\n\n\t\t\t\tif ( query.test( node ) ) query.add( node );\n\n\t\t\t\tvar queryAllResult = node.querySelectorAll( selector );\n\t\t\t\tif ( queryAllResult ) {\n\t\t\t\t\tvar numNodes = queryAllResult.length;\n\t\t\t\t\tvar j;\n\n\t\t\t\t\tfor ( j = 0; j < numNodes; j += 1 ) {\n\t\t\t\t\t\tquery.add( queryAllResult[j] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tTriple.prototype.findComponent = function findComponent () {\n\t\t\treturn null;\n\t\t};\n\n\t\tTriple.prototype.firstNode = function firstNode () {\n\t\t\treturn this.nodes[0];\n\t\t};\n\n\t\tTriple.prototype.render = function render ( target ) {\n\t\t\tvar html = this.model ? this.model.get() : '';\n\t\t\tthis.nodes = insertHtml( html, this.parentFragment.findParentNode(), target );\n\t\t\tthis.rendered = true;\n\t\t};\n\n\t\tTriple.prototype.toString = function toString () {\n\t\t\tvar value = this.model && this.model.get();\n\t\t\tvalue = value != null ? '' + value : '';\n\n\t\t\treturn inAttribute() ? decodeCharacterReferences( value ) : value;\n\t\t};\n\n\t\tTriple.prototype.unrender = function unrender () {\n\t\t\tif ( this.nodes ) this.nodes.forEach( function ( node ) { return detachNode( node ); } );\n\t\t\tthis.rendered = false;\n\t\t};\n\n\t\tTriple.prototype.update = function update () {\n\t\t\tif ( this.rendered && this.dirty ) {\n\t\t\t\tthis.dirty = false;\n\n\t\t\t\tthis.unrender();\n\t\t\t\tvar docFrag = createDocumentFragment();\n\t\t\t\tthis.render( docFrag );\n\n\t\t\t\tvar parentNode = this.parentFragment.findParentNode();\n\t\t\t\tvar anchor = this.parentFragment.findNextNode( this );\n\n\t\t\t\tparentNode.insertBefore( docFrag, anchor );\n\t\t\t} else {\n\t\t\t\t// make sure to reset the dirty flag even if not rendered\n\t\t\t\tthis.dirty = false;\n\t\t\t}\n\t\t};\n\n\t\treturn Triple;\n\t}(Mustache));\n\n\tvar Yielder = (function (Item) {\n\t\tfunction Yielder ( options ) {\n\t\t\tItem.call( this, options );\n\n\t\t\tthis.container = options.parentFragment.ractive;\n\t\t\tthis.component = this.container.component;\n\n\t\t\tthis.containerFragment = options.parentFragment;\n\t\t\tthis.parentFragment = this.component.parentFragment;\n\n\t\t\t// {{yield}} is equivalent to {{yield content}}\n\t\t\tthis.name = options.template.n || '';\n\t\t}\n\n\t\tYielder.prototype = Object.create( Item && Item.prototype );\n\t\tYielder.prototype.constructor = Yielder;\n\n\t\tYielder.prototype.bind = function bind () {\n\t\t\tvar name = this.name;\n\n\t\t\t( this.component.yielders[ name ] || ( this.component.yielders[ name ] = [] ) ).push( this );\n\n\t\t\t// TODO don't parse here\n\t\t\tvar template = this.container._inlinePartials[ name || 'content' ];\n\n\t\t\tif ( typeof template === 'string' ) {\n\t\t\t\ttemplate = parse( template ).t;\n\t\t\t}\n\n\t\t\tif ( !template ) {\n\t\t\t\twarnIfDebug( (\"Could not find template for partial \\\"\" + name + \"\\\"\"), { ractive: this.ractive });\n\t\t\t\ttemplate = [];\n\t\t\t}\n\n\t\t\tthis.fragment = new Fragment({\n\t\t\t\towner: this,\n\t\t\t\tractive: this.container.parent,\n\t\t\t\ttemplate: template\n\t\t\t}).bind();\n\t\t};\n\n\t\tYielder.prototype.bubble = function bubble () {\n\t\t\tif ( !this.dirty ) {\n\t\t\t\tthis.containerFragment.bubble();\n\t\t\t\tthis.dirty = true;\n\t\t\t}\n\t\t};\n\n\t\tYielder.prototype.detach = function detach () {\n\t\t\treturn this.fragment.detach();\n\t\t};\n\n\t\tYielder.prototype.find = function find ( selector ) {\n\t\t\treturn this.fragment.find( selector );\n\t\t};\n\n\t\tYielder.prototype.findAll = function findAll ( selector, queryResult ) {\n\t\t\tthis.fragment.findAll( selector, queryResult );\n\t\t};\n\n\t\tYielder.prototype.findComponent = function findComponent ( name ) {\n\t\t\treturn this.fragment.findComponent( name );\n\t\t};\n\n\t\tYielder.prototype.findAllComponents = function findAllComponents ( name, queryResult ) {\n\t\t\tthis.fragment.findAllComponents( name, queryResult );\n\t\t};\n\n\t\tYielder.prototype.findNextNode = function findNextNode() {\n\t\t\treturn this.containerFragment.findNextNode( this );\n\t\t};\n\n\t\tYielder.prototype.firstNode = function firstNode ( skipParent ) {\n\t\t\treturn this.fragment.firstNode( skipParent );\n\t\t};\n\n\t\tYielder.prototype.render = function render ( target, occupants ) {\n\t\t\treturn this.fragment.render( target, occupants );\n\t\t};\n\n\t\tYielder.prototype.setTemplate = function setTemplate ( name ) {\n\t\t\tvar template = this.parentFragment.ractive.partials[ name ];\n\n\t\t\tif ( typeof template === 'string' ) {\n\t\t\t\ttemplate = parse( template ).t;\n\t\t\t}\n\n\t\t\tthis.partialTemplate = template || []; // TODO warn on missing partial\n\t\t};\n\n\t\tYielder.prototype.toString = function toString ( escape ) {\n\t\t\treturn this.fragment.toString( escape );\n\t\t};\n\n\t\tYielder.prototype.unbind = function unbind () {\n\t\t\tthis.fragment.unbind();\n\t\t\tremoveFromArray( this.component.yielders[ this.name ], this );\n\t\t};\n\n\t\tYielder.prototype.unrender = function unrender ( shouldDestroy ) {\n\t\t\tthis.fragment.unrender( shouldDestroy );\n\t\t};\n\n\t\tYielder.prototype.update = function update () {\n\t\t\tthis.dirty = false;\n\t\t\tthis.fragment.update();\n\t\t};\n\n\t\treturn Yielder;\n\t}(Item));\n\n\t// finds the component constructor in the registry or view hierarchy registries\n\tfunction getComponentConstructor ( ractive, name ) {\n\t\tvar instance = findInstance( 'components', ractive, name );\n\t\tvar Component;\n\n\t\tif ( instance ) {\n\t\t\tComponent = instance.components[ name ];\n\n\t\t\t// best test we have for not Ractive.extend\n\t\t\tif ( !Component._Parent ) {\n\t\t\t\t// function option, execute and store for reset\n\t\t\t\tvar fn = Component.bind( instance );\n\t\t\t\tfn.isOwner = instance.components.hasOwnProperty( name );\n\t\t\t\tComponent = fn();\n\n\t\t\t\tif ( !Component ) {\n\t\t\t\t\twarnIfDebug( noRegistryFunctionReturn, name, 'component', 'component', { ractive: ractive });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( typeof Component === 'string' ) {\n\t\t\t\t\t// allow string lookup\n\t\t\t\t\tComponent = getComponentConstructor( ractive, Component );\n\t\t\t\t}\n\n\t\t\t\tComponent._fn = fn;\n\t\t\t\tinstance.components[ name ] = Component;\n\t\t\t}\n\t\t}\n\n\t\treturn Component;\n\t}\n\n\tvar constructors = {};\n\tconstructors[ ALIAS ] = Alias;\n\tconstructors[ DOCTYPE ] = Doctype;\n\tconstructors[ INTERPOLATOR ] = Interpolator;\n\tconstructors[ PARTIAL ] = Partial;\n\tconstructors[ SECTION ] = Section;\n\tconstructors[ TRIPLE ] = Triple;\n\tconstructors[ YIELDER ] = Yielder;\n\n\tconstructors[ ATTRIBUTE ] = Attribute;\n\tconstructors[ BINDING_FLAG ] = BindingFlag;\n\tconstructors[ DECORATOR ] = Decorator;\n\tconstructors[ EVENT ] = EventDirective;\n\tconstructors[ TRANSITION ] = Transition;\n\n\tvar specialElements = {\n\t\tdoctype: Doctype,\n\t\tform: Form,\n\t\tinput: Input,\n\t\toption: Option,\n\t\tselect: Select,\n\t\ttextarea: Textarea\n\t};\n\n\tfunction createItem ( options ) {\n\t\tif ( typeof options.template === 'string' ) {\n\t\t\treturn new Text( options );\n\t\t}\n\n\t\tif ( options.template.t === ELEMENT ) {\n\t\t\t// could be component or element\n\t\t\tvar ComponentConstructor = getComponentConstructor( options.parentFragment.ractive, options.template.e );\n\t\t\tif ( ComponentConstructor ) {\n\t\t\t\treturn new Component( options, ComponentConstructor );\n\t\t\t}\n\n\t\t\tvar tagName = options.template.e.toLowerCase();\n\n\t\t\tvar ElementConstructor = specialElements[ tagName ] || Element;\n\t\t\treturn new ElementConstructor( options );\n\t\t}\n\n\t\tvar Item;\n\n\t\t// component mappings are a special case of attribute\n\t\tif ( options.template.t === ATTRIBUTE ) {\n\t\t\tvar el = options.owner;\n\t\t\tif ( !el || ( el.type !== COMPONENT && el.type !== ELEMENT ) ) {\n\t\t\t\tel = findElement( options.parentFragment );\n\t\t\t}\n\t\t\toptions.element = el;\n\n\t\t\tItem = el.type === COMPONENT ? Mapping : Attribute;\n\t\t} else {\n\t\t\tItem = constructors[ options.template.t ];\n\t\t}\n\n\t\tif ( !Item ) throw new Error( (\"Unrecognised item type \" + (options.template.t)) );\n\n\t\treturn new Item( options );\n\t}\n\n\t// TODO all this code needs to die\n\tfunction processItems ( items, values, guid, counter ) {\n\t\tif ( counter === void 0 ) counter = 0;\n\n\t\treturn items.map( function ( item ) {\n\t\t\tif ( item.type === TEXT ) {\n\t\t\t\treturn item.template;\n\t\t\t}\n\n\t\t\tif ( item.fragment ) {\n\t\t\t\tif ( item.fragment.iterations ) {\n\t\t\t\t\treturn item.fragment.iterations.map( function ( fragment ) {\n\t\t\t\t\t\treturn processItems( fragment.items, values, guid, counter );\n\t\t\t\t\t}).join( '' );\n\t\t\t\t} else {\n\t\t\t\t\treturn processItems( item.fragment.items, values, guid, counter );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar placeholderId = \"\" + guid + \"-\" + (counter++);\n\t\t\tvar model = item.model || item.newModel;\n\n\t\t\tvalues[ placeholderId ] = model ?\n\t\t\t\tmodel.wrapper ?\n\t\t\t\t\tmodel.wrapperValue :\n\t\t\t\t\tmodel.get() :\n\t\t\t\tundefined;\n\n\t\t\treturn '${' + placeholderId + '}';\n\t\t}).join( '' );\n\t}\n\n\tfunction unrenderAndDestroy$1 ( item ) {\n\t\titem.unrender( true );\n\t}\n\n\tvar Fragment = function Fragment ( options ) {\n\t\tthis.owner = options.owner; // The item that owns this fragment - an element, section, partial, or attribute\n\n\t\tthis.isRoot = !options.owner.parentFragment;\n\t\tthis.parent = this.isRoot ? null : this.owner.parentFragment;\n\t\tthis.ractive = options.ractive || ( this.isRoot ? options.owner : this.parent.ractive );\n\n\t\tthis.componentParent = ( this.isRoot && this.ractive.component ) ? this.ractive.component.parentFragment : null;\n\n\t\tthis.context = null;\n\t\tthis.rendered = false;\n\n\t\t// encapsulated styles should be inherited until they get applied by an element\n\t\tthis.cssIds = 'cssIds' in options ? options.cssIds : ( this.parent ? this.parent.cssIds : null );\n\n\t\tthis.resolvers = [];\n\n\t\tthis.dirty = false;\n\t\tthis.dirtyArgs = this.dirtyValue = true; // TODO getArgsList is nonsense - should deprecate legacy directives style\n\n\t\tthis.template = options.template || [];\n\t\tthis.createItems();\n\t};\n\n\tFragment.prototype.bind = function bind$1$$ ( context ) {\n\t\tthis.context = context;\n\t\tthis.items.forEach( bind$1 );\n\t\tthis.bound = true;\n\n\t\t// in rare cases, a forced resolution (or similar) will cause the\n\t\t// fragment to be dirty before it's even finished binding. In those\n\t\t// cases we update immediately\n\t\tif ( this.dirty ) this.update();\n\n\t\treturn this;\n\t};\n\n\tFragment.prototype.bubble = function bubble () {\n\t\tthis.dirtyArgs = this.dirtyValue = true;\n\n\t\tif ( !this.dirty ) {\n\t\t\tthis.dirty = true;\n\n\t\t\tif ( this.isRoot ) { // TODO encapsulate 'is component root, but not overall root' check?\n\t\t\t\tif ( this.ractive.component ) {\n\t\t\t\t\tthis.ractive.component.bubble();\n\t\t\t\t} else if ( this.bound ) {\n\t\t\t\t\trunloop.addFragment( this );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.owner.bubble();\n\t\t\t}\n\t\t}\n\t};\n\n\tFragment.prototype.createItems = function createItems () {\n\t\t// this is a hot code path\n\t\tvar this$1 = this;\n\n\t\t\tvar max = this.template.length;\n\t\tthis.items = [];\n\t\tfor ( var i = 0; i < max; i++ ) {\n\t\t\tthis$1.items[i] = createItem({ parentFragment: this$1, template: this$1.template[i], index: i });\n\t\t}\n\t};\n\n\tFragment.prototype.destroyed = function destroyed () {\n\t\tthis.items.forEach( function ( i ) { return i.destroyed(); } );\n\t};\n\n\tFragment.prototype.detach = function detach () {\n\t\tvar docFrag = createDocumentFragment();\n\t\tthis.items.forEach( function ( item ) { return docFrag.appendChild( item.detach() ); } );\n\t\treturn docFrag;\n\t};\n\n\tFragment.prototype.find = function find ( selector ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.items.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tvar found = this$1.items[i].find( selector );\n\t\t\tif ( found ) return found;\n\t\t}\n\t};\n\n\tFragment.prototype.findAll = function findAll ( selector, query ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.items ) {\n\t\t\tvar len = this.items.length;\n\t\t\tvar i;\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar item = this$1.items[i];\n\n\t\t\t\tif ( item.findAll ) {\n\t\t\t\t\titem.findAll( selector, query );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn query;\n\t};\n\n\tFragment.prototype.findComponent = function findComponent ( name ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar len = this.items.length;\n\t\tvar i;\n\n\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\tvar found = this$1.items[i].findComponent( name );\n\t\t\tif ( found ) return found;\n\t\t}\n\t};\n\n\tFragment.prototype.findAllComponents = function findAllComponents ( name, query ) {\n\t\tvar this$1 = this;\n\n\t\t\tif ( this.items ) {\n\t\t\tvar len = this.items.length;\n\t\t\tvar i;\n\n\t\t\tfor ( i = 0; i < len; i += 1 ) {\n\t\t\t\tvar item = this$1.items[i];\n\n\t\t\t\tif ( item.findAllComponents ) {\n\t\t\t\t\titem.findAllComponents( name, query );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn query;\n\t};\n\n\tFragment.prototype.findContext = function findContext () {\n\t\tvar fragment = this;\n\t\twhile ( fragment && !fragment.context ) fragment = fragment.parent;\n\t\tif ( !fragment ) return this.ractive.viewmodel;\n\t\telse return fragment.context;\n\t};\n\n\tFragment.prototype.findNextNode = function findNextNode ( item ) {\n\t\t// search for the next node going forward\n\t\tvar this$1 = this;\n\n\t\t\tif ( item ) {\n\t\t\tfor ( var i = item.index + 1; i < this$1.items.length; i++ ) {\n\t\t\t\tif ( !this$1.items[ i ] ) continue;\n\n\t\t\t\tvar node = this$1.items[ i ].firstNode( true );\n\t\t\t\tif ( node ) return node;\n\t\t\t}\n\t\t}\n\n\t\t// if this is the root fragment, and there are no more items,\n\t\t// it means we're at the end...\n\t\tif ( this.isRoot ) {\n\t\t\tif ( this.ractive.component ) {\n\t\t\t\treturn this.ractive.component.parentFragment.findNextNode( this.ractive.component );\n\t\t\t}\n\n\t\t\t// TODO possible edge case with other content\n\t\t\t// appended to this.ractive.el?\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( this.parent ) return this.owner.findNextNode( this ); // the argument is in case the parent is a RepeatedFragment\n\t};\n\n\tFragment.prototype.findParentNode = function findParentNode () {\n\t\tvar fragment = this;\n\n\t\tdo {\n\t\t\tif ( fragment.owner.type === ELEMENT ) {\n\t\t\t\treturn fragment.owner.node;\n\t\t\t}\n\n\t\t\tif ( fragment.isRoot && !fragment.ractive.component ) { // TODO encapsulate check\n\t\t\t\treturn fragment.ractive.el;\n\t\t\t}\n\n\t\t\tif ( fragment.owner.type === YIELDER ) {\n\t\t\t\tfragment = fragment.owner.containerFragment;\n\t\t\t} else {\n\t\t\t\tfragment = fragment.componentParent || fragment.parent; // TODO ugh\n\t\t\t}\n\t\t} while ( fragment );\n\n\t\tthrow new Error( 'Could not find parent node' ); // TODO link to issue tracker\n\t};\n\n\tFragment.prototype.findRepeatingFragment = function findRepeatingFragment () {\n\t\tvar fragment = this;\n\t\t// TODO better check than fragment.parent.iterations\n\t\twhile ( ( fragment.parent || fragment.componentParent ) && !fragment.isIteration ) {\n\t\t\tfragment = fragment.parent || fragment.componentParent;\n\t\t}\n\n\t\treturn fragment;\n\t};\n\n\tFragment.prototype.firstNode = function firstNode ( skipParent ) {\n\t\tvar this$1 = this;\n\n\t\t\tvar node;\n\t\tfor ( var i = 0; i < this$1.items.length; i++ ) {\n\t\t\tnode = this$1.items[i].firstNode( true );\n\n\t\t\tif ( node ) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\n\t\tif ( skipParent ) return null;\n\n\t\treturn this.parent.findNextNode( this.owner );\n\t};\n\n\t// TODO ideally, this would be deprecated in favour of an\n\t// expression-like approach\n\tFragment.prototype.getArgsList = function getArgsList () {\n\t\tif ( this.dirtyArgs ) {\n\t\t\tvar values = {};\n\t\t\tvar source = processItems( this.items, values, this.ractive._guid );\n\t\t\tvar parsed = parseJSON( '[' + source + ']', values );\n\n\t\t\tthis.argsList = parsed ?\n\t\t\t\tparsed.value :\n\t\t\t\t[ this.toString() ];\n\n\t\t\tthis.dirtyArgs = false;\n\t\t}\n\n\t\treturn this.argsList;\n\t};\n\n\tFragment.prototype.rebinding = function rebinding ( next ) {\n\t\tthis.context = next;\n\t};\n\n\tFragment.prototype.render = function render ( target, occupants ) {\n\t\tif ( this.rendered ) throw new Error( 'Fragment is already rendered!' );\n\t\tthis.rendered = true;\n\n\t\tthis.items.forEach( function ( item ) { return item.render( target, occupants ); } );\n\t};\n\n\tFragment.prototype.resetTemplate = function resetTemplate ( template ) {\n\t\tvar wasBound = this.bound;\n\t\tvar wasRendered = this.rendered;\n\n\t\t// TODO ensure transitions are disabled globally during reset\n\n\t\tif ( wasBound ) {\n\t\t\tif ( wasRendered ) this.unrender( true );\n\t\t\tthis.unbind();\n\t\t}\n\n\t\tthis.template = template;\n\t\tthis.createItems();\n\n\t\tif ( wasBound ) {\n\t\t\tthis.bind( this.context );\n\n\t\t\tif ( wasRendered ) {\n\t\t\t\tvar parentNode = this.findParentNode();\n\t\t\t\tvar anchor = this.findNextNode();\n\n\t\t\t\tif ( anchor ) {\n\t\t\t\t\tvar docFrag = createDocumentFragment();\n\t\t\t\t\tthis.render( docFrag );\n\t\t\t\t\tparentNode.insertBefore( docFrag, anchor );\n\t\t\t\t} else {\n\t\t\t\t\tthis.render( parentNode );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tFragment.prototype.resolve = function resolve ( template, callback ) {\n\t\tif ( !this.context && this.parent.resolve ) {\n\t\t\treturn this.parent.resolve( template, callback );\n\t\t}\n\n\t\tvar resolver = new ReferenceResolver( this, template, callback );\n\t\tthis.resolvers.push( resolver );\n\n\t\treturn resolver; // so we can e.g. force resolution\n\t};\n\n\tFragment.prototype.shuffled = function shuffled () {\n\t\tthis.items.forEach( function ( i ) { return i.shuffled(); } );\n\t};\n\n\tFragment.prototype.toHtml = function toHtml () {\n\t\treturn this.toString();\n\t};\n\n\tFragment.prototype.toString = function toString$1$$ ( escape ) {\n\t\treturn this.items.map( escape ? toEscapedString : toString$1 ).join( '' );\n\t};\n\n\tFragment.prototype.unbind = function unbind$1 () {\n\t\tthis.items.forEach( unbind );\n\t\tthis.resolvers.forEach( unbind );\n\t\tthis.bound = false;\n\n\t\treturn this;\n\t};\n\n\tFragment.prototype.unrender = function unrender$1 ( shouldDestroy ) {\n\t\tthis.items.forEach( shouldDestroy ? unrenderAndDestroy$1 : unrender );\n\t\tthis.rendered = false;\n\t};\n\n\tFragment.prototype.update = function update$1 () {\n\t\tif ( this.dirty ) {\n\t\t\tif ( !this.updating ) {\n\t\t\t\tthis.dirty = false;\n\t\t\t\tthis.updating = true;\n\t\t\t\tthis.items.forEach( update );\n\t\t\t\tthis.updating = false;\n\t\t\t} else if ( this.isRoot ) {\n\t\t\t\trunloop.addFragmentToRoot( this );\n\t\t\t}\n\t\t}\n\t};\n\n\tFragment.prototype.valueOf = function valueOf () {\n\t\tif ( this.items.length === 1 ) {\n\t\t\treturn this.items[0].valueOf();\n\t\t}\n\n\t\tif ( this.dirtyValue ) {\n\t\t\tvar values = {};\n\t\t\tvar source = processItems( this.items, values, this.ractive._guid );\n\t\t\tvar parsed = parseJSON( source, values );\n\n\t\t\tthis.value = parsed ?\n\t\t\t\tparsed.value :\n\t\t\t\tthis.toString();\n\n\t\t\tthis.dirtyValue = false;\n\t\t}\n\n\t\treturn this.value;\n\t};\n\n\t// TODO should resetTemplate be asynchronous? i.e. should it be a case\n\t// of outro, update template, intro? I reckon probably not, since that\n\t// could be achieved with unrender-resetTemplate-render. Also, it should\n\t// conceptually be similar to resetPartial, which couldn't be async\n\n\tfunction Ractive$resetTemplate ( template ) {\n\t\ttemplateConfigurator.init( null, this, { template: template });\n\n\t\tvar transitionsEnabled = this.transitionsEnabled;\n\t\tthis.transitionsEnabled = false;\n\n\t\t// Is this is a component, we need to set the `shouldDestroy`\n\t\t// flag, otherwise it will assume by default that a parent node\n\t\t// will be detached, and therefore it doesn't need to bother\n\t\t// detaching its own nodes\n\t\tvar component = this.component;\n\t\tif ( component ) component.shouldDestroy = true;\n\t\tthis.unrender();\n\t\tif ( component ) component.shouldDestroy = false;\n\n\t\t// remove existing fragment and create new one\n\t\tthis.fragment.unbind().unrender( true );\n\n\t\tthis.fragment = new Fragment({\n\t\t\ttemplate: this.template,\n\t\t\troot: this,\n\t\t\towner: this\n\t\t});\n\n\t\tvar docFrag = createDocumentFragment();\n\t\tthis.fragment.bind( this.viewmodel ).render( docFrag );\n\n\t\t// if this is a component, its el may not be valid, so find a\n\t\t// target based on the component container\n\t\tif ( component ) {\n\t\t\tthis.fragment.findParentNode().insertBefore( docFrag, component.findNextNode() );\n\t\t} else {\n\t\t\tthis.el.insertBefore( docFrag, this.anchor );\n\t\t}\n\n\t\tthis.transitionsEnabled = transitionsEnabled;\n\t}\n\n\tvar reverse$1 = makeArrayMethod( 'reverse' ).path;\n\n\tfunction Ractive$set ( keypath, value ) {\n\t\tvar ractive = this;\n\n\t\treturn set( ractive, build( ractive, keypath, value ) );\n\t}\n\n\tvar shift$1 = makeArrayMethod( 'shift' ).path;\n\n\tvar sort$1 = makeArrayMethod( 'sort' ).path;\n\n\tvar splice$1 = makeArrayMethod( 'splice' ).path;\n\n\tfunction Ractive$subtract ( keypath, d ) {\n\t\treturn add( this, keypath, ( d === undefined ? -1 : -d ) );\n\t}\n\n\tvar teardownHook$1 = new Hook( 'teardown' );\n\n\t// Teardown. This goes through the root fragment and all its children, removing observers\n\t// and generally cleaning up after itself\n\n\tfunction Ractive$teardown () {\n\t\tif ( this.torndown ) {\n\t\t\twarnIfDebug( 'ractive.teardown() was called on a Ractive instance that was already torn down' );\n\t\t\treturn Promise$1.resolve();\n\t\t}\n\n\t\tthis.torndown = true;\n\t\tthis.fragment.unbind();\n\t\tthis.viewmodel.teardown();\n\n\t\tthis._observers.forEach( cancel );\n\n\t\tif ( this.fragment.rendered && this.el.__ractive_instances__ ) {\n\t\t\tremoveFromArray( this.el.__ractive_instances__, this );\n\t\t}\n\n\t\tthis.shouldDestroy = true;\n\t\tvar promise = ( this.fragment.rendered ? this.unrender() : Promise$1.resolve() );\n\n\t\tteardownHook$1.fire( this );\n\n\t\treturn promise;\n\t}\n\n\tfunction Ractive$toggle ( keypath ) {\n\t\tif ( typeof keypath !== 'string' ) {\n\t\t\tthrow new TypeError( badArguments );\n\t\t}\n\n\t\treturn set( this, gather( this, keypath ).map( function ( m ) { return [ m, !m.get() ]; } ) );\n\t}\n\n\tfunction Ractive$toCSS() {\n\t\tvar cssIds = [ this.cssId ].concat( this.findAllComponents().map( function ( c ) { return c.cssId; } ) );\n\t\tvar uniqueCssIds = Object.keys(cssIds.reduce( function ( ids, id ) { return (ids[id] = true, ids); }, {}));\n\t\treturn getCSS( uniqueCssIds );\n\t}\n\n\tfunction Ractive$toHTML () {\n\t\treturn this.fragment.toString( true );\n\t}\n\n\tfunction toText () {\n\t\treturn this.fragment.toString( false );\n\t}\n\n\tfunction Ractive$transition ( name, node, params ) {\n\n\t\tif ( node instanceof HTMLElement ) {\n\t\t\t// good to go\n\t\t}\n\t\telse if ( isObject( node ) ) {\n\t\t\t// omitted, use event node\n\t\t\tparams = node;\n\t\t}\n\n\t\t// if we allow query selector, then it won't work\n\t\t// simple params like \"fast\"\n\n\t\t// else if ( typeof node === 'string' ) {\n\t\t// \t// query selector\n\t\t// \tnode = this.find( node )\n\t\t// }\n\n\t\tnode = node || this.event.node;\n\n\t\tif ( !node || !node._ractive ) {\n\t\t\tfatal( (\"No node was supplied for transition \" + name) );\n\t\t}\n\n\t\tparams = params || {};\n\t\tvar owner = node._ractive.proxy;\n\t\tvar transition = new Transition({ owner: owner, parentFragment: owner.parentFragment, name: name, params: params });\n\t\ttransition.bind();\n\n\t\tvar promise = runloop.start( this, true );\n\t\trunloop.registerTransition( transition );\n\t\trunloop.end();\n\n\t\tpromise.then( function () { return transition.unbind(); } );\n\t\treturn promise;\n\t}\n\n\tfunction unlink$1( here ) {\n\t\tvar promise = runloop.start();\n\t\tthis.viewmodel.joinAll( splitKeypathI( here ), { lastLink: false } ).unlink();\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\tvar unrenderHook$1 = new Hook( 'unrender' );\n\n\tfunction Ractive$unrender () {\n\t\tif ( !this.fragment.rendered ) {\n\t\t\twarnIfDebug( 'ractive.unrender() was called on a Ractive instance that was not rendered' );\n\t\t\treturn Promise$1.resolve();\n\t\t}\n\n\t\tvar promise = runloop.start( this, true );\n\n\t\t// If this is a component, and the component isn't marked for destruction,\n\t\t// don't detach nodes from the DOM unnecessarily\n\t\tvar shouldDestroy = !this.component || this.component.shouldDestroy || this.shouldDestroy;\n\t\tthis.fragment.unrender( shouldDestroy );\n\n\t\tremoveFromArray( this.el.__ractive_instances__, this );\n\n\t\tunrenderHook$1.fire( this );\n\n\t\trunloop.end();\n\t\treturn promise;\n\t}\n\n\tvar unshift$1 = makeArrayMethod( 'unshift' ).path;\n\n\tfunction Ractive$updateModel ( keypath, cascade ) {\n\t\tvar promise = runloop.start( this, true );\n\n\t\tif ( !keypath ) {\n\t\t\tthis.viewmodel.updateFromBindings( true );\n\t\t} else {\n\t\t\tthis.viewmodel.joinAll( splitKeypathI( keypath ) ).updateFromBindings( cascade !== false );\n\t\t}\n\n\t\trunloop.end();\n\n\t\treturn promise;\n\t}\n\n\tvar proto = {\n\t\tadd: Ractive$add,\n\t\tanimate: Ractive$animate,\n\t\tdetach: Ractive$detach,\n\t\tfind: Ractive$find,\n\t\tfindAll: Ractive$findAll,\n\t\tfindAllComponents: Ractive$findAllComponents,\n\t\tfindComponent: Ractive$findComponent,\n\t\tfindContainer: Ractive$findContainer,\n\t\tfindParent: Ractive$findParent,\n\t\tfire: Ractive$fire,\n\t\tget: Ractive$get,\n\t\tgetNodeInfo: getNodeInfo,\n\t\tinsert: Ractive$insert,\n\t\tlink: link$1,\n\t\tmerge: thisRactive$merge,\n\t\tobserve: observe,\n\t\tobserveList: observeList,\n\t\tobserveOnce: observeOnce,\n\t\t// TODO reinstate these\n\t\t// observeListOnce,\n\t\toff: Ractive$off,\n\t\ton: Ractive$on,\n\t\tonce: Ractive$once,\n\t\tpop: pop$1,\n\t\tpush: push$1,\n\t\trender: Ractive$render,\n\t\treset: Ractive$reset,\n\t\tresetPartial: resetPartial,\n\t\tresetTemplate: Ractive$resetTemplate,\n\t\treverse: reverse$1,\n\t\tset: Ractive$set,\n\t\tshift: shift$1,\n\t\tsort: sort$1,\n\t\tsplice: splice$1,\n\t\tsubtract: Ractive$subtract,\n\t\tteardown: Ractive$teardown,\n\t\ttoggle: Ractive$toggle,\n\t\ttoCSS: Ractive$toCSS,\n\t\ttoCss: Ractive$toCSS,\n\t\ttoHTML: Ractive$toHTML,\n\t\ttoHtml: Ractive$toHTML,\n\t\ttoText: toText,\n\t\ttransition: Ractive$transition,\n\t\tunlink: unlink$1,\n\t\tunrender: Ractive$unrender,\n\t\tunshift: unshift$1,\n\t\tupdate: Ractive$update,\n\t\tupdateModel: Ractive$updateModel\n\t};\n\n\tfunction wrap$1 ( method, superMethod, force ) {\n\n\t\tif ( force || needsSuper( method, superMethod ) )  {\n\n\t\t\treturn function () {\n\n\t\t\t\tvar hasSuper = ( '_super' in this ), _super = this._super, result;\n\n\t\t\t\tthis._super = superMethod;\n\n\t\t\t\tresult = method.apply( this, arguments );\n\n\t\t\t\tif ( hasSuper ) {\n\t\t\t\t\tthis._super = _super;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t};\n\t\t}\n\n\t\telse {\n\t\t\treturn method;\n\t\t}\n\t}\n\n\tfunction needsSuper ( method, superMethod ) {\n\t\treturn typeof superMethod === 'function' && /_super/.test( method );\n\t}\n\n\tfunction unwrap ( Child ) {\n\t\tvar options = {};\n\n\t\twhile ( Child ) {\n\t\t\taddRegistries( Child, options );\n\t\t\taddOtherOptions( Child, options );\n\n\t\t\tif ( Child._Parent !== Ractive ) {\n\t\t\t\tChild = Child._Parent;\n\t\t\t} else {\n\t\t\t\tChild = false;\n\t\t\t}\n\t\t}\n\n\t\treturn options;\n\t}\n\n\tfunction addRegistries ( Child, options ) {\n\t\tregistries.forEach( function ( r ) {\n\t\t\taddRegistry(\n\t\t\t\tr.useDefaults ? Child.prototype : Child,\n\t\t\t\toptions, r.name );\n\t\t});\n\t}\n\n\tfunction addRegistry ( target, options, name ) {\n\t\tvar registry, keys = Object.keys( target[ name ] );\n\n\t\tif ( !keys.length ) { return; }\n\n\t\tif ( !( registry = options[ name ] ) ) {\n\t\t\tregistry = options[ name ] = {};\n\t\t}\n\n\t\tkeys\n\t\t\t.filter( function ( key ) { return !( key in registry ); } )\n\t\t\t.forEach( function ( key ) { return registry[ key ] = target[ name ][ key ]; } );\n\t}\n\n\tfunction addOtherOptions ( Child, options ) {\n\t\tObject.keys( Child.prototype ).forEach( function ( key ) {\n\t\t\tif ( key === 'computed' ) { return; }\n\n\t\t\tvar value = Child.prototype[ key ];\n\n\t\t\tif ( !( key in options ) ) {\n\t\t\t\toptions[ key ] = value._method ? value._method : value;\n\t\t\t}\n\n\t\t\t// is it a wrapped function?\n\t\t\telse if ( typeof options[ key ] === 'function'\n\t\t\t\t\t&& typeof value === 'function'\n\t\t\t\t\t&& options[ key ]._method ) {\n\n\t\t\t\tvar result, needsSuper = value._method;\n\n\t\t\t\tif ( needsSuper ) { value = value._method; }\n\n\t\t\t\t// rewrap bound directly to parent fn\n\t\t\t\tresult = wrap$1( options[ key ]._method, value );\n\n\t\t\t\tif ( needsSuper ) { result._method = result; }\n\n\t\t\t\toptions[ key ] = result;\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction extend () {\n\t\tvar options = [], len = arguments.length;\n\t\twhile ( len-- ) options[ len ] = arguments[ len ];\n\n\t\tif( !options.length ) {\n\t\t\treturn extendOne( this );\n\t\t} else {\n\t\t\treturn options.reduce( extendOne, this );\n\t\t}\n\t}\n\n\tfunction extendOne ( Parent, options ) {\n\t\tif ( options === void 0 ) options = {};\n\n\t\tvar Child, proto;\n\n\t\t// if we're extending with another Ractive instance...\n\t\t//\n\t\t//   var Human = Ractive.extend(...), Spider = Ractive.extend(...);\n\t\t//   var Spiderman = Human.extend( Spider );\n\t\t//\n\t\t// ...inherit prototype methods and default options as well\n\t\tif ( options.prototype instanceof Ractive ) {\n\t\t\toptions = unwrap( options );\n\t\t}\n\n\t\tChild = function ( options ) {\n\t\t\tif ( !( this instanceof Child ) ) return new Child( options );\n\n\t\t\tconstruct( this, options || {} );\n\t\t\tinitialise( this, options || {}, {} );\n\t\t};\n\n\t\tproto = create( Parent.prototype );\n\t\tproto.constructor = Child;\n\n\t\t// Static properties\n\t\tdefineProperties( Child, {\n\t\t\t// alias prototype as defaults\n\t\t\tdefaults: { value: proto },\n\n\t\t\t// extendable\n\t\t\textend: { value: extend, writable: true, configurable: true },\n\n\t\t\t// Parent - for IE8, can't use Object.getPrototypeOf\n\t\t\t_Parent: { value: Parent }\n\t\t});\n\n\t\t// extend configuration\n\t\tconfig.extend( Parent, proto, options );\n\n\t\tdataConfigurator.extend( Parent, proto, options );\n\n\t\tif ( options.computed ) {\n\t\t\tproto.computed = extendObj( create( Parent.prototype.computed ), options.computed );\n\t\t}\n\n\t\tChild.prototype = proto;\n\n\t\treturn Child;\n\t}\n\n\tfunction joinKeys () {\n\t\tvar keys = [], len = arguments.length;\n\t\twhile ( len-- ) keys[ len ] = arguments[ len ];\n\n\t\treturn keys.map( escapeKey ).join( '.' );\n\t}\n\n\tfunction splitKeypath ( keypath ) {\n\t\treturn splitKeypathI( keypath ).map( unescapeKey );\n\t}\n\n\t// Ractive.js makes liberal use of things like Array.prototype.indexOf. In\n\t// older browsers, these are made available via a shim - here, we do a quick\n\t// pre-flight check to make sure that either a) we're not in a shit browser,\n\t// or b) we're using a Ractive-legacy.js build\n\tvar FUNCTION = 'function';\n\n\tif (\n\t\ttypeof Date.now !== FUNCTION                 ||\n\t\ttypeof String.prototype.trim !== FUNCTION    ||\n\t\ttypeof Object.keys !== FUNCTION              ||\n\t\ttypeof Array.prototype.indexOf !== FUNCTION  ||\n\t\ttypeof Array.prototype.forEach !== FUNCTION  ||\n\t\ttypeof Array.prototype.map !== FUNCTION      ||\n\t\ttypeof Array.prototype.filter !== FUNCTION   ||\n\t\t( win && typeof win.addEventListener !== FUNCTION )\n\t) {\n\t\tthrow new Error( 'It looks like you\\'re attempting to use Ractive.js in an older browser. You\\'ll need to use one of the \\'legacy builds\\' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.' );\n\t}\n\n\tfunction Ractive ( options ) {\n\t\tif ( !( this instanceof Ractive ) ) return new Ractive( options );\n\n\t\tconstruct( this, options || {} );\n\t\tinitialise( this, options || {}, {} );\n\t}\n\n\textendObj( Ractive.prototype, proto, defaults );\n\tRactive.prototype.constructor = Ractive;\n\n\t// alias prototype as `defaults`\n\tRactive.defaults = Ractive.prototype;\n\n\t// static properties\n\tdefineProperties( Ractive, {\n\n\t\t// debug flag\n\t\tDEBUG:          { writable: true, value: true },\n\t\tDEBUG_PROMISES: { writable: true, value: true },\n\n\t\t// static methods:\n\t\textend:         { value: extend },\n\t\tescapeKey:      { value: escapeKey },\n\t\tgetNodeInfo:    { value: staticInfo },\n\t\tjoinKeys:       { value: joinKeys },\n\t\tparse:          { value: parse },\n\t\tsplitKeypath:   { value: splitKeypath },\n\t\tunescapeKey:    { value: unescapeKey },\n\t\tgetCSS:         { value: getCSS },\n\n\t\t// namespaced constructors\n\t\tPromise:        { value: Promise$1 },\n\n\t\t// support\n\t\tenhance:        { writable: true, value: false },\n\t\tsvg:            { value: svg },\n\t\tmagic:          { value: magicSupported },\n\n\t\t// version\n\t\tVERSION:        { value: '0.8.14' },\n\n\t\t// plugins\n\t\tadaptors:       { writable: true, value: {} },\n\t\tcomponents:     { writable: true, value: {} },\n\t\tdecorators:     { writable: true, value: {} },\n\t\teasing:         { writable: true, value: easing },\n\t\tevents:         { writable: true, value: {} },\n\t\tinterpolators:  { writable: true, value: interpolators },\n\t\tpartials:       { writable: true, value: {} },\n\t\ttransitions:    { writable: true, value: {} }\n\t});\n\n\treturn Ractive;\n\n}));"],"names":["owner","this","template","f","bind","Section","prototype","detach","fragment","createDocumentFragment","find","selector","findAll","query","findComponent","name","findAllComponents","firstNode","skipParent","isTruthy","subordinate","sibling","value","model","isRoot","get","undefined","templateSectionType","SECTION_IF_WITH","isEmpty","rebinding","next","previous","safe","Mustache","call","sectionType","SECTION_IF","SECTION_UNLESS","render","target","occupants","rendered","shuffle","newIndices","SECTION_EACH","toString","escape","unbind","unrender","shouldDestroy","update","dirty","context","siblingFalsey","lastType","getType","i","newFragment","SECTION_WITH","RepeatedFragment","indexRef","Fragment","parentNode","parentFragment","findParentNode","anchor","findNextNode","docFrag","insertBefore","nextSibling","Select","Element","options","Object","create","constructor","foundNode","node","binding","selectedOptions","getSelectedOptions","length","sync","defaultSelected","selected","this$1","selectNode","toArray","forEach","o","indexOf","setFromNode","selectValue","getAttribute","isMultiple","array","isArray","optionWasSelected","optionValue","_ractive","shouldSelect","valueContains","forceUpdate","Textarea","Input","deferContent","attributeByName","isBindable","attributes","push","createItem","t","ATTRIBUTE","n","cssIds","bubble","runloop","scheduleTask","Text","Item","type","TEXT","detachNode","inAttributes","nodeType","shift","nodeValue","doc","createTextNode","appendChild","escapeHtml","valueOf","isClient","prefixCache","testStyle","createElement","style","prefix","prop","camelCase","capped","charAt","toUpperCase","substring","vendors","vendor","visible","prefix$1","hidden","prefix$2","i$1","addEventListener","onChange","onHide","onShow","win","createTransitions","unprefixPattern","RegExp","join","vendorPattern","TRANSITION$1","TRANSITIONEND","CSS_TRANSITIONS_ENABLED","TRANSITION_DURATION","TRANSITION_PROPERTY","TRANSITION_TIMING_FUNCTION","testStyle$1","linear$1","x","canUseCssTransitions","cannotUseCssTransitions","transition","webkitTransition","to","changedProperties","resolve","setTimeout","transitionDone","clearTimeout","cssTimeout","checkComplete","jsTransitionsComplete","cssTransitionsComplete","unregisterCompleteHandler","ractive","fire","isIntro","transitionEndHandler","event","index","unprefix","propertyName","splice","cssTransitionsDone","property","duration","timing","removeEventListener","hashPrefix","namespaceURI","tagName","map","hyphenate","easing","delay","registerCompleteHandler","hash","originalValue","suffix","interpolator","propertiesToTransitionInJs","getStyle","warnIfDebug","exec","interpolate","parseFloat","warnOnceIfDebug","missingPlugin","Ticker","step","pos","complete","createTransitions$1","getComputedStyle","resolved","Promise$1","names","t0","t1","t2","Transition","findElement","element","onComplete","animateStyle","arguments","Error","setStyle","fulfil","propertyNames","keys","computedStyle","current","v","_introTransition","_outroTransition","eventName","params","a","s","d","fragment$1","getArgsList","_fn","findInViewHierarchy","resolvers","models","r","ref","resolver","resolveReference","register","removeFromArray","argsFn","getFunction","destroyed","props","styles","value$1","handleChange","processParams","defaults","extendObj","idx","rebindMatch","unregister","addShuffleRegister","fn","addToArray","hasOwnProperty","start","completed","originalStyle","args","noReset","resetStyle","_manager","remove","values","apply","promise","concat","then","unbinding","ieBug","ieBlacklist","elementCache","innerHTML","err","TABLE","THEAD","TBODY","TR","SELECT","Triple","nodes","len","matches","queryResult","querySelector","test","add","queryAllResult","querySelectorAll","j","numNodes","html","insertHtml","inAttribute","decodeCharacterReferences","Yielder","container","component","containerFragment","yielders","_inlinePartials","parse","parent","setTemplate","partials","partialTemplate","constructors","ALIAS","Alias","DOCTYPE","Doctype","INTERPOLATOR","Interpolator","PARTIAL","Partial","SECTION","TRIPLE","YIELDER","Attribute","BINDING_FLAG","BindingFlag","DECORATOR","Decorator","EVENT","EventDirective","TRANSITION","specialElements","doctype","form","Form","input","option","Option","select","textarea","componentParent","dirtyArgs","dirtyValue","createItems","items","bind$1","bound","addFragment","max","item","found","findContext","viewmodel","ELEMENT","el","findRepeatingFragment","isIteration","source","processItems","_guid","parsed","parseJSON","argsList","resetTemplate","wasBound","wasRendered","callback","ReferenceResolver","shuffled","toHtml","toEscapedString","toString$1","unrenderAndDestroy$1","updating","addFragmentToRoot","reverse$1","makeArrayMethod","path","shift$1","sort$1","splice$1","teardownHook$1","Hook","unrenderHook$1","unshift$1","proto","Ractive$add","animate","Ractive$animate","Ractive$detach","Ractive$find","Ractive$findAll","Ractive$findAllComponents","Ractive$findComponent","findContainer","Ractive$findContainer","findParent","Ractive$findParent","Ractive$fire","Ractive$get","getNodeInfo","insert","Ractive$insert","link","link$1","merge","thisRactive$merge","observe","observeList","observeOnce","off","Ractive$off","on","Ractive$on","once","Ractive$once","pop","pop$1","push$1","Ractive$render","reset","Ractive$reset","resetPartial","Ractive$resetTemplate","reverse","set","Ractive$set","sort","subtract","Ractive$subtract","teardown","Ractive$teardown","toggle","Ractive$toggle","toCSS","Ractive$toCSS","toCss","toHTML","Ractive$toHTML","toText","Ractive$transition","unlink","unlink$1","Ractive$unrender","unshift","Ractive$update","updateModel","Ractive$updateModel","Date","now","String","trim","Array","filter","Ractive","defineProperties","DEBUG","writable","DEBUG_PROMISES","extend","escapeKey","staticInfo","joinKeys","splitKeypath","unescapeKey","getCSS","Promise","enhance","svg","magic","magicSupported","VERSION","adaptors","components","decorators","events","interpolators","transitions","attribute","twowayBinding","isUnresolved","forceResolution","warnAboutAmbiguity","isReadonly","keypath","getKeypath","replace","isTwoway","wasUndefined","getInitialValue","lastVal","parentForm","resetValue","formBindings","Binding","registerTwowayBinding","getValue","root","locked","end","setting","lastValue","unregisterTwowayBinding","CheckboxBinding","handleDomEvent","attachEvent","checked","BindingGroup","bindings","push$2","CheckboxNameBinding","checkboxName","group","getBindingGroup","noInitialValue","existingValue","bindingValue","arrayContains","changed","wasChecked","isChecked","valueSoFar","ContentEditableBinding","lazy","GenericBinding","timeout","isNumeric","handler","handleDelay","handleBlur","FileBinding","files","MultipleSelectBinding","selectedValues","previousValue","arrayContentsMatch","result","setValue","initialValue","NumericBinding","isNaN","siblings","RadioBinding","getSiblings","RadioNameBinding","getValue$1","nameAttributeBinding","noop","getKeypathModel","SingleSelectBinding","disabled","endsWithSemi","liveQueries","e","toLowerCase","isVoid","voidElementNames","leftovers","m","ConditionalAttribute","attr","recreateTwowayBinding","createTwowayBinding","twoway","selectBinding","live","namespace","getNamespace","existing","nodeName","defineProperty","proxy","setAttribute","children","childNodes","removeAttribute","updateLiveQueries$1","transitionsEnabled","registerTransition","makeDirty$1","attrs","stringifyAttribute","isSelected","inputIsCheckedRadio","cls","safeAttributeString","getString","inlineClass","str","detachWhenReady","removeFromLiveQueries","handleReset","isStatic","resolve$2","safeToStringValue","string","data","defaultValue","Mapping","instance","joinKey","createMapping","boundFragment","updateDelegate","selectedAttribute","refName","templateObj","getPartialTemplate","named","parsePartial","forceResetTemplate","doInAttributes","iterations","keyRef","pendingNewIndices","previousIterations","createIteration","isObject","refs","split","key","z","aliases","iteration","slice","newIndex","oldIndex","unrenderAndDestroy","updatePostShuffle","toRemove","oldKeys","wasArray","newLength","indices","oldLen","removed","frag","contiguous","startIndex","k","l","Model","base","baseResolver","intermediary","members","addShuffleTask","REFERENCE","ExpressionProxy","ReferenceExpressionProxy","shouldCapture","joinAll","keypathModel","mark","oneway","findBoundValue","deps","childByKey","child","ReferenceExpressionChild","links","marked","clearUnresolveds","retrieve","unreference","dep","resolveAliases","space","remove$1","escape$1","textTypes","accept-charset","accesskey","bgcolor","class","codebase","colspan","contenteditable","datetime","dirname","for","http-equiv","ismap","maxlength","novalidate","pubdate","readonly","rowspan","tabindex","usemap","booleanAttributes","namespaces","useProperty","isBoolean","lookupNamespace","getUpdateDelegate","substr","decamelize","flag","set$2","div$1","isSvg","svg$1","parseAttributes","notIn","mutatorMethods","patchedArrayProto","methodName","getNewIndices","wrappers","processWrapper","configurable","patchArrayMethods","unpatchArrayMethods","__proto__","unpatch","patch","errorMessage$1","arrayAdaptor","object","wrap","ArrayWrapper","__model","instances","storage","magicAdaptor","MagicWrapper","magicAdaptor$1","originalDescriptors","originalDescriptor","getOwnPropertyDescriptor","childKeypath","descriptor","createOrWrapDescriptor","__magic","revert","dependants","MagicArrayWrapper","magicWrapper","arrayWrapper","magicArrayAdaptor","Computation","signature","isExpression","setter","computationContext","dependencies","capture","wrapper","newWrapperValue","adapt","wrapperValue","startCapturing","getter","message","hasConsole","console","groupCollapsed","functionBody","prettify","getterString","stack","getterUseStack","truncateStack","error","groupEnd","stopCapturing","setDependencies","registerChange","ComputationChild","model$1","computations","dependent","RactiveModel","changes","hasProp$1","RootModel","expressions","applyChanges","_changeHash","flush","compute","computation","createLink","targetPath","splitKeypathI","virtual","getVirtual","getRactiveModel","ractiveModel","getValueChildren","_link","has","unescapedKey","Function","opts","GlobalModel$1","localKey","origin","constructHook","registryNames$1","uid","HookQueue","hook","inProcess","queue","begin","getChildQueue","configHook","initHook","DOMEvent","fatal","listen","directive","warnOnce","original","unlisten","CustomEvent","eventPlugin","RactiveEvent","cancel","specialPattern","dollarArgsPattern","COMPONENT","action","specialMatch","special","dollarMatch","passedArgs","addHelpers","obj","oldEvent","preventDefault","stopPropagation","fireEvent","method","teardownHook","Component","ComponentConstructor","p","content","_partials","construct","eventHandlers","setupEvents","initialise","checkYielders","render$1","updateLiveQueries","handlers","eventNames","makeDirty","_observers","removeFromLiveComponentQueries","__ractive_instances__","missingDecorator","dynamicName","dynamicArgs","nameFragment","argsFragment","nameChanged","args$1","parentValue","createBranch","adaptor","getPrefixer","from","ticker","stop","fulfilPromise","applyValue","isEqual","notifyUpstream","branch","unwrap","KeypathModel","lastLink","old","rewrap","comparator","oldArray","newArray","recreateArray","oldLength","usedIndices","firstUnusedIndex","shuffling","keyModels","getKeyModel","upstream","fireShuffleTasks","ModelBase","GlobalModel","global","window","keypathExpr","arrayProto","comparators","updateHook","modelPush","modelPop","modelShift","modelUnshift","modelSort","modelSplice","modelReverse","insertHook","reference","normalise","contexts","addUnresolved","attemptResolution","resolveAmbiguousReference","removeUnresolved","unresolved","c","Observer","init","dispatch","oldValue","newValue","defer","strict","cancelled","addObserver","PatternObserver","baseModel","pattern","baseKeypath","oldValues","newValues","partial","findMatches","registerPatternObserver","unregisterPatternObserver","newKeys","wildcards","notify","touchedFrom","count","ok","check","ListObserver","pending","sliced","negativeOne","inserted","deleted","hadIndex","onceOptions","PREFIX","styleDefinitions","isDirty","styleElement","useCssText","getElementsByTagName","styleSheet","Parser","ParseError","renderHook","completeHook","adaptConfigurator","Parent","combine","ensureArray","selectorsPattern","keyframesDeclarationPattern","selectorUnitPattern","excludePattern","dataRvcGuidPattern","cssConfigurator","css","id","uuid","noCssTransform","transformCss","cssId","addCSS","dataConfigurator","combine$1","TEMPLATE_VERSION","functions","leadingWhitespace","lineStart","lines","lineEnds","line","lineEnd","read","leftover","remaining","postProcess","converters","getContextMessage","getLinePos","lineNum","columnNum","contextLines","contextUp","contextDown","numTabs","annotation","match","char","msg","character","shortMessage","matchString","matchPattern","allowWhitespace","nextChar","Child","hasOwn","stringMiddlePattern","escapeSequencePattern","lineContinuationPattern","Parser$1","INVERTED","CLOSING","COMMENT","DELIMCHANGE","CLOSING_TAG","INLINE_PARTIAL","NUMBER_LITERAL","STRING_LITERAL","ARRAY_LITERAL","OBJECT_LITERAL","BOOLEAN_LITERAL","REGEXP_LITERAL","GLOBAL","KEY_VALUE_PAIR","REFINEMENT","MEMBER","PREFIX_OPERATOR","BRACKETED","CONDITIONAL","INFIX_OPERATOR","INVOCATION","ELSE","ELSEIF","delimiterChangePattern","whitespacePattern","regexpPattern","pattern$1","regExpCache","htmlEntities","quot","amp","apos","lt","gt","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","OElig","oelig","Scaron","scaron","Yuml","fnof","circ","tilde","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","bull","hellip","permil","prime","Prime","lsaquo","rsaquo","oline","frasl","euro","image","weierp","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","part","exist","empty","nabla","isin","notin","ni","prod","sum","minus","lowast","radic","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams","controlCharacters","entityPattern","codePointSupport","fromCodePoint","codeToChar","fromCharCode","lessThan","greaterThan","invalid","expectedExpression","expectedParen","numberPattern","globals","keywords","getSingleQuotedString","makeQuotedStringMatcher","getDoubleQuotedString","namePattern","identifier","prefixPattern","readTypeOf","makePrefixSequenceMatcher","legalReference","relaxedName","specials","specialCall","spreadPattern","symbol","fallthrough","parser","expression","readExpression","matcher","prefixOperators","readMemberOrInvocation","readLogicalOr","makeInfixSequenceMatcher","readTypeof","left","right","infixOperators","ExpressionParser","readLogicalOr$1","specials$1","true","false","null","specialsPattern","numberPattern$1","placeholderPattern","placeholderAtStartPattern","onlyWhitespace","JsonParser","placeholder","number","stringLiteral","readStringLiteral","$1","pair","getKeyValuePair","valueToken","methodCallPattern","blank","spreadArgs","disallowedContents","attributeNamePattern","onPattern","proxyEventPattern","reservedEventNames","decoratorPattern","transitionPattern","directives","intro-outro","intro","outro","decorator","unquotedAttributeValueTextPattern","delimiterChangeToken","exclude","legalAlias","asRE","yieldPattern","elsePattern","elsePattern$1","handlebarsBlockCodes","each","if","with","unless","indexRefPattern","keyIndexRefPattern","handlebarsBlockPattern","OPEN_COMMENT","CLOSE_COMMENT","leadingLinebreak","trailingLinebreak","contiguousWhitespace","preserveWhitespaceElements","leadingWhitespace$1","trailingWhitespace","leadingNewLine","trailingNewLine","closingTagPattern","tagNamePattern","validTagNameFollower","li","dt","dd","rt","rp","optgroup","thead","tbody","tfoot","tr","td","th","StandardParser","startPattern","namePattern$1","finishPattern","partialDefinitionSectionPattern","STANDARD_READERS","readPartial","readUnescaped","readSection","readYielder","readInterpolator","readComment","TRIPLE_READERS","readTriple","STATIC_READERS","computedStrings","computed","fromComputationString","READERS","readMustache","readHtmlComment","readElement","readText","PARTIAL_READERS","readPartialDefinitionComment","readPartialDefinitionSection","tripleDelimiters","staticDelimiters","staticTripleDelimiters","standardDelimiters","delimiters","tags","isTriple","open","close","readers","sortMustacheTags","sectionDepth","elementStack","script","sanitize","elements","eventAttributes","stripComments","preserveWhitespace","sanitizeElements","sanitizeEventAttributes","includeLinePositions","textOnlyMode","csp","cleanup","expr","insertExpressions","readTemplate","b","parseOptions","TEMPLATE_INSTRUCTIONS","COMPUTATION_INSTRUCTIONS","fromId","noThrow","getElementById","textContent","isParsed","getParseOptions","reduce","val","throwNoParse","addFunctions","parseFor","templateConfigurator","parseTemplate","getDynamicTemplate","_config","extendPartials","registryNames","Registry","useDefaults","configure","registry","isOwner","registries","custom","defaultKeys","isStandardKey","makeObj","isBlacklisted","order","config","shouldRerender","completeHook$1","resetHook","renderHook$1","unrenderHook","createResolver","actuallyChanged","registered","bindName","bindChecked","typeAttribute","valueAttribute","nameAttribute","xmlns","updateModel$1","childData","getPartialFromRegistry","fillGaps","findParentPartial","findInstance","noRegistryFunctionReturn","findOwner","findConstructor","_Parent","hasIndexRef","hyphenatedStr","selectedOption","selectedIndex","firstChild","getComponentConstructor","guid","counter","placeholderId","newModel","build","torndown","TypeError","badArguments","gather","ids","HTMLElement","here","cascade","updateFromBindings","wrap$1","superMethod","force","needsSuper","hasSuper","_super","addRegistries","addOtherOptions","addRegistry","_method","extendOne","append","modifyArrays","isolated","noIntro","linear","easeIn","Math","pow","easeOut","easeInOut","document","navigator","appName","warn","div","methodNames","unprefixed","prefixed","makeFunction","implementation","hasFeature","mathml","xlink","xml","ns","createElementNS","cloneNode","decamel","desc","F","log","printWarning","welcome","alreadyWarned","welcomeIntro","WELCOME_MESSAGE","hasGroup","intermediate","min","properties","snap","deprecations","deprecated","replacement","deprecate","arg","_Promise","PENDING","FULFILLED","REJECTED","dispatchHandlers","makeResolver","reject","fulfilledHandlers","rejectedHandlers","state","newState","makeDispatcher","wait","onFulfilled","onRejected","promise2","processResolutionHandler","forward","p1result","all","promises","processPromise","reason","TransitionManager","intros","outros","totalChildren","outroChildren","detachQueue","outrosComplete","addChild","decrementOutros","decrementTotal","detachNodes","_detachNodes","ready","detachImmediate","batch","changeHook","returnPromise","previousBatch","transitionManager","fragments","tasks","immediateObservers","deferredObservers","ractives","flushChanges","addInstance","observer","thing","task","postRender","_batch","refPattern","splitPattern","escapeKeyPattern","unescapeKeyPattern","fnBind","star","errorMessage","noAnimation","detachHook","Query","isComponentQuery","_root","nodeOrComponent","sortByItemPosition","sortByDocumentPosition","captureGroup","starMaps","wildcardCache","KeyModel","isKey","dependant","registerLink","unregisterLink","isKeypath","getChild","rebindChildren","removeChild","hasProp","shuffleTasks","early","registerQueue","unresolvedByKey","patternObservers","stage","specificKey","hasKey","existingMatches","skip","child$1","notifiedUpstream","relinking","LinkModel","isLink","sourcePath","markedAll","relinked","lnk","ln","requestAnimationFrame","lastTime","currTime","timeToCall","rAF","getTime","performance","tickers","running","tick","elapsed","eased","abort","prefixers","stringify","stringified","extractRefs","vars","list","spread","readKey","processDirective","tokens","parentParser","token","colonIndex","directiveName","directiveArgs","flattenExpression","parser$1","readAttribute","nearest","readAttributeValue","valueStart","startDepth","readQuotedAttributeValue","readUnquotedAttributeValue","readUnquotedAttributeValueToken","text","haystack","needles","getLowestIndex","quoteMark","readQuotedStringToken","readAttributeOrDirective","mustache","inside","readMustacheOfType","inTag","tag","reader","readDelimiterChange","rewind","readNumberLiteral","refineExpression","referenceExpression","getReferenceExpression","rx","refinement","triple","readAliases","alias","readAlias","relaxedNames","strictRefinement","readExpressionOrReference","expectedFollowers","readReference","yielder","readClosing","closing","readElse","readElseIf","section","hasElse","block","unlessBlock","closed","expectedClose","aliasOnly","extra","endIndex","comment","stripStandalones","backOne","backTwo","lastSectionItem","isString","isComment","isSection","lastItem","trimWhitespace","leadingPattern","trailingPattern","removeLeadingWhitespace","removeTrailingWhitespace","previousItem","nextItem","preserveWhitespaceInsideFragment","removeLeadingWhitespaceInsideFragment","removeTrailingWhitespaceInsideFragment","isPreserveWhitespaceElement","readClosingTag","selfClosing","hasPartials","closingTag","lowerCaseName","canContain","closingTagName","disallowed","barrier","endPattern","escapeRegExp","addTo","hasChildren","fromExpression","instructions","createFunction","body","createFunctionFromString","bindTo","initial","parseAsString","validate$1","existingPartials","newPartials","overwrite","getSuperMethod","_parent","oldSuper","getMessage","correct","isError","deprecateOption","deprecatedOption","extendOtherMethods","member","rerender","collect","dest","collection","orComponent","readStyle","rule","rules","readClass","updateId","updateMultipleSelectValue","updateSelectValue","updateStringValue","updateContentEditableValue","updateRadioValue","updateValue","updateRadioName","updateCheckboxName","updateStyleAttribute","updateInlineStyle","updateClassName","updateInlineClass","type$1","updateBoolean","updateNamespacedAttribute","updateAttribute","wasSelected","prev","setProperty","className","baseVal","removeAttributeNS","setAttributeNS","qualified","hasAttribute","needle","enumerable","fnBody","tabs","minIndent","Infinity","truncated","getComputationSignature","setterString","initialiseProperties","deprecateRactiveData","getAdaptors","combine$2","arrays","res","protoAdapt","lookup","builtins","srcs","_subs","_eventQueue","_liveQueries","_liveComponentQueries","hookQueue","childQueue","userOptions","getElement","logIfDebug","description","factory","exports","module","define","amd","noConflict","output","sources","isFinite","format","registryName","interpol","arrayLike","called","resolvePromise","rejectPromise","y","tm","notifiedTotal","manager","trans","collectAllOutros","contains","which","ractive$1","pairs","sets","getOptions","protoAnimate","isDetached","otherNode","compareDocumentPosition","mutualAncestor","ancestryA","getAncestry","ancestryB","oldestA","oldestB","fragmentA","fragmentB","getParent","ancestry","ancestor","enqueue","dequeue","getPotentialWildcardMatches","starMap","mapper","wildcardKeypath","getStarMap","num","binary","ones","parseInt","digit","_noArg","fireEventAs","getWildcardNames","initialFire","subscribers","notifySubscribers","originalEvent","stopEvent","badReference","hasContextChain","crossedComponentBoundary","localViewmodel","parts","prefixKeypath","rootKeypath","rootDot","relativeKeypath","match$1","repeater","gatherRefs","spliceArguments","removeStart","removeEnd","balance","getSpliceEquivalent","mdl","result$1","promise$1","getComparator","JSON","merge$1","compare","update$2","build$1","findModel","_element","resolve$1","add$1","there","set$1","drop","update$1","isBound","getBindingModel","getBindingPath","getBinding","ctx","setBinding","rootpath","fireInsertHook","observers","keypaths","createObserver","wildcardIndex","notEmptyString","listeners","listener","styleDefinition","applyCSS","cssText","others","cleanCss","additionalReplaceRules","reconstruct","trim$1","extractString","unit","transformSelector","selectorUnits","modifiers","transformed","appended","prepended","dataAttr","selectors","s4","floor","random","validate","childValue","parentIsFn","childIsFn","fromProperties","callDataFunction","primary","secondary","hasThis","exp","opening","search","entity","code","validateCode","readNumberLiteral$1","readBooleanLiteral","okQuote","literal","done","charCodeAt","readKeyValuePair","refKey","readKeyValuePairs","keyValuePairs","readObjectLiteral","readExpressionList","readArrayLiteral","expressionList","readLiteral","startPos","fullLength","lastDotIndex","lastIndexOf","refLength","readBracketedExpression","readPrimary","readRefinement","getConditional","ifTrue","ifFalse"],"mappings":"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AAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,IAAK,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,KAAM,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,IAAK,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,OAAQ,IAAKC,KAAM,IAAKC,KAAM,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,KAAM,IAAKC,MAAO,IAAKC,MAAO,IAAKC,QAAS,IAAKC,KAAM,IAAKC,IAAK,IAAKC,MA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"}