{"version":3,"sources":["jsdelivr-header.js","/npm/tinybind@1.0.0/src/constants.js","/npm/tinybind@1.0.0/src/parsers.js","/npm/tinybind@1.0.0/src/observer.js","/npm/tinybind@1.0.0/src/tinybind.js","/npm/tinybind@1.0.0/src/view.js","/npm/tinybind@1.0.0/src/binders.js","/npm/tinybind@1.0.0/src/bindings.js","/npm/tinybind@1.0.0/src/adapter.js","/npm/tinybind@1.0.0/src/component.js","/npm/tinybind@1.0.0/src/export.js","/npm/tinybind@1.0.0/src/formatters.js","jsdelivr-separator.js","/npm/js-event-bus@1.0.0/lib/js-event-bus.min.js"],"names":[],"mappings":"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","file":"bundle.js","sourceRoot":"","sourcesContent":["/**\n * Combined by jsDelivr.\n * Original files:\n * - /npm/tinybind@1.0.0/dist/tinybind.min.js\n * - /npm/js-event-bus@1.0.0/lib/js-event-bus.min.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export const OPTIONS = [\r\n  'prefix',\r\n  'templateDelimiters',\r\n  'rootInterface',\r\n  'preloadData',\r\n  'handler'\r\n]\r\n\r\nexport const EXTENSIONS = [\r\n  'binders',\r\n  'formatters',\r\n  'adapters'\r\n]","const PRIMITIVE = 0\r\nconst KEYPATH = 1\r\nconst TEXT = 0\r\nconst BINDING = 1\r\n\r\nconst QUOTED_STR = /^'.*'$|^\".*\"$/\r\n\r\n// Parser and tokenizer for getting the type and value from a string.\r\nexport function parseType(string) {\r\n  let type = PRIMITIVE\r\n  let value = string\r\n\r\n  if (QUOTED_STR.test(string)) {\r\n    value = string.slice(1, -1)\r\n  } else if (string === 'true') {\r\n    value = true\r\n  } else if (string === 'false') {\r\n    value = false\r\n  } else if (string === 'null') {\r\n    value = null\r\n  } else if (string === 'undefined') {\r\n    value = undefined\r\n  } else if (!isNaN(string)) {\r\n    value = Number(string)\r\n  } else {\r\n    type = KEYPATH\r\n  }\r\n\r\n  return {type: type, value: value}\r\n}\r\n\r\n// Template parser and tokenizer for mustache-style text content bindings.\r\n// Parses the template and returns a set of tokens, separating static portions\r\n// of text from binding declarations.\r\nexport function parseTemplate(template, delimiters) {\r\n  var tokens\r\n  let length = template.length\r\n  let index = 0\r\n  let lastIndex = 0\r\n  let open = delimiters[0], close = delimiters[1]\r\n\r\n  while (lastIndex < length) {\r\n    index = template.indexOf(open, lastIndex)\r\n\r\n    if (index < 0) {\r\n      if (tokens) {\r\n        tokens.push({\r\n          type: TEXT,\r\n          value: template.slice(lastIndex)\r\n        })\r\n      }\r\n\r\n      break\r\n    } else {\r\n      tokens || (tokens = [])\r\n      if (index > 0 && lastIndex < index) {\r\n        tokens.push({\r\n          type: TEXT,\r\n          value: template.slice(lastIndex, index)\r\n        })\r\n      }\r\n\r\n      lastIndex = index + open.length\r\n      index = template.indexOf(close, lastIndex)\r\n\r\n      if (index < 0) {\r\n        let substring = template.slice(lastIndex - close.length)\r\n        let lastToken = tokens[tokens.length - 1]\r\n\r\n        if (lastToken && lastToken.type === TEXT) {\r\n          lastToken.value += substring\r\n        } else {\r\n          tokens.push({\r\n            type: TEXT,\r\n            value: substring\r\n          })\r\n        }\r\n\r\n        break\r\n      }\r\n\r\n      let value = template.slice(lastIndex, index).trim()\r\n\r\n      tokens.push({\r\n        type: BINDING,\r\n        value: value\r\n      })\r\n\r\n      lastIndex = index + close.length\r\n    }\r\n  }\r\n\r\n  return tokens\r\n}\r\n","\r\n// Check if a value is an object than can be observed.\r\nfunction isObject(obj) {\r\n  return typeof obj === 'object' && obj !== null\r\n}\r\n\r\n// Error thrower.\r\nfunction error(message) {\r\n  throw new Error(`[Observer] ${message}`)\r\n}\r\n\r\nlet adapters;\r\nlet interfaces;\r\nlet rootInterface;\r\n\r\n// Constructs a new keypath observer and kicks things off.\r\nclass Observer {\r\n  static updateOptions (options) {\r\n    adapters = options.adapters\r\n    interfaces = Object.keys(adapters)\r\n    rootInterface = options.rootInterface\r\n  }\r\n  \r\n  // Tokenizes the provided keypath string into interface + path tokens for the\r\n  // observer to work with.\r\n  static tokenize (keypath, root) {\r\n    const tokens = [];\r\n    let current = {i: root, path: ''};\r\n    let index;\r\n    let chr;\r\n  \r\n    for (index = 0; index < keypath.length; index++) {\r\n      chr = keypath.charAt(index)\r\n  \r\n      if (!!~interfaces.indexOf(chr)) {\r\n        tokens.push(current)\r\n        current = {i: chr, path: ''}\r\n      } else {\r\n        current.path += chr\r\n      }\r\n    }\r\n  \r\n    tokens.push(current)\r\n    return tokens\r\n  }\r\n\r\n  constructor(obj, keypath, callback) {\r\n    this.keypath = keypath\r\n    this.callback = callback\r\n    this.objectPath = []\r\n    this.parse()\r\n    this.obj = this.getRootObject(obj)\r\n\r\n    if (isObject(this.target = this.realize())) {\r\n      this.set(true, this.key, this.target, this.callback)\r\n    }\r\n  }\r\n\r\n  // Parses the keypath using the interfaces defined on the view. Sets variables\r\n  // for the tokenized keypath as well as the end key.\r\n  parse() {\r\n    let path;\r\n    let root;\r\n\r\n    if (!interfaces.length) {\r\n      error('Must define at least one adapter interface.')\r\n    }\r\n\r\n    if (!!~interfaces.indexOf(this.keypath[0])) {\r\n      root = this.keypath[0]\r\n      path = this.keypath.substr(1)\r\n    } else {\r\n      root = rootInterface\r\n      path = this.keypath\r\n    }\r\n\r\n    this.tokens = Observer.tokenize(path, root)\r\n    this.key = this.tokens.pop()\r\n  }\r\n\r\n  // Realizes the full keypath, attaching observers for every key and correcting\r\n  // old observers to any changed objects in the keypath.\r\n  realize() {\r\n    let current = this.obj;\r\n    let unreached = -1;\r\n    let prev;\r\n    let token;\r\n\r\n    for (let index = 0; index < this.tokens.length; index++) {\r\n      token = this.tokens[index]\r\n      if (isObject(current)) {\r\n        if (typeof this.objectPath[index] !== 'undefined') {\r\n          if (current !== (prev = this.objectPath[index])) {\r\n            this.set(false, token, prev, this)\r\n            this.set(true, token, current, this)\r\n            this.objectPath[index] = current\r\n          }\r\n        } else {\r\n          this.set(true, token, current, this)\r\n          this.objectPath[index] = current\r\n        }\r\n\r\n        current = this.get(token, current)\r\n      } else {\r\n        if (unreached === -1) {\r\n          unreached = index\r\n        }\r\n\r\n        if (prev = this.objectPath[index]) {\r\n          this.set(false, token, prev, this)\r\n        }\r\n      }\r\n    }\r\n\r\n    if (unreached !== -1) {\r\n      this.objectPath.splice(unreached)\r\n    }\r\n\r\n    return current\r\n  }\r\n\r\n  // Updates the keypath. This is called when any intermediary key is changed.\r\n  sync() {\r\n    let next;\r\n    let oldValue;\r\n    let newValue;\r\n\r\n    if ((next = this.realize()) !== this.target) {\r\n      if (isObject(this.target)) {\r\n        this.set(false, this.key, this.target, this.callback)\r\n      }\r\n\r\n      if (isObject(next)) {\r\n        this.set(true, this.key, next, this.callback)\r\n      }\r\n\r\n      oldValue = this.value()\r\n      this.target = next\r\n      newValue = this.value()\r\n      if (newValue !== oldValue || newValue instanceof Function) this.callback.sync()\r\n    } else if (next instanceof Array) {\r\n      this.callback.sync()\r\n    }\r\n  }\r\n\r\n  // Reads the current end value of the observed keypath. Returns undefined if\r\n  // the full keypath is unreachable.\r\n  value() {\r\n    if (isObject(this.target)) {\r\n      return this.get(this.key, this.target)\r\n    }\r\n  }\r\n\r\n  // Sets the current end value of the observed keypath. Calling setValue when\r\n  // the full keypath is unreachable is a no-op.\r\n  setValue(value) {\r\n    if (isObject(this.target)) {\r\n      adapters[this.key.i].set(this.target, this.key.path, value)\r\n    }\r\n  }\r\n\r\n  // Gets the provided key on an object.\r\n  get(key, obj) {\r\n    return adapters[key.i].get(obj, key.path);\r\n  }\r\n\r\n  // Observes or unobserves a callback on the object using the provided key.\r\n  set(active, key, obj, callback) {\r\n    const action = active ? 'observe' : 'unobserve';\r\n    adapters[key.i][action](obj, key.path, callback)\r\n  }\r\n\r\n  // Unobserves the entire keypath.\r\n  unobserve() {\r\n    let obj;\r\n    let token;\r\n\r\n    for (let index = 0; index < this.tokens.length; index++) {\r\n      token = this.tokens[index]\r\n      if (obj = this.objectPath[index]) {\r\n        this.set(false, token, obj, this)\r\n      }\r\n    }\r\n\r\n    if (isObject(this.target)) {\r\n      this.set(false, this.key, this.target, this.callback)\r\n    }\r\n  }\r\n\r\n  // traverse the scope chain to find the scope which has the root property\r\n  // if the property is not found in chain, returns the root scope\r\n  getRootObject(obj) {\r\n    let rootProp;\r\n    let current;\r\n    if (!obj.$parent) {\r\n      return obj;\r\n    }\r\n\r\n    if (this.tokens.length) {\r\n      rootProp = this.tokens[0].path\r\n    } else {\r\n      rootProp = this.key.path\r\n    }\r\n\r\n    current = obj;\r\n    while (current.$parent && (current[rootProp] === undefined)) {\r\n      current = current.$parent\r\n    }\r\n\r\n    return current;\r\n  }\r\n}\r\n\r\nexport default Observer\r\n","import {EXTENSIONS} from './constants'\r\nimport {parseTemplate, parseType} from './parsers'\r\n\r\nconst tinybind = {\r\n  // Global binders.\r\n  binders: {},\r\n\r\n  // Global formatters.\r\n  formatters: {},\r\n\r\n  // Global sightglass adapters.\r\n  adapters: {},\r\n\r\n  // Default attribute prefix.\r\n  _prefix: 'rv',\r\n\r\n  _fullPrefix: 'rv-',\r\n\r\n  get prefix () {\r\n    return this._prefix\r\n  },\r\n\r\n  set prefix (value) {\r\n    this._prefix = value\r\n    this._fullPrefix = value + '-'\r\n  },\r\n\r\n  parseTemplate: parseTemplate,\r\n\r\n  parseType: parseType,\r\n\r\n  // Default template delimiters.\r\n  templateDelimiters: ['{', '}'],\r\n\r\n  // Default sightglass root interface.\r\n  rootInterface: '.',\r\n\r\n  // Preload data by default.\r\n  preloadData: true,\r\n\r\n  // Default event handler.\r\n  handler: function(context, ev, binding) {\r\n    this.call(context, ev, binding.view.models)\r\n  },\r\n\r\n  // Sets the attribute on the element. If no binder above is matched it will fall\r\n  // back to using this binder.\r\n  fallbackBinder: function(el, value) {\r\n    if (value != null) {\r\n      el.setAttribute(this.type, value)\r\n    } else {\r\n      el.removeAttribute(this.type)\r\n    }  \r\n  },\r\n\r\n  // Merges an object literal into the corresponding global options.\r\n  configure: function(options) {\r\n    if (!options) {\r\n      return\r\n    }\r\n    Object.keys(options).forEach(option => {\r\n      let value = options[option]\r\n\r\n      if (EXTENSIONS.indexOf(option) > -1) {\r\n        Object.keys(value).forEach(key => {\r\n          this[option][key] = value[key]\r\n        })\r\n      } else {\r\n        this[option] = value\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\nexport default tinybind\r\n","import tinybind from './tinybind'\r\nimport {Binding} from './bindings'\r\nimport {parseTemplate} from './parsers'\r\n\r\nconst textBinder = {\r\n  routine: (node, value) => {\r\n    node.data = (value != null) ? value : ''\r\n  }\r\n}\r\n\r\nconst DECLARATION_SPLIT = /((?:'[^']*')*(?:(?:[^\\|']*(?:'[^']*')+[^\\|']*)+|[^\\|]+))|^$/g\r\n\r\nconst parseNode = (view, node) => {\r\n  let block = false\r\n\r\n  if (node.nodeType === 3) {\r\n    let tokens = parseTemplate(node.data, tinybind.templateDelimiters)\r\n\r\n    if (tokens) {\r\n      for (let i = 0; i < tokens.length; i++) {\r\n        let token = tokens[i]\r\n        let text = document.createTextNode(token.value)\r\n        node.parentNode.insertBefore(text, node)\r\n\r\n        if (token.type === 1) {\r\n          view.buildBinding(text, null, token.value, textBinder, null)\r\n        }\r\n      }\r\n\r\n      node.parentNode.removeChild(node)\r\n    }\r\n    block = true\r\n  } else if (node.nodeType === 1) {\r\n    block = view.traverse(node)\r\n  }\r\n\r\n  if (!block) {\r\n    for (let i = 0; i < node.childNodes.length; i++) {\r\n      parseNode(view, node.childNodes[i]);\r\n    }\r\n  }\r\n}\r\n\r\nconst bindingComparator = (a, b) => {\r\n  let aPriority = a.binder ? (a.binder.priority || 0) : 0\r\n  let bPriority = b.binder ? (b.binder.priority || 0) : 0\r\n  return bPriority - aPriority\r\n}\r\n\r\nconst trimStr = (str) => {\r\n  return str.trim()\r\n}\r\n\r\n// A collection of bindings built from a set of parent nodes.\r\nexport default class View {\r\n  // The DOM elements and the model objects for binding are passed into the\r\n  // constructor along with any local options that should be used throughout the\r\n  // context of the view and it's bindings.\r\n  constructor(els, models, options) {\r\n    if (els.jquery || els instanceof Array) {\r\n      this.els = els\r\n    } else {\r\n      this.els = [els]\r\n    }\r\n\r\n    this.models = models\r\n    this.options = options\r\n\r\n    this.build()\r\n  }\r\n\r\n\r\n  buildBinding(node, type, declaration, binder, arg) {\r\n    let pipes = declaration.match(DECLARATION_SPLIT).map(trimStr)\r\n\r\n    let keypath = pipes.shift()\r\n\r\n    this.bindings.push(new Binding(this, node, type, keypath, binder, arg, pipes))\r\n  }\r\n\r\n  // Parses the DOM tree and builds `Binding` instances for every matched\r\n  // binding declaration.\r\n  build() {\r\n    this.bindings = []\r\n\r\n    let elements = this.els, i, len;\r\n    for (i = 0, len = elements.length; i < len; i++) {\r\n      parseNode(this, elements[i])\r\n    }\r\n\r\n    this.bindings.sort(bindingComparator)\r\n  }\r\n\r\n  traverse(node) {\r\n    let bindingPrefix = tinybind._fullPrefix\r\n    let block = node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE'\r\n    let attributes = node.attributes\r\n    let bindInfos = []\r\n    let starBinders = this.options.starBinders\r\n    var type, binder, identifier, arg\r\n\r\n\r\n    for (let i = 0, len = attributes.length; i < len; i++) {\r\n      let attribute = attributes[i]\r\n      if (attribute.name.indexOf(bindingPrefix) === 0) {\r\n        type = attribute.name.slice(bindingPrefix.length)\r\n        binder = this.options.binders[type]\r\n        arg = undefined\r\n\r\n        if (!binder) {\r\n          for (let k = 0; k < starBinders.length; k++) {\r\n            identifier = starBinders[k]\r\n            if (type.slice(0, identifier.length - 1) === identifier.slice(0, -1)) {\r\n              binder = this.options.binders[identifier]\r\n              arg = type.slice(identifier.length - 1)\r\n              break\r\n            }\r\n          }\r\n        }\r\n\r\n        if (!binder) {\r\n          binder = tinybind.fallbackBinder\r\n        }\r\n\r\n        if (binder.block) {\r\n          this.buildBinding(node, type, attribute.value, binder, arg)\r\n          node.removeAttribute(attribute.name)\r\n          return true;\r\n        }\r\n\r\n        bindInfos.push({attr: attribute, binder: binder, type: type, arg: arg})\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < bindInfos.length; i++) {\r\n      let bindInfo = bindInfos[i]\r\n      this.buildBinding(node, bindInfo.type, bindInfo.attr.value, bindInfo.binder, bindInfo.arg)\r\n      node.removeAttribute(bindInfo.attr.name)\r\n    }\r\n\r\n    return block\r\n  }\r\n\r\n  // Binds all of the current bindings for this view.\r\n  bind() {\r\n    this.bindings.forEach(binding => {\r\n      binding.bind()\r\n    })\r\n  }\r\n\r\n  // Unbinds all of the current bindings for this view.\r\n  unbind() {\r\n    this.bindings.forEach(binding => {\r\n      binding.unbind()\r\n    })\r\n  }\r\n\r\n  // Syncs up the view with the model by running the routines on all bindings.\r\n  sync() {\r\n    this.bindings.forEach(binding => {\r\n      binding.sync()\r\n    })\r\n  }\r\n\r\n  // Publishes the input values from the view back to the model (reverse sync).\r\n  publish() {\r\n    this.bindings.forEach(binding => {\r\n      if (binding.binder && binding.binder.publishes) {\r\n        binding.publish()\r\n      }\r\n    })\r\n  }\r\n\r\n  // Updates the view's models along with any affected bindings.\r\n  update(models = {}) {\r\n    Object.keys(models).forEach(key => {\r\n      this.models[key] = models[key]\r\n    })\r\n\r\n    this.bindings.forEach(binding => {\r\n      if (binding.update) {\r\n        binding.update(models)\r\n      }\r\n    })\r\n  }\r\n}\r\n","import View from './view'\r\n\r\nconst getString = (value) => {\r\n  return value != null ? value.toString() : undefined\r\n}\r\n\r\nconst times = (n, cb) => {\r\n  for (let i = 0; i < n; i++) cb()\r\n}\r\n\r\nfunction createView(binding, data, anchorEl) {\r\n  let template = binding.el.cloneNode(true)\r\n  let view = new View(template, data, binding.view.options)\r\n  view.bind()\r\n  binding.marker.parentNode.insertBefore(template, anchorEl)\r\n  return view\r\n}\r\n\r\nconst binders = {\r\n  // Binds an event handler on the element.\r\n  'on-*': {\r\n    function: true,\r\n    priority: 1000,\r\n\r\n    unbind: function(el) {\r\n      if (this.handler) {\r\n        el.removeEventListener(this.arg, this.handler)\r\n      }\r\n    },\r\n\r\n    routine: function(el, value) {\r\n      if (this.handler) {\r\n        el.removeEventListener(this.arg, this.handler)\r\n      }\r\n\r\n      this.handler = this.eventHandler(value)\r\n      el.addEventListener(this.arg, this.handler)\r\n    }\r\n  },\r\n\r\n  // Appends bound instances of the element in place for each item in the array.\r\n  'each-*': {\r\n    block: true,\r\n\r\n    priority: 4000,\r\n\r\n    bind: function(el) {\r\n      if (!this.marker) {\r\n        this.marker = document.createComment(` tinybind: ${this.type} `)\r\n        this.iterated = []\r\n\r\n        el.parentNode.insertBefore(this.marker, el)\r\n        el.parentNode.removeChild(el)\r\n      } else {\r\n        this.iterated.forEach(view => {\r\n          view.bind()\r\n        })\r\n      }\r\n    },\r\n\r\n    unbind: function(el) {\r\n      if (this.iterated) {\r\n        this.iterated.forEach(view => {\r\n          view.unbind()\r\n        })\r\n      }\r\n    },\r\n\r\n    routine: function(el, collection) {\r\n      let modelName = this.arg\r\n      collection = collection || []\r\n      let indexProp = el.getAttribute('index-property') || '$index'\r\n\r\n      collection.forEach((model, index) => {\r\n        let data = {$parent: this.view.models}\r\n        data[indexProp] = index\r\n        data[modelName] = model\r\n        let view = this.iterated[index]\r\n\r\n        if (!view) {\r\n\r\n          let previous = this.marker\r\n\r\n          if (this.iterated.length) {\r\n            previous = this.iterated[this.iterated.length - 1].els[0]\r\n          }\r\n\r\n          view = createView(this, data, previous.nextSibling)\r\n          this.iterated.push(view)\r\n        } else {\r\n          if (view.models[modelName] !== model) {\r\n            // search for a view that matches the model\r\n            let matchIndex, nextView\r\n            for (let nextIndex = index + 1; nextIndex < this.iterated.length; nextIndex++) {\r\n              nextView = this.iterated[nextIndex]\r\n              if (nextView.models[modelName] === model) {\r\n                matchIndex = nextIndex\r\n                break\r\n              }\r\n            }\r\n            if (matchIndex !== undefined) {\r\n              // model is in other position\r\n              // todo: consider avoiding the splice here by setting a flag\r\n              // profile performance before implementing such change\r\n              this.iterated.splice(matchIndex, 1)\r\n              this.marker.parentNode.insertBefore(nextView.els[0], view.els[0])\r\n              nextView.models[indexProp] = index\r\n            } else {\r\n              //new model\r\n              nextView = createView(this, data, view.els[0])\r\n            }\r\n            this.iterated.splice(index, 0, nextView)\r\n          } else {\r\n            view.models[indexProp] = index\r\n          }\r\n        }\r\n      })\r\n\r\n      if (this.iterated.length > collection.length) {\r\n        times(this.iterated.length - collection.length, () => {\r\n          let view = this.iterated.pop()\r\n          view.unbind()\r\n          this.marker.parentNode.removeChild(view.els[0])\r\n        })\r\n      }\r\n\r\n      if (el.nodeName === 'OPTION') {\r\n        this.view.bindings.forEach(binding => {\r\n          if (binding.el === this.marker.parentNode && binding.type === 'value') {\r\n            binding.sync()\r\n          }\r\n        })\r\n      }\r\n    },\r\n\r\n    update: function(models) {\r\n      let data = {}\r\n\r\n      //todo: add test and fix if necessary\r\n\r\n      Object.keys(models).forEach(key => {\r\n        if (key !== this.arg) {\r\n          data[key] = models[key]\r\n        }\r\n      })\r\n\r\n      this.iterated.forEach(view => {\r\n        view.update(data)\r\n      })\r\n    }\r\n  },\r\n\r\n  // Adds or removes the class from the element when value is true or false.\r\n  'class-*': function(el, value) {\r\n    let elClass = ` ${el.className} `\r\n\r\n    if (!value === (elClass.indexOf(` ${this.arg} `) > -1)) {\r\n      if (value) {\r\n        el.className = `${el.className} ${this.arg}`\r\n      } else {\r\n        el.className = elClass.replace(` ${this.arg} `, ' ').trim()\r\n      }\r\n    }\r\n  },\r\n\r\n  // Sets the element's text value.\r\n  text: (el, value) => {\r\n    el.textContent = value != null ? value : ''\r\n  },\r\n\r\n  // Sets the element's HTML content.\r\n  html: (el, value) => {\r\n    el.innerHTML = value != null ? value : ''\r\n  },\r\n\r\n  // Shows the element when value is true.\r\n  show: (el, value) => {\r\n    el.style.display = value ? '' : 'none'\r\n  },\r\n\r\n  // Hides the element when value is true (negated version of `show` binder).\r\n  hide: (el, value) => {\r\n    el.style.display = value ? 'none' : ''\r\n  },\r\n\r\n  // Enables the element when value is true.\r\n  enabled: (el, value) => {\r\n    el.disabled = !value\r\n  },\r\n\r\n  // Disables the element when value is true (negated version of `enabled` binder).\r\n  disabled: (el, value) => {\r\n    el.disabled = !!value\r\n  },\r\n\r\n  // Checks a checkbox or radio input when the value is true. Also sets the model\r\n  // property when the input is checked or unchecked (two-way binder).\r\n  checked: {\r\n    publishes: true,\r\n    priority: 2000,\r\n\r\n    bind: function(el) {\r\n      var self = this;\r\n      if (!this.callback) {\r\n        this.callback = function () {\r\n          self.publish();\r\n        }\r\n      }\r\n      el.addEventListener('change', this.callback)\r\n    },\r\n\r\n    unbind: function(el) {\r\n      el.removeEventListener('change', this.callback)\r\n    },\r\n\r\n    routine: function(el, value) {\r\n      if (el.type === 'radio') {\r\n        el.checked = getString(el.value) === getString(value)\r\n      } else {\r\n        el.checked = !!value\r\n      }\r\n    }\r\n  },\r\n\r\n  // Sets the element's value. Also sets the model property when the input changes\r\n  // (two-way binder).\r\n  value: {\r\n    publishes: true,\r\n    priority: 3000,\r\n\r\n    bind: function(el) {\r\n      this.isRadio = el.tagName === 'INPUT' && el.type === 'radio';\r\n      if (!this.isRadio) {\r\n        this.event = el.getAttribute('event-name') || (el.tagName === 'SELECT' ? 'change' : 'input')\r\n\r\n        var self = this;\r\n        if (!this.callback) {\r\n          this.callback = function () {\r\n            self.publish();\r\n          }\r\n        }\r\n\r\n        el.addEventListener(this.event, this.callback)\r\n      }\r\n    },\r\n\r\n    unbind: function(el) {\r\n      if (!this.isRadio) {\r\n        el.removeEventListener(this.event, this.callback)\r\n      }\r\n    },\r\n\r\n    routine: function(el, value) {\r\n      if (this.isRadio) {\r\n        el.setAttribute('value', value)\r\n      } else {\r\n        if (el.type === 'select-multiple') {\r\n          if (value instanceof Array) {\r\n            for (let i = 0; i < el.length; i++) {\r\n              let option = el[i];\r\n              option.selected = value.indexOf(option.value) > -1\r\n            }\r\n          }\r\n        } else if (getString(value) !== getString(el.value)) {\r\n          el.value = value != null ? value : ''\r\n        }\r\n      }\r\n    }\r\n  },\r\n\r\n  // Inserts and binds the element and it's child nodes into the DOM when true.\r\n  if: {\r\n    block: true,\r\n    priority: 4000,\r\n\r\n    bind: function(el) {\r\n      if (!this.marker) {\r\n        this.marker = document.createComment(' tinybind: ' + this.type + ' ' + this.keypath + ' ');\r\n        this.attached = false\r\n\r\n        el.parentNode.insertBefore(this.marker, el)\r\n        el.parentNode.removeChild(el)\r\n      } else if (this.bound === false && this.nested) {\r\n        this.nested.bind()\r\n      }\r\n      this.bound = true\r\n    },\r\n\r\n    unbind: function() {\r\n      if (this.nested) {\r\n        this.nested.unbind()\r\n        this.bound = false\r\n      }\r\n    },\r\n\r\n    routine: function(el, value) {\r\n      if (!!value !== this.attached) {\r\n        if (value) {\r\n\r\n          if (!this.nested) {\r\n            this.nested = new View(el, this.view.models, this.view.options)\r\n            this.nested.bind()\r\n          }\r\n\r\n          this.marker.parentNode.insertBefore(el, this.marker.nextSibling)\r\n          this.attached = true\r\n        } else {\r\n          el.parentNode.removeChild(el)\r\n          this.attached = false\r\n        }\r\n      }\r\n    },\r\n\r\n    update: function(models) {\r\n      if (this.nested) {\r\n        this.nested.update(models)\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default binders\r\n","import {parseType} from './parsers'\r\nimport Observer from './observer'\r\n\r\nfunction getInputValue(el) {  \r\n  if (el.type === 'checkbox') {\r\n    return el.checked\r\n  } else if (el.type === 'select-multiple') {\r\n    const results = []\r\n    let option\r\n    for (let i = 0; i < el.options.length; i++) {\r\n      option = el.options[i]\r\n      if (option.selected) {\r\n        results.push(option.value);\r\n      }\r\n    }\r\n    return results\r\n  } else {\r\n    return el.value\r\n  }\r\n}\r\n\r\nconst FORMATTER_ARGS =  /[^\\s']+|'([^']|'[^\\s])*'|\"([^\"]|\"[^\\s])*\"/g\r\nconst FORMATTER_SPLIT = /\\s+/\r\n\r\n// A single binding between a model attribute and a DOM element.\r\nexport class Binding {\r\n  // All information about the binding is passed into the constructor; the\r\n  // containing view, the DOM node, the type of binding, the model object and the\r\n  // keypath at which to listen for changes.\r\n  constructor(view, el, type, keypath, binder, arg, formatters) {\r\n    this.view = view\r\n    this.el = el\r\n    this.type = type\r\n    this.keypath = keypath\r\n    this.binder = binder\r\n    this.arg = arg\r\n    this.formatters = formatters\r\n    this.formatterObservers = {}\r\n    this.model = undefined\r\n  }\r\n\r\n  // Observes the object keypath\r\n  observe(obj, keypath) {\r\n    return new Observer(obj, keypath, this)\r\n  }\r\n\r\n  parseTarget() {\r\n    if (this.keypath) {\r\n      let token = parseType(this.keypath)\r\n\r\n      if (token.type === 0) {\r\n        this.value = token.value\r\n      } else {\r\n        this.observer = this.observe(this.view.models, this.keypath)\r\n        this.model = this.observer.target\r\n      }\r\n    } else {\r\n      this.value = undefined;\r\n    }\r\n  }\r\n\r\n  parseFormatterArguments(args, formatterIndex) {\r\n    return args\r\n      .map(parseType)\r\n      .map(({type, value}, ai) => {\r\n        if (type === 0) {\r\n          return value\r\n        } else {\r\n          if (!this.formatterObservers[formatterIndex]) {\r\n            this.formatterObservers[formatterIndex] = {}\r\n          }\r\n\r\n          let observer = this.formatterObservers[formatterIndex][ai]\r\n\r\n          if (!observer) {\r\n            observer = this.observe(this.view.models, value)\r\n            this.formatterObservers[formatterIndex][ai] = observer\r\n          }\r\n\r\n          return observer.value()\r\n        }\r\n      })\r\n  }\r\n\r\n  // Applies all the current formatters to the supplied value and returns the\r\n  // formatted value.\r\n  formattedValue(value) {\r\n    return this.formatters.reduce((result, declaration, index) => {\r\n      let args = declaration.match(FORMATTER_ARGS)\r\n      let id = args.shift()\r\n      let formatter = this.view.options.formatters[id]\r\n\r\n      const processedArgs = this.parseFormatterArguments(args, index)\r\n\r\n      if (formatter && (formatter.read instanceof Function)) {\r\n        result = formatter.read(result, ...processedArgs)\r\n      } else if (formatter instanceof Function) {\r\n        result = formatter(result, ...processedArgs)\r\n      }\r\n      return result\r\n    }, value)\r\n  }\r\n\r\n  // Returns an event handler for the binding around the supplied function.\r\n  eventHandler(fn) {\r\n    let binding = this\r\n    let handler = binding.view.options.handler\r\n\r\n    return function(ev) {\r\n      handler.call(fn, this, ev, binding)\r\n    }\r\n  }\r\n\r\n  // Sets the value for the binding. This Basically just runs the binding routine\r\n  // with the supplied value formatted.\r\n  set(value) {\r\n    if ((value instanceof Function) && !this.binder.function) {\r\n      value = this.formattedValue(value.call(this.model))\r\n    } else {\r\n      value = this.formattedValue(value)\r\n    }\r\n\r\n    let routineFn = this.binder.routine || this.binder\r\n\r\n    if (routineFn instanceof Function) {\r\n      routineFn.call(this, this.el, value)\r\n    }\r\n  }\r\n\r\n  // Syncs up the view binding with the model.\r\n  sync() {\r\n    if (this.observer) {\r\n      this.model = this.observer.target\r\n      this.set(this.observer.value())\r\n    } else {\r\n      this.set(this.value)\r\n    }\r\n  }\r\n\r\n  // Publishes the value currently set on the input element back to the model.\r\n  publish() {\r\n    if (this.observer) {\r\n      var value = this.formatters.reduceRight((result, declaration, index) => {\r\n        const args = declaration.split(FORMATTER_SPLIT)\r\n        const id = args.shift()\r\n        const formatter = this.view.options.formatters[id]\r\n        const processedArgs = this.parseFormatterArguments(args, index)\r\n\r\n        if (formatter && formatter.publish) {\r\n          result = formatter.publish(result, ...processedArgs)\r\n        }\r\n        return result\r\n      }, this.getValue(this.el))\r\n\r\n      this.observer.setValue(value)\r\n    }\r\n  }\r\n\r\n  // Subscribes to the model for changes at the specified keypath. Bi-directional\r\n  // routines will also listen for changes on the element to propagate them back\r\n  // to the model.\r\n  bind() {\r\n    this.parseTarget()\r\n\r\n    if (this.binder.hasOwnProperty('bind')) {\r\n      this.binder.bind.call(this, this.el)\r\n    }\r\n\r\n    if (this.view.options.preloadData) {\r\n      this.sync()\r\n    }\r\n  }\r\n\r\n  // Unsubscribes from the model and the element.\r\n  unbind() {\r\n    if (this.binder.unbind) {\r\n      this.binder.unbind.call(this, this.el)\r\n    }\r\n\r\n    if (this.observer) {\r\n      this.observer.unobserve()\r\n    }\r\n\r\n    Object.keys(this.formatterObservers).forEach(fi => {\r\n      let args = this.formatterObservers[fi]\r\n\r\n      Object.keys(args).forEach(ai => {\r\n        args[ai].unobserve()\r\n      })\r\n    })\r\n\r\n    this.formatterObservers = {}\r\n  }\r\n\r\n  // Updates the binding's model from what is currently set on the view. Unbinds\r\n  // the old model first and then re-binds with the new model.\r\n  update(models = {}) {\r\n    if (this.observer) {\r\n      this.model = this.observer.target\r\n    }\r\n\r\n    if (this.binder.update) {\r\n      this.binder.update.call(this, models)\r\n    }\r\n  }\r\n\r\n  // Returns elements value\r\n  getValue(el) {\r\n    if (this.binder && this.binder.getValue) {\r\n      return this.binder.getValue.call(this, el)\r\n    } else {\r\n      return getInputValue(el)\r\n    }\r\n  }\r\n}\r\n","// The default `.` adapter that comes with tinybind.js. Allows subscribing to\r\n// properties on plain objects, implemented in ES5 natives using\r\n// `Object.defineProperty`.\r\n\r\nconst ARRAY_METHODS = [\r\n  'push',\r\n  'pop',\r\n  'shift',\r\n  'unshift',\r\n  'sort',\r\n  'reverse',\r\n  'splice'\r\n]\r\n\r\nconst adapter = {\r\n  counter: 0,\r\n  weakmap: {},\r\n\r\n  weakReference: function(obj) {\r\n    if (!obj.hasOwnProperty('__rv')) {\r\n      let id = this.counter++\r\n\r\n      Object.defineProperty(obj, '__rv', {\r\n        value: id\r\n      })\r\n    }\r\n\r\n    if (!this.weakmap[obj.__rv]) {\r\n      this.weakmap[obj.__rv] = {\r\n        callbacks: {}\r\n      }\r\n    }\r\n\r\n    return this.weakmap[obj.__rv]\r\n  },\r\n\r\n  cleanupWeakReference: function(data, refId) {\r\n    if (!Object.keys(data.callbacks).length) {\r\n      if (!(data.pointers && Object.keys(data.pointers).length)) {\r\n        delete this.weakmap[refId]\r\n      }\r\n    }\r\n  },\r\n\r\n  stubFunction: function(obj, fn) {\r\n    const original = obj[fn]\r\n    const data = this.weakReference(obj)\r\n    const weakmap = this.weakmap\r\n\r\n    obj[fn] = (...args) => {\r\n      let response = original.apply(obj, args)\r\n\r\n      Object.keys(data.pointers).forEach(refId => {\r\n        let k = data.pointers[refId]\r\n\r\n        if (weakmap[refId]) {\r\n          if (weakmap[refId].callbacks[k] instanceof Array) {\r\n            weakmap[refId].callbacks[k].forEach(callback => {\r\n              callback.sync()\r\n            })\r\n          }\r\n        }\r\n      })\r\n\r\n      return response\r\n    }\r\n  },\r\n\r\n  observeArray: function(value, refId, keypath) {\r\n    if (value instanceof Array) {\r\n      let data = this.weakReference(value)\r\n\r\n      if (!data.pointers) {\r\n        data.pointers = {}\r\n\r\n        ARRAY_METHODS.forEach(fn => {\r\n          this.stubFunction(value, fn)\r\n        })\r\n      }\r\n\r\n      if (!data.pointers[refId]) {\r\n        data.pointers[refId] = []\r\n      }\r\n\r\n      if (data.pointers[refId].indexOf(keypath) === -1) {\r\n        data.pointers[refId].push(keypath)\r\n      }\r\n    }\r\n  },\r\n\r\n  unobserveArray: function(value, refId, keypath) {\r\n    if ((value instanceof Array) && (value.__rv != null)) {\r\n      let data = this.weakmap[value.__rv]\r\n\r\n      if (data) {\r\n        let pointers = data.pointers[refId]\r\n\r\n        if (pointers) {\r\n          let idx = pointers.indexOf(keypath)\r\n\r\n          if (idx > -1) {\r\n            pointers.splice(idx, 1)\r\n          }\r\n\r\n          if (!pointers.length) {\r\n            delete data.pointers[refId]\r\n          }\r\n\r\n          this.cleanupWeakReference(data, value.__rv)\r\n        }\r\n      }\r\n    }\r\n  },\r\n\r\n  observe: function(obj, keypath, callback) {\r\n    let value    \r\n    const callbacks = this.weakReference(obj).callbacks\r\n\r\n    if (!callbacks[keypath]) {\r\n      callbacks[keypath] = []\r\n      let desc = Object.getOwnPropertyDescriptor(obj, keypath)\r\n\r\n      if (!desc || !(desc.get || desc.set || !desc.configurable)) {\r\n        value = obj[keypath]\r\n\r\n        Object.defineProperty(obj, keypath, {\r\n          enumerable: true,\r\n\r\n          get: () => {\r\n            return value\r\n          },\r\n\r\n          set: newValue => {\r\n            if (newValue !== value) {\r\n              this.unobserveArray(value, obj.__rv, keypath)\r\n              value = newValue\r\n              const data = this.weakmap[obj.__rv]\r\n\r\n              if (data) {\r\n                let callbacks = data.callbacks[keypath]\r\n\r\n                if (callbacks) {\r\n                  callbacks.forEach(cb => {\r\n                      cb.sync()\r\n                  })\r\n                }\r\n\r\n                this.observeArray(newValue, obj.__rv, keypath)\r\n              }\r\n            }\r\n          }\r\n        })\r\n      }\r\n    }\r\n\r\n    if (callbacks[keypath].indexOf(callback) === -1) {\r\n      callbacks[keypath].push(callback)\r\n    }\r\n\r\n    this.observeArray(obj[keypath], obj.__rv, keypath)\r\n  },\r\n\r\n  unobserve: function(obj, keypath, callback) {\r\n    let data = this.weakmap[obj.__rv]\r\n\r\n    if (data) {\r\n      let callbacks = data.callbacks[keypath]\r\n\r\n      if (callbacks) {\r\n        let idx = callbacks.indexOf(callback)\r\n\r\n        if (idx > -1) {\r\n          callbacks.splice(idx, 1)\r\n\r\n          if (!callbacks.length) {\r\n            delete data.callbacks[keypath]\r\n            this.unobserveArray(obj[keypath], obj.__rv, keypath)\r\n          }\r\n        }\r\n\r\n        this.cleanupWeakReference(data, obj.__rv)\r\n      }\r\n    }\r\n  },\r\n\r\n  get: function(obj, keypath) {\r\n    return obj[keypath]\r\n  },\r\n\r\n  set: (obj, keypath, value) => {\r\n    obj[keypath] = value\r\n  }\r\n}\r\n\r\nexport default adapter\r\n","\r\nimport tinybind from './tinybind'\r\n\r\nclass Component extends HTMLElement {\r\n  static get observedAttributes() {\r\n    const template = this.template\r\n    if (!template) {\r\n      throw new Error(`No template declared for ${this.name}`)\r\n    }\r\n\r\n    this.__templateEl = document.createElement('template')\r\n    this.__templateEl.innerHTML = template\r\n    \r\n    const propAttributeMap = this.__propAttributeMap = {}\r\n    const attributes = []\r\n    const properties = this.properties\r\n    if (properties) {\r\n      Object.keys(properties).forEach(propName => {\r\n        const propConfig = properties[propName]\r\n        const attrName = typeof propConfig === 'string' ? propConfig : propName\r\n        propAttributeMap[attrName] = propName\r\n        attributes.push(attrName)\r\n      })\r\n    }    \r\n    return attributes\r\n  }\r\n\r\n  connectedCallback() {\r\n    const nodes = this.constructor.__templateEl.content.cloneNode(true)\r\n    this.__tinybindView = tinybind.bind(nodes, this)    \r\n    while (this.firstChild) {\r\n      this.removeChild(this.firstChild);\r\n    }\r\n    this.appendChild(nodes)\r\n  }\r\n\r\n  disconnectedCallback() {\r\n    this.__tinybindView.unbind()    \r\n  }\r\n\r\n  attributeChangedCallback(name, old, value) {\r\n    if (old !== value) {      \r\n      const propName = this.constructor.__propAttributeMap[name]\r\n      this[propName] = value\r\n    }\r\n  }  \r\n}\r\n\r\nexport default Component","import tinybind from './tinybind'\r\nimport View from './view'\r\nimport {OPTIONS, EXTENSIONS} from './constants'\r\nimport adapter from './adapter'\r\nimport binders from './binders'\r\nimport formatters from './formatters'\r\nimport Observer from './observer'\r\nimport Component from './component'\r\n\r\n// Returns the public interface.\r\n\r\ntinybind.binders = binders\r\ntinybind.formatters = formatters\r\ntinybind.adapters['.'] = adapter\r\ntinybind.Component = Component\r\n\r\n// Binds some data to a template / element. Returns a tinybind.View instance.\r\ntinybind.bind = (el, models, options) => {\r\n  let viewOptions = {}\r\n  models = models || {}\r\n  options = options || {}\r\n\r\n  EXTENSIONS.forEach(extensionType => {\r\n    viewOptions[extensionType] = Object.create(null)\r\n\r\n    if (options[extensionType]) {\r\n      Object.keys(options[extensionType]).forEach(key => {\r\n        viewOptions[extensionType][key] = options[extensionType][key]\r\n      })\r\n    }\r\n\r\n    Object.keys(tinybind[extensionType]).forEach(key => {\r\n      if (!viewOptions[extensionType][key]) {\r\n        viewOptions[extensionType][key] = tinybind[extensionType][key]\r\n      }\r\n    })\r\n  })\r\n\r\n  OPTIONS.forEach(option => {\r\n    let value = options[option]\r\n    viewOptions[option] = value != null ? value : tinybind[option]\r\n  })\r\n\r\n  viewOptions.starBinders = Object.keys(viewOptions.binders).filter(function (key) {\r\n    return key.indexOf('*') > 0\r\n  })\r\n\r\n  Observer.updateOptions(viewOptions)\r\n\r\n  let view = new View(el, models, viewOptions)\r\n  view.bind()\r\n  return view\r\n}\r\n\r\nexport default tinybind\r\n","const formatters = {\r\n  watch: function(value) {\r\n    return value;\r\n  },\r\n\r\n  not: function(value) {\r\n    return !value;\r\n  },\r\n\r\n  negate: function(value) {\r\n    return !value;\r\n  }\r\n}\r\n\r\nexport default formatters",";\n\n","(function(caller,bus){if(typeof exports===\"object\"&&typeof module===\"object\"){module.exports=bus()}else if(typeof exports===\"object\"){exports.EventBus=bus()}else{caller.EventBus=bus()}})(this,function(){var EventBus=function(){this.listeners={};this.registerListener=function(event,callback,number){var type=event.constructor.name;number=this.validateNumber(number||\"any\");if(type!==\"Array\"){event=[event]}event.forEach(function(e){if(e.constructor.name!==\"String\"){throw new Error(\"Only `String` and array of `String` are accepted for the event names!\")}that.listeners[e]=that.listeners[e]||[];that.listeners[e].push({callback:callback,number:number})})};this.validateNumber=function(n){var type=n.constructor.name;if(type===\"Number\"){return n}else if(type===\"String\"&&n.toLowerCase()===\"any\"){return\"any\"}throw new Error(\"Only `Number` and `any` are accepted in the number of possible executions!\")};this.toBeRemoved=function(info){var number=info.number;info.execution=info.execution||0;info.execution++;if(number===\"any\"||info.execution<number){return false}return true};var that=this;return{on:function(eventName,callback){that.registerListener.bind(that)(eventName,callback,\"any\")},once:function(eventName,callback){that.registerListener.bind(that)(eventName,callback,1)},exactly:function(number,eventName,callback){that.registerListener.bind(that)(eventName,callback,number)},die:function(eventName){delete that.listeners[eventName]},off:function(eventName){this.die(eventName)},detach:function(eventName,callback){for(var k in that.listeners[eventName]){if(that.listeners[eventName].hasOwnProperty(k)&&(that.listeners[eventName][k].callback===callback||callback===undefined)){that.listeners[eventName].splice(k,1)}}},detachAll:function(){for(var eventName in that.listeners){if(that.listeners.hasOwnProperty(eventName)){this.detach(eventName)}}},emit:function(eventName,context){var listeners=that.listeners[eventName]||[];var parentArgs=arguments;context=context||this;listeners.forEach(function(info,index){var callback=info.callback;var number=info.number;if(context){callback=callback.bind(context)}var args=[];Object.keys(parentArgs).map(function(i){if(i>1){args.push(parentArgs[i])}});if(that.toBeRemoved(info)){that.listeners[eventName].splice(index,1)}callback.apply(null,args)})}}};return EventBus});"]}